目录
一、什么是MyBatis?
MyBatis是一个半自动的ORM框架,其本质是对JDBC的封装。使用MyBatis不需要写JDBC代码,但需要程序员编写SQL语句。之前是apache的一个开源项目iBatis,2010年改名为MyBatis。
二、入门案例环境搭建(1-9步骤)
1.先创建一个空项目
2.在空项目下创建一个Maven类型的Module模块
3.在pom.xml中编写依赖
4.在resource目录下创建SqlMapConfig.xml来连接数据库
5.在resource目录下创建log4j.properties日志文件
6.在java目录下创建com.itbaizhan.pojo包,并创建User实体类
7.创建持久层接口和映射文件
7.1.在java目录下的com.itbaizhan包中创建mapper映射包,并创建UserMapper持久层接口
(在持久层接口中写需要实现的功能的方法名)
public interface UserMapper {
// 查询所有数据方法
List<User> findAll();
}
7.2.在resource目录下创建映射文件,注意要与持久层接口的包名相同:com.itbaizhan.mapper.UserMapper.xml
(在映射文件中写Sql语句)
<?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">
<!--映射文件要和持久层接口名称相同;如:UserMapper对应UserMapper.xml-->
<!--映射文件要和持久层接口的目录结构相同:如com.itbaizhan.mapper.Usermapper.xml-->
<!--映射文件中namespace属性要写持久层接口的全名(包名+接口名)如:com.itbaizhan.mapper.UserMapper-->
<!--映射文件中标签的id属性是持久层接口方法中要具体实现的那一个方法名;如findAll-->
<!--映射文件中标签的resultType属性(结果类型)是接口方法的返回值类型,如果是集合+泛型的,
返回值类型是泛型的全类名,如List<User>,返回类型是User类的全类名(包名+类名)-->
<!--映射文件中标签的parameterType属性是接口方法中参数的类型,不是方法名的返回类型-->
<!--映射文件中resultType、parameterType属性要写全类名,如果是集合类型,则写其泛型的全类名-->
<mapper namespace="com.itbaizhan.mapper.UserMapper">
<!--查询所有-->
<select id="findAll" resultType="com.itbaizhan.pojo.User">
select * from User
</select>
</mapper>
8.在SqlMapConfig.xml中注册映射文件
<!-- 注册映射文件 -->
<mappers>
<mapper resource="com/itbaizhan/mapper/UserMapper.xml"></mapper>
</mappers>
9.在test.java包中创建测试类TestUserMapper类,对方法进行测试
三、Mybatis核心对象及工作流程
//测试findAll()方法,两种方式操作数据库
public class TestUserMapper {
@Test
//第一种方法:通过获取代理对象Mapper操作数据库
public void testFindAll() throws IOException {
// (1)读取核心配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
// (2) 创建SqlSessionFactoryBuild对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// (3)SqlSessionFactoryBuilder对象获取SqlSessionFactory对象
SqlSessionFactory factory = builder.build(is);
// (4)SqlSessionFactory对象获取SqlSession对象
SqlSession session = factory.openSession();
// (5)SqlSession对象获取代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
// (6)代理对象执行方法
List<User> all = userMapper.findAll();
all.forEach(System.out::println);
// (7)释放资源
session.close();
is.close();
}
@Test
//第二种方法:通过SqlSession对象直接操作数据库
public void testFindAll2() throws IOException {
// (1)读取核心配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
// (2) 创建SqlSessionFactoryBuild对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// (3)SqlSessionFactoryBuilder对象获取SqlSessionFactory对象
SqlSessionFactory factory = builder.build(is);
// (4)SqlSessionFactory对象获取SqlSession对象
SqlSession session = factory.openSession();
// (5)SqlSession直接操作数据库
// 这种方法比较少用,因为要填入全类名(持久层全类名+方法名),名字比较长,容易出错!
List<User> users = session.selectList("com.itbaizhan.mapper.UserMapper.findAll");
users.forEach(System.out::println);
// (6)释放资源
session.close();
is.close();
}
}
1.Mybatis核心对象
(1)SqlSessionFactoryBuilder:SqlSessionFactoryBuilder意思是SqlSession工厂构建者对象,它使用构造者模式创建SqlSession工厂对象。
(2)SqlSessionFactory:SqlSessionFactory意思是SqlSession工厂,使用工厂模式创建SqlSession对象。
(3)SqlSession:SqlSession对象可以操作数据库,也可以使用动态代理模式创建持久层接口的代理对象操作数据库。
(4)Mapper:Mapper是持久层接口的代理对象,他具体实现了持久层接口,用来操作数据库。
2.Mybatis工作流程
(1)创建SqlSessionFactoryBuilder对象
(2)SqlSessionFactoryBuilder对象构造了SqlSessionFactory对象:构造者模式
(3)SqlSessionFactory对象生产了SqlSession对象:工厂模式
(4)SqlSession对象创建了持久层接口的代理对象:动态代理模式
(5)代理对象操作数据库