栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis快速入门(简明浅析易懂)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis快速入门(简明浅析易懂)

一、MyBatis简介

MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。

MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。

MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.

JDBC -> dbutils(自动封装) -> MyBatis -> Hibernate

mybatis是将sql写在xml中,然后去访问数据库。

二、MyBatis快速入门

2.1.新建java项目

  添加mybatis和mysql的驱动jar:mybatis-3.1.1.jar,mysql-connector-java-5.1.7-bin.jar

2.2.新建表

create database mybatis;
use mybatis;
create table users(id int primary key auto_increment, name varchar(20), age int);
insert into users (name,age) values('Tom',12);
insert into users (name, age) values('Jack',11);

2.3.添加mybatis的配置文件conf.xml

















2.4.定义表对应的实体类

public class User {
private int id;
private String name;
private int age;
//get,set方法
}

2.5.定义操作users表的sql映射文件userMapper.xml





select * from users where id=#{id}

2.6.在conf.xml文件中注册userMapper.xml文件



2.7.编写测试代码:执行定义的select语句

public class Test {
public static void main(String[] args) throws IOException {
String resource = "conf.xml";
//加载mybatis的配置文件(它也加载关联的映射文件)
Reader reader = Resources.getResourceAsReader(resource);
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建能执行映射文件中sql的sqlSession
SqlSession session = sessionFactory.openSession();
//映射sql的标识字符串
String statement = "com.atguigu.mybatis.bean.userMapper"+".selectUser";
//执行查询返回一个唯一user对象的sql
User user = session.selectOne(statement, 1);
System.out.println(user);
}
}

三、操作users表的CRUD

3.1.xml的实现

3.1.1.定义sql映射xml文件:


insert into users(name, age) values(#{name}, #{age});


delete from users where id=#{id}


update users set name=#{name},age=#{age} where id=#{id}


select * from users

3.1.2.在config.xml中注册这个映射文件

3.1.3.在dao中调用

public User getUserById(int id) {
SqlSession session = sessionFactory.openSession();
User user = session.selectOne(URI+".selectUser", id);
return user;
}

3.2.注解的实现

3.2.1.定义sql映射的接口

public interface UserMapper {
@Insert("insert into users(name, age) values(#{name}, #{age})")
public int insertUser(User user);
@Delete("delete from users where id=#{id}")
public int deleteUserById(int id);
@Update("update users set name=#{name},age=#{age} where id=#{id}")
public int updateUser(User user);
@Select("select * from users where id=#{id}")
public User getUserById(int id);
@Select("select * from users")
public List getAllUser();
}

3.2.2.在config中注册这个映射接口

3.2.3.在dao中调用

public User getUserById(int id) {
SqlSession session = sessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.getUserById(id);
return user;
}

四、几个可以优化的地方

4.1.连接数据库的配置可以单独放在一个properties文件中。

## db.properties

4.2.为实体类定义别名,简化sql映射xml文件中的引用



4.3.可以在src下加入log4j的配置文件,打印日志信息

1. 添加jar:

log4j-1.2.16.jar

2.1. log4j.properties(方式一)

log4j.properties,
log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

2.2. log4j.xml(方式二)



















五、解决字段名与实体类属性名不相同的冲突

5.1.准备表和字段

CREATE TABLE orders(
order_id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAr(20),
order_price FLOAT
);
INSERT INTO orders(order_no, order_price) VALUES('aaaa', 23);
INSERT INTO orders(order_no, order_price) VALUES('bbbb', 33);
INSERT INTO orders(order_no, order_price) VALUES('cccc', 22);

5.2.定义实体类

public class Order {
private int id;
private String orderNo;
private float price;
}

5.3.实现getOrderById(id)的查询:

方式一: 通过在sql语句中定义别名


select order_id id, order_no orderNo,order_price price from orders where order_id=#{id}

方式二: 通过


SELECT t_id id, t_name name FROM teacher WHERe t_id=#{id}


SELECT t_id id, t_name name FROM teacher WHERe t_id=#{id}


select * from d_user where age>=#{minAge} and age<=#{maxAge}
and name like #{name}

7.6.UserTest(测试)

public class UserTest {
public static void main(String[] args) throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sessionFactory.openSession();
String statement = "com.atguigu.day03_mybatis.test6.userMapper.getUser";
List list = sqlSession.selectList(statement, new ConditionUser("%a%", 1, 12));
System.out.println(list);
}
}

MyBatis中可用的动态SQL标签

八、调用存储过程

8.1.提出需求

查询得到男性或女性的数量, 如果传入的是0就女性否则是男性

8.2.准备数据库表和存储过程:

create table p_user( 
id int primary key auto_increment, 
name varchar(10),
sex char(2)
);
insert into p_user(name,sex) values('A',"男"); 
insert into p_user(name,sex) values('B',"女"); 
insert into p_user(name,sex) values('C',"男"); 
#创建存储过程(查询得到男性或女性的数量, 如果传入的是0就女性否则是男性)
DELIMITER $
CREATE PROCEDURE mybatis.ges_user_count(IN sex_id INT, OUT user_count INT)
BEGIN 
IF sex_id=0 THEN
SELECT COUNT(*) FROM mybatis.p_user WHERe p_user.sex='女' INTO user_count;
ELSE
SELECt COUNT(*) FROM mybatis.p_user WHERe p_user.sex='男' INTO user_count;
END IF;
END
$
#调用存储过程
DELIMITER ;
SET @user_count = 0;
CALL mybatis.ges_user_count(1, @user_count);
SELECt @user_count;

8.3.创建表的实体类

public class User {
private String id;
private String name;
private String sex;
}

8.4.userMapper.xml








8.5.测试

Map paramMap = new HashMap<>();
paramMap.put("sex_id", 0);
session.selectOne(statement, paramMap);
Integer userCount = paramMap.get("user_count");
System.out.println(userCount);

九、MyBatis缓存

9.1.理解mybatis缓存

正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持

1.一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。

2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。

3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被clear。

9.2.mybatis一级缓存

9.2.1.根据任务查询

根据id查询对应的用户记录对象。

9.2.2.准备数据库表和数据

CREATE TABLE c_user(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAr(20),
age INT
);
INSERT INTO c_user(NAME, age) VALUES('Tom', 12);
INSERT INTO c_user(NAME, age) VALUES('Jack', 11);

9.2.3.创建表的实体类

public class User implements Serializable{
private int id;
private String name;
private int age;

9.2.4.userMapper.xml





select *
from s_user
where user_id = #{id}


10.6.spring的配置文件: beans.xml


























10.7.mybatis的配置文件: mybatis-config.xml









10.8.测试

@RunWith(SpringJUnit4ClassRunner.class) //使用Springtest测试框架
@ContextConfiguration("/beans.xml") //加载配置
public class SMTest {
@Autowired //注入
private UserMapper userMapper;
@Test
public void save() {
User user = new User();
user.setBirthday(new Date());
user.setName("marry");
user.setSalary(300);
userMapper.save(user);
System.out.println(user.getId());
}
@Test
public void update() {
User user = userMapper.findById(2);
user.setSalary(2000);
userMapper.update(user);
}
@Test
public void delete() {
userMapper.delete(3);
}
@Test
public void findById() {
User user = userMapper.findById(1);
System.out.println(user);
}
@Test
public void findAll() {
List users = userMapper.findAll();
System.out.println(users);
}
}

以上所述是小编给大家介绍的MyBatis快速入门(简明浅析易懂),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对考高分网网站的支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/148690.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号