一、持久层的概念
持久层可以将业务数据存储到磁盘,具备长期存储能力,只要磁盘不损坏(大部分的重要数据都会有相关的备份机制),在断电或者其他情况下,重新开启系统仍然可以读取这些数据。
二、MyBatis的特点
- 不屏蔽SQL,意味着可以更为精确地定位SQL语句,可以对其进行优化和改造,这有利于互联网系统性能的提高,符合互联网需要性能优化的特点。
- 提供强大、灵活的应设计中,方便Java开发者使用。提供动态SQL的功能,允许我们提供不同条件组装 SQL 的功能,允许我们提供不同条件组装 SQL ,这个功能与远比其他工具 或者java编码的可读性和可维护性要高的多,满足各种应用系统的同时页满足了需求经常变化的互联网应用的要求。
- 在 MyBatis 中,提供了使用 Mapper 的接口编程,只要一个接口和一个 XML 就能创建映射器,进一步简化我们的工作,使得很多框架API在 MyBatis 中消失,开发者能更集中于业务逻辑。
三、MyBatis的核心组件
- SqlSessionFactoryBuilder(构造器):它会根据配置或者代码来生成 SqlSessionFactory 对象,采用分步构建的Builder模式。
- SqlSessionFactory(工厂接口):依靠它来生成SqlSession,使用的是工厂模式。
- SqlSession(会话):一个既可以发送 SQL 执行返回结果,也可以获取 Mapper 的接口。在现有技术中,一般我们会让其在业务逻辑代码中“消失”,而使用 MyBatis 提供的 SQL Mapper 接口编程技术 ,他能提高代码的可读性和可维护性。
- SQL Mapper (映射器): MyBatis 新设计存在的组件, 它由一个 Java 接口和 XML 文件 构成, 需要给出对应的 SQL 和映射规则。
- 它负责发送SQL去执行,并返回结果。
3.1 SqlSessionFactory(工厂接口)
使用 MyBatis 首先是使用配置或者代码去生成 SQLSessionFactory ,而MyBatis提供了构造器 SqlSessionFactoryBuilder。 它提供了一个类 org.apach.ibatis.session.Configuration 作为引导, 采用Builder模式。
SqlSessionFactory生成的类图
3.1.1 使用 XML 构建 SqlSessionFactory
<?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>
<typeAliases>
<typeAliase alias = "role" type = "com.learn.ssm.chapter3.pojo.Role">
</typeAliases>
<!--环境配置,连接的数据库,这里使用的是MySQL-->
<environments default="mysql">
<environment id="mysql">
<!--指定事务管理的类型,这里简单使用Java的JDBC的提交和回滚设置-->
<transactionManager type="JDBC"></transactionManager>
<!--dataSource 指连接源配置,POOLED是JDBC连接对象的数据源连接池的实现-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybbs"</property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</dataSource>
</environment>
</environments>
<mappers>
<!--这是告诉Mybatis区哪找持久化类的映射文件,对于在src下的文件直接写文件名,
如果在某包下,则要写明路径,如:com/mybatistest/config/User.xml-->
<mapper resource="User.xml"></mapper>
</mappers>
</configuration>
Mybatis基础配置文件解释
- <TypeAlice> 元素定义了一个别名 role, 它代表着 com.learn.ssm.chapter3.pojo.Role 这个类。这样定义后, 在 Mybatis 上下文中就可以用别名代替全限定名了。
- <environment> 元素的定义, 这里描述的是数据库。 它里面的 <transactionManager> 元素是配置事务管理器, 这里采用的是 MyBatis 的 JDBC 管理器方式。 然后采用 <dataSource> 元素配置数据库, 其中属性 type = “POOLLED” 代表采用 Mybatis 内部提供的连接池方式, 最后定义了一些关于 JDBC 的属性信息。
- <mapper> 元素代表引入的那些映射器,在谈到映射器时会详细讨论它。
构建SqlSessionFactory
SqlSessionFactory sqlSeesionFactory = null;
String resource = "mybatis-config.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().bulid(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
推荐使用XML的方式构建SqlSessionFactory,所以代码方式略。
3.2 SqlSession
在MyBatis中,SqlSession 是其核心接口。在 MyBatis 中有两个实现类,DefaultSqlSession 和 SqlSessionManager。DefaultSqlSession 是单线程使用的, 而 SqlSessionManager 在多线程环境中使用。SqlSession 的作用类似于JDBC 中的 Connection 对象, 代表着一个连接资源的启用。具体而言, 它的作用有3 个:
- 获取Mapper接口。
- 发送SQL给数据库 。
- 控制数据库事务。
创建SqlSession
SqlSession sqlSession = SqlSessionFactory.openSession();
SqlSession事务管理
// 定义 SqlSession
SqlSession sqlSession = null;
try {
// 打开sqlSession 会话
sqlSession = sqlSessionFactory.openSqlSession();
// some code
sqlSession.commit(); // 提交事务
} catch (Exception ex) {
sqlSession.rollback(); // 事务回滚
} finally {
sqlSession.close(); // 关闭SqlSession
}
3.3 映射器
映射器是 MyBatis 中最重要 、最复杂的组件,它是由一个接口和对应的 XMl 文件(或注解) 组成。它可以配置一下内容:
3.3.1 用XML实现映射器
- 描述映射规则。
- 提供SQL语句,并可以配置SQL参数类型、返回类型、缓存刷新等信息。
- 配置缓存。
- 提供动态SQL。
映射器接口
package com.learn.ssm.chapter3.mapper;
public interface RoleMapper {
public Role getRole(Long id);
}
再用 XML 方式创建 SqlSession 的配置文件中有这样一段代码:
<mapper resource = "com/learn/ssm/Chapter3/mapper/RoleMapper.xml">
它的作用是引入一个 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">
<!--客户映射 指定到dao接口 -->
<mapper namespace="com.learn.ssm.chapter3.mappre.RoleMapper">
<!--id与dao接口的方法名一直,指定结果类型,和参数类型 -->
<select id="get" resultType="TCustomer" paramType="string">
SELECT
*
FROM t_customer a
WHERE a.id = #{id}<!--主键 -->
</select>
解释
- <mapper> 元素中的属性 namespace 所对应的是一个接口的全限定名。
- <select> 元素表明这是一条查询语句, 二属性 id 标识了接口中的一个方法。paramType 标识该方法的参数,reslutType 标识了返回值类型。
- 这条Sql 中的 {} 标识了传递进去的参数,里面的id是参数名。
基于注解的方式不推荐,省略。
3.4 发送Sql
3.4.1 SqlSession 发送 SQL
Role role = (Role) sqlSession.selectOne("com.learn.ssm.chapter3.mapper.RoleMapper.getRole",1L);
这个方法写起来很麻烦。而且可读性和可维护性差,一般采用下一种方法(接口式编程)。
3.4.2 用 Mapper 接口发送 SQL
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Role role = roleMapper.getRole(1L);