MyBatis 的前身是 Apache 的开源项目 iBatis。MyBatis 几乎可以代替 JDBC,是一个支持普通 SQL 查询,存储过程和高级映射的基于 Java 的优秀持久层框架。
MyBatis 与 JDBC 相比,减少了 50% 以上的代码量。并且满足高并发和高响应的要求,所以它成为最流行的 Java 互联网持久框架。
Mybatis框架工作原理:
(1).读取 MyBatis 配置文件:MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。
(2)加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件中加载。MyBatis 配置文件可以加载多个映射文件,每个文件对应数据库中的一张表。
(3)构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。
创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。
(5)Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
(6)MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。
(7)输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。
(8)输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。
使用 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>
<!-- 实体类地址 别名-->
<package name="cn.pojo"/>
</typeAliases>
<!-- 配置数据源,事务 -->
<environments default="deploy">
<environment id="deploy">
<!-- 事务:JDBC/MANAGED-自己管理去 -->
<transactionManager type="JDBC" />
<!-- 数据源:POOLED/UNPOOLED/JNDI -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/smbms" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- mapper.xml文件地址
cn/mapper/NewsCategoryMapper.xml-->
<mapper resource="cn/mapper/SmbmsUserMapper.xml" />
</mappers>
</configuration>
我们描述一下 MyBatis 的基础配置文件:
元素定义了一个别名 user,它代表着 com.mybatis.po.User 这个类。这样定义后,在 MyBatis 上下文中就可以使用别名去代替全限定名了。
元素的定义,这里描述的是数据库。它里面的 元素是配置事务管理器,这里采用的是 MyBatis 的 JDBC 管理器方式。
元素配置数据库,其中属性 type=“POOLED” 代表采用 MyBatis 内部提供的连接池方式,最后定义一些关于 JDBC 的属性信息。
元素代表引入的那些映射器,在谈到映射器时会详细讨论它。
有了基础配置文件,就可以用一段很简短的代码来生成 SqlSessionFactory 了,如下所示。
public static SqlSession getSqlSession() {
SqlSession sqlSession = null;
try {
InputStream inStream = Resources
.getResourceAsStream("sqlMapConfig.xml"); //读取sqlMapConfig.xml文件
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inStream); // 创建sqlSessionFactory工厂
sqlSession = sqlSessionFactory.openSession();//获得sqlSession
inStream.close(); //关资源
} catch (IOException e) {
e.printStackTrace();
}
return sqlSession;
}
public static void closeSqlSession(SqlSession sqlSession) {
sqlSession.close();
}
创建一个表的实体类和对该表进行操作的接口
package cn.pojo;
import java.util.Date;
public class SmbmsRole {
private Long id;
private String rolecode;
private String rolename;
private Long createdby;
private Date creationdate;
private Long modifyby;
private Date modifydate;
public SmbmsRole() {
super();
}
public SmbmsRole(Long id, String rolecode, String rolename, Long createdby,
Date creationdate, Long modifyby, Date modifydate) {
super();
this.id = id;
this.rolecode = rolecode;
this.rolename = rolename;
this.createdby = createdby;
this.creationdate = creationdate;
this.modifyby = modifyby;
this.modifydate = modifydate;
}
.................实体类中的set get方法
public interface SmbmsRoleMapper {
public List<SmbmsRole> queryAll();
}
创建一个Mapper.XML文件
<mapper namespace="cn.mapper.SmbmsRoleMapper" >
<select id="queryAll" resultType="SmbmsRole">
select * from smbms_role
</select>
</mapper>
创建接口实现类
public class SmbmsRoleMapperImpl implements SmbmsRoleMapper {
@Override
public List<SmbmsRole> queryAll() {
SqlSession sqlSession= MyBatisUtil.getSqlSession();
List<SmbmsUser> lists = sqlSession.getMapper(SmbmsRoleMapper.class).queryAll();
MyBatisUtil.closeSqlSession(sqlSession);
return lists;
}
测试代码
public static void main(String[] args) {
SmbmsRoleMapper sum = new SmbmsRoleMapperImpl();
List<SmbmsRole> lists = sum.queryAll();
for (SmbmsRole smbmsRole : lists) {
System.out.println(smbmsRole.getRolename());
}
}
```