目录
什么是MyBatis?
JDBC大家应该都学过吧?JDBC就是java定义的一个规范,可以实现java使用相同的方法操作不同的数据库,不再需要切换驱动
而学习JDBC的时候大家有没有学习过ORM映射呢?
所谓的ORM映射就是“对象关系映射”,可将查询到的数据封装为一个对象,并将对象方法到容器中,使得容器如同一张表,容器中存放的对象相当于表中的一行数据
而当我们使用JDBC查询多条数据时,就需要遵循ORM"对象关系映射"思想,但是ORM对象关系映射并不难,但是如果每次查询的时候都要映射编写那就会感觉很麻烦,所以MyBatis就是用来解决这个问题的
MyBatis是一个半自动的ORM框架,其本质是对JDBC的封装。使用MyBatis不需要写JDBC代码,但需要程序员编写SQL语句。之前是apache的一个开源项目iBatis,2010年改名为MyBatis。
MyBatis的核心对象
SqlSessionFactoryBuilder对象
SqlSession工厂构建者对象,使用构造者模式创建SqlSession工厂对象。
SqlSessionFactory对象
SqlSession工厂,使用工厂模式创建SqlSession对象。
SqlSession对象
该对象可以操作数据库,也可以使用动态代理模式创建持久层接口的代理对象操作数据库。
Mapper对象
持久层接口的代理对象,他具体实现了持久层接口,用来操作数据库。
MyBatis的工作流程
- 创建SqlSessionFactoryBuilder对象
- SqlSessionFactoryBuilder对象构造SqlSessionFactory对象:构造者模式
- SqlSessionFactory对象生产了SqlSession对象:生产者模式
- SqlSession对象创建持久层接口代理对象:动态代理模式
- 代理对象操作数据库
SqlSession操作数据库代码的编写顺序
- 通过Resource.getResourceAsStream("SqlMapConfig.xml");读取核心配置文件
- 创建SqlSessionFactoryBuilder对象
- 通过SqlSessionFactoryBuilder对象的build(is)方法并传递SqlConfig.xml核心配置文件创建SqlSessionFactory对象:构造者模式
- 通过SqlSessionFactory对象的openSession()方法创建SqlSession对象:工厂模式
- 通过SqlSession对象的getMapper(代理对象.class)方法并传递代理对象的class对象获取代理对象
- 最后调用代理对象的方法操作数据库
注意:如果是增删改操作,那么需要在添加一步:事务提交。因为MyBatis默认是手动提交事务的
入门案例:
在数据库中新建一张表为user表,该案例将会对此表进行查询操作
环境搭建:
1、创建maven工程,引入依赖
<dependencies>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
2、创建mybatis核心配置文件SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置环境 -->
<environments default="mysql">
<environment id="mysql">
<!-- 事务类型 -->
<transaction Managertype="JDBC"></transactionManager>
<!-- 数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
3、将log4j.properties文件放入resources中,让控制台打印SQL语句。(这个只是记录日志的,加不加都没所谓)
4、创建User实体类(建议该实体类的属性名对应数据库表的列名,不然不太好记)
public class User {
private int id;
private String username;
private String sex;
private String address;
public User(int id, String username, String sex, String address) {
this.id = id;
this.username = username;
this.sex = sex;
this.address = address;
}
public User(String username, String sex, String address) {
this.username = username;
this.sex = sex;
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
public User() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
创建持久层接口和映射文件步骤
1、在java目录创建持久层接口
2、在resource目录创建映射文件
3、将映射文件配置到mybatis核心配置文件中
创建持久层接口和映射文件
//1. 在java目录创建持久层接口
public interface UserMapper{
//当使用MyBatis调用该方法时,
//MyBatis会自动根据sql语句查询并封装为User对象放到该容器中
List<User>findAll();
}
2. 在resource目录创建映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace ="com.itbaizhan.mapper.UserMapper">
<select id="findAll" resultType="com.itbaizhan.pojo.User">
select * from user
</select>
</mapper>
3. 将映射文件配置到mybatis核心配置文件中(SqlMapConfig.xml)
<!-- 注册映射文件 -->
<mappers>
<mapper resource="com/itbaizhan/mapper/UserMapper.xml"> </mapper>
</mappers>
重点:映射文件注意事项
1、映射文件要和接口名称相同。
2、映射文件要和接口的目录结构相同。
3、映射文件中namespace属性要写接口的全名。
4、映射文件中标签的id属性是接口方法的方法名。
5、映射文件中标签的resultType属性是接口方法的返回值类型。
6、映射文件中标签的parameterType属性是接口方法的参数类型。
7、映射文件中resultType、parameterType属性要写全类名,如果是集合类型则写其泛型的全类名。
测试持久层接口方法
public class TestUserMapper {
@Test
public void testFindAll() throws IOException {
//读取核心配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//SqlSessionFactoryBuilder对象获取SqlSessionFactory对象
SqlSessionFactory factory = builder.build(is);
//SqlSessionFactory对象获取SqlSession对象
SqlSession sqlSession = factory.openSession();
//SqlSession对象获取代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//代理对象执行方法
List<User> list = userMapper.findAll();
for (User user:list) {
System.out.println(user);
}
//释放资源
sqlSession.close();
is.close();
}
}
总结:
MyBatis是一个半自动的框架,他可以帮助我们完成ORM操作
主要要记忆的就是SqlSession操作数据库代码编写顺序:
1、创建SqlSessionFactoryBuilder对象
2、SqlSessionFactoryBuilder对象构造SqlSessionFactory对象:构造者模式
3、SqlSessionFactory对象生产SqlSession对象:工厂模式
4、SqlSession对象创建持久层接口的代理对象:动态代理模式
5、代理对象操作数据库