MyBatis是怎么执行的,他遇到了哪些东西
第一步 读取MyBatis的配置文件
加载MyBatis的主配置,包含了全局配置、数据库的配置以及扫描mapper.xml文件
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">
<!--配置事务的类型,使用本地事务策略-->
<transactionManager type="JDBC"></transactionManager>
<!--是否使用连接池 POOLED表示使用链接池,UNPOOLED表示不使用连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/demo"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
第二步 生成InputStream输入流,通过输入流创建SqlSessionFactory对象
java
//加载主配置文件,目的:构建SqlSessionFactory对象
InputStream inputStream= Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//创建SqlSession对象(用SqlSessionFactory工厂对象)
SqlSession sqlSession=sqlSessionFactory.openSession();
//通过sqlSession创建UserMapper接口的代理对象
UserDao userMapper=sqlSession.getMapper(UserDao.class);
在这一步,会生成无数的sqlSession对象,其实用的时候只用了其中一个sqlSession,然后执行的时候就用这一个sqlSession来执行
展开一个sqlSession对象
对象就是一块内存空间,这里面又包含两个重要的东西:Exectuor执行器和Cache缓存
这个cache是一级缓存/本地缓存,它是sqlSession级别的缓存,这个缓存默认是开启的;二级缓存是SqlSessionFactory级别的
Exectuor执行器:本身是个对象,他内部封装的还是JDBC
这里面的UserDao只是用来代理的
然后就可以调用写好的方法
java
//调用查询方法
List<User> users=userMapper.findAll();
for(User user:users){
System.out.println(user);
}
最后要释放资源
java
//释放资源
sqlSession.close();
inputStream.close();