3.1持久层的概念和MyBatis的特点
MyBatis最成功的3点:
- 不屏蔽SQL
- 可以更为精确地定位SQL语句。可以对齐进行优化和改造,有利于互联网系统性能的提高,符合互联网需要性能优化的特点
- 提供强大、灵活的映射机制,方便java开发使用
- 提供动态SQL的功能,运行我们根据不同条件组装SQL,这个功能远比其他工具或者Java编码的可读性和可维护性高很多,满足各种应用系统的同时也满足了需求经常变化的互联网应用的要求
- 提供使用Mapper的接口编程,只要一个接口和一个XML就能创建映射器,进一步简化工作
3.2准备MyBatis环境
链接
https://github.com/mybatis/mybatis-3/releases
MyBatis工程包及其依赖包
3.3MyBatis核心组件
- SqlSessionFactoryBuilder(构造器)
- 根据配置或者代码来生成SqlSessionFactory,采用的是分布构建的Builder模式
- SqlSessionFactory(工厂接口)
- 生成SqlSession,使用的是工厂模式
- SqlSession(会话)
- 既可以发送SQL这些hi行返回结果,也可以获取Mapper的接口
- 在现有技术中,一般会让其消失,以提高代码的可读性和可维护性
- SQL Mapper(映射器)
- 它由一个Java接口和XML文件(或者注解)组成
- 它由一个Java接口和XML文件(或者注解)组成
3.4 SqlSessionFactory(工厂接口)
使用MyBatis首先使用配置或者代码去生产SqlSessionFactory
MyBatis提供了构造器SqlSEssionFactoryBuilder
- 生成SqlSessionFactory的两种方式:
- 通过读取配置的XML文件(墙裂推荐)
- 通过Java代码
SqlSessionFactory是一个借口,在MaBatis中存在两个实现类
- SqlSessionManager
- DefaultSqlSessionFactory(一般实现方法)
每个基于MyBatis的因公都是以一个SqlSessionFactory的实例为中心的,而SqlSessionFactory唯一的作用就是生产MyBatis的核心接口对象SqlSession,所以其责任唯一
3.4.1 使用XML构建SqlSessionFactory
MyBatis的XML分为两类:
- 基础配置文件,mybatis-config.xml
- 映射文件,配置映射关系,SQL,参数等
mybatis-config.xml描述:
- typeAlias
- 定义别名,例如Bean
- environment
- 元素的东一,可以用来描述数据库
- transactionManager——配置事务管理器
- dataSource——配置数据库
- Mapper——代表引入哪些映射器
有了mybatis-config.xml文件,就可以用一段很简短的代码来生成SqlSessionFactory了
SqlSessionFactory sqlSessionFactory = null;
String resource = 'mybatis-conflg.xml';
InputStream inputStream;
try {
inputStream = resources.getResourceAsStrteam(resource);
SqlSEssionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
以上代码中,首先读取mybatis-config.xml,然后通过SqlSessionFactoryBuilder的Builder方法去创建SqlSessionFactory
3.4.2 使用代码创建SqlSessionFactory
不推荐,略
3.5 SqlSession
SqlSession是核心接口,作用类似于一个JDBC中的Connection对象,代表着一个连接资源的启用,作用有3个:
- 获取Mapper接口
- 发送SQL给数据库
- 控制数据库事务
SqlSession控制数据库事务的方法,代码如下:
//定义sqlSession
SqlSession sqlSession = null;
try {
//打开sqlSession会话
sqlSession = SqlSessionFactory.openSession();
sqlSession.commit(); //提交事务
} catch (Exception ex) {
sqlSession.rollback(); //回滚事务
} finally {
//在finally语句中确保资源被顺利关闭
if (sqlSession != null) {
//不关闭资源,瞬间爆炸
sqlSession.close();
}
}
3.6 映射器
映射器是MyBatis中最重要、最复杂的组件
负责配置以下内容:
- 描述映射规则
- 提供SQL语句,配置SQL参数类型,返回类型,缓存刷新等信息
- 配置缓存
- 提供动态SQL
映射器的主要作用就是将SQL查询到的结果应设为一个(POJO),或者将POJO的数据插入到数据库中,定义一些关于缓存的重要内容
3.6.1 用XML实现映射器
用XML定义映射器分为两部分:接口和XML
XML内容:
- mapper
- namespace对应接口的全限定名
- select
- 表明这是一条查询语句
- id:标识SQL
- parameterType = ‘long’,传递参数为long型
- resultType = ‘role’,返回类型为Role
3.6.2 注解实现映射器
注解和XML方式同时定义时,XML方式将覆盖掉注解方式,推荐使用XML方式
3.6.3 SqlSession发送SQL
Role rle = (Role) sqlSession.selectOne("com.ssm.mapper.RoleMapper.getRole", 1L);
也可以
Role role = (Role) sqlSession.selectOne("getRole", 1L);
3.6.4 用Mapper接口发送SQL
RoleMapper roleMaper = sqlSession.getMapper(RoleMapper.class);
Role role = roleMapper.getRole(1L);
3.6.5 对比两种发送SQL方式
使用Mapper接口变成已成为主流,推荐采用SqlSession获取Mapper的方式
3.7 生命周期
SqlSessionFactoryBuilder
只能存在于创建SqlSessionFactory的方法中,不要让其长期存在
SqlSessionFactory
SqlSessionFactory的生命周期存在于整个Mybatis的应用之中
一般采用单例模式
SqlSesson
存活于一个业务请求中
Mapper
由SqlSession创建,生命周期小于等于SqlSession的生命周期