Mybatis核心文件概述
- MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
- 配置文档的顶层结构如下:
这里是引用
MyBatis常用配置解析
-
environments标签:数据库环境的配置,支持多环境配置
<!--环境配置--> <environments default="development"> <!--使用MySQL环境--> <environment id="development"> <!--使用JDBC类型事务管理器--> <transactionManager type="JDBC"></transactionManager> <!--使用连接池--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments>
- 事务管理器(transactionManager)类型有两种:
- JDBC:这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
- MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。
- 数据源(dataSource)常用类型有三种:
- UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。
- POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。
- JNDI :这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用
- 事务管理器(transactionManager)类型有两种:
-
properties标签:通常将数据源的配置信息单独抽取成一个properties文件,该标签可以加载额外配置的properties:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql:///数据库名 jdbc.username=用户名 jdbc.password=密码
-
typeAliases标签:使用typeAliases标签可以为使用别名。
<!--设置别名--> <typeAliases> <!--方式一:给单个实体起别名--> <!-- <typeAlias type="com.code.entity.User" alias="user"></typeAlias>--> <!--方式二:批量起别名 别名就是类名,且不区分大小写--> <package name="com.code.entity"/> </typeAliases>
-
mappers标签:该标签的作用是加载映射的,加载方式有如下几种:
1. 使用相对于类路径的资源引用,例如:
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>
2. 使用完全限定资源定位符(URL),例如:
<mapper url="file:///var/mappers/userMapper.xml"/>
Mybatis核心配置文件常用配置
-
properties标签:该标签可以加载外部的properties文件
<properties resource="jdbc.properties"></properties>
-
typeAliases标签:设置类型别名
<typeAlias type="com.lagou.domain.User" alias="user"></typeAlias>
-
mappers标签:加载映射配置
<mapper resource="com/lagou/mapper/UserMapping.xml"></mapper>
-
environments标签:数据源环境配置
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
MybatisAPI概述
SqlSession工厂构建器SqlSessionFactoryBuilder
-
常用API:SqlSessionFactory build(InputStream inputStream),通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象
// 加载核心配置文件 InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); // 获取SqlSessionFactory工厂对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); // 获取SqlSession会话对象 SqlSession sqlSession = sqlSessionFactory.openSession();
-
Resources 工具类,这个类在 org.apache.ibatis.io 包中。Resources 类可以从类路径下、文件系统或一个 web URL 中加载资源文件。
SqlSession工厂对象SqlSessionFactory
- SqlSessionFactory 有多个个方法创建SqlSession 实例。常用的有如下两个:
方法 | 描述 |
---|---|
openSession() | 会默认开启一个事务,但是事务不会自动提交,需要手动提交该事务,提交后,数据操作才会持久化到数据库中 |
openSession(boolean autoCommit) | 参数为是否自动提交,如果设置为true,那么不需要手动提交事务 |
SqlSession会话对象
-
SqlSession 实例在 MyBatis 中是非常强大的一个类。在这里可以看到所有执行语句、提交或回滚事务和获取映射器实例的方法。
-
执行语句的方法主要有:
<T> T selectOne(String statement, Object parameter) <E> List<E> selectList(String statement, Object parameter) int insert(String statement, Object parameter) int update(String statement, Object parameter) int delete(String statement, Object parameter)
-
操作事务的方法主要有:
void commit() void rollback()
Mybatis的dao层开发
传统开发方式
-
UserMapper接口
public interface UserMapper { // 查询所有用户信息 public List<User> findAll() throws Exception; }
-
UserMapper.xml
<?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="UserMapper"> <!--查询所有--> <select id="findAll" resultType="user"> select * from user </select> </mapper>
-
UserMapper实现
public class UserMapperImpl implements UserMapper { @Override public List<User> findAll() throws Exception { // 加载配置文件 InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml"); // 获取SqlSessionFactory工厂对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); // 获取SqlSe会话对象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 执行sql List<User> list = sqlSession.selectList("UserMapper.findAll"); // 释放资源 sqlSession.close(); return list; } }
代理开发方式:
-
采用 Mybatis 的基于接口代理方式实现 持久层 的开发
-
基于接口代理方式只需要编写 Mapper 接口,Mybatis 框架会为我们动态生成实现类的对象。
-
基于接口代理方式要求遵循一定的规范:
- Mapper.xml映射文件中的namespace与mapper接口的全限定名相同
- Mapper接口方法名和Mapper.xml映射文件中定义的每个statement的id相同
- Mapper接口方法的输入参数类型和mapper.xml映射文件中定义的每个sql的parameterType的类型相同
- Mapper接口方法的输出参数类型和mapper.xml映射文件中定义的每个sql的resultType的类型相同
-
Mapper 接口开发方法只需要编写Mapper 接口(相当于Dao 接口),由Mybatis 框架根据接口
定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
UserMapper接口
public interface UserMapper {
public List<User> findAll() throws Exception;
}
UserMapper.xml
<?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.code.mapper.UserMapper">
<!--查询所有-->
<select id="findAll" resultType="user">
select * from user
</select>
</mapper>
测试类
@Test
public void testFindAll() throws Exception {
// 加载核心配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
// 获得SqlSessionFactory工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 获得SqlSession会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 获得Mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 执行查询
List<User> list = userMapper.findAll();
for (User user : list) {
System.out.println(user);
}
// 释放资源
sqlSession.close();
}
Mybatis基于接口代理方式的内部执行原理
- 持久层现在只有一个接口,而接口是不实际干活的,通过Mybatis通过追踪源码可知,我们使用的mapper实际上是一个代理对象,是由MapperProxy代理产生的。
- 追踪MapperProxy的invoke方法会发现,其最终调用了mapperMethod.execute(sqlSession, args)
- 进入execute方法会发现,最终工作的还是sqlSession