Mybatis框架简介
大约 3 分钟
What's Mybatis?
相关信息
Mybatis 是一种 ORM(Object Relational Mapping)框架,用于数据持久化,是对 JDBC 的封装,免除了设置参数和获取结果集的工作,支持自定义 SQL、存储过程以及高级映射。
使用 XML 或注解来配置 SQL 和映射原始类型。
Why is Mybatis?
Mybatis 封装了 JDBC 中大量重复的操作,优化了 SQL 语句强嵌入,使用数据库连接池代替直连,自动处理结果集。
工作流程

依赖
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
主配置文件
<?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>
<!-- 导入外部配置文件,jdbc 的配置文件 -->
<properties resource="jdbc.properties"/>
<!-- 允许 mybatis 插入 null,mybatis 会自动将 null 转换为空字符串 -->
<settings>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<!-- 给实体类起别名,方便在映射文件中使用,别名只能在标签中使用 -->
<typeAliases>
<typeAlias type="com.java.pojo.User" alias="user"/>
<typeAlias type="com.java.pojo.Dept" alias="dept"/>
<typeAlias type="com.java.pojo.Emp" alias="emp"/>
<typeAlias type="com.java.util.FenYeUtil" alias="fy"/>
<typeAlias type="com.java.pojo.Query" alias="query"/>
</typeAliases>
<!-- 配置数据库连接池生产环境 -->
<environments default="development">
<environment id="development">
<!-- 使用JDBC的事务管理方式 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 使用 mybatis 自己的连接池 -->
<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>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="com/java/dao/UserMapper.xml"/>
<mapper resource="com/java/dao/DeptMapper.xml"/>
<mapper resource="com/java/dao/EmpMapper.xml"/>
</mappers>
</configuration>
数据库连接信息
在 resource 目录下新建 jdbc.properties 配置文件。
jdbc.username=username
jdbc.password=password
<!-- MySQL -->
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/database
<!-- oracle 数据库 -->
jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:sid
<!-- PostgreSql -->
jdbc.driver=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost/database
使用方式
单独使用 Mybatis 框架时的使用案例:
声明用于产生数据库连接的单例工具类
public class MyBatisUtil {
private SqlSessionFactory sb;
private static MyBatisUtil mu = new MyBatisUtil();
private MyBatisUtil(){
InputStream is = this.getClass().getClassLoader().getResourceAsStream("mybatis.xml");
sb = new SqlSessionFactoryBuilder().build(is);
}
public static MyBatisUtil init(){
return mu;
}
public SqlSession getSqlSession(){
return sb.openSession();
}
}
获取连接执行SQL
public class EmpServiceImpl implements EmpService {
@Override
public int deleteEmpByEmpNo(String[] empNos) {
// 获得一个数据库连接
SqlSession ss = MybatisUtil.init().getSqlSession();
//使用 getMapper() 方法为 EmpDao 生成实现类
EmpDao ed = ss.getMapper(EmpDao.class);
if (empNos != null) {
for (String empNo : empNos) {
ed.deleteEmpByEmpNo(new Integer(empNo));
}
}
// Mybatis 默认为手动提交
ss.commit();
// 关闭数据库连接
ss.close();
return 1;
}
@Override
public List<Emp> queryAllManager() {
SqlSession ss = MybatisUtil.init().getSqlSession();
EmpDao ed = ss.getMapper(EmpDao.class);
List<Emp> emps = ed.queryAllManager();
ss.close();
return emps;
}
@Override
public int insertEmp(Emp emp) {
SqlSession ss = MybatisUtil.init().getSqlSession();
EmpDao ed = ss.getMapper(EmpDao.class);
int flag = ed.insertEmp(emp);
ss.commit();
ss.close();
return flag;
}
@Override
public Emp queryEmpByEmpNo(int empNo) {
SqlSession ss = MybatisUtil.init().getSqlSession();
EmpDao ed = ss.getMapper(EmpDao.class);
Emp emp = ed.queryEmpByEmpNo(empNo);
ss.close();
return emp;
}
@Override
public int updateEmpByEmpNo(Emp emp) {
SqlSession ss = MybatisUtil.init().getSqlSession();
EmpDao ed = ss.getMapper(EmpDao.class);
int flag = ed.updateEmpByEmpNo(emp);
ss.commit();
ss.close();
return flag;
}
@Override
public List<Emp> queryByFy(FenYeUtil fy, String pg, Query query) {
SqlSession ss = MybatisUtil.init().getSqlSession();
EmpDao ed = ss.getMapper(EmpDao.class);
//查询符合条件的记录总数
fy.setRowsCount(ed.queryEmpCountByQuery(query));
int pgnum = 1;
if (pg != null && !"".equals(pg)){
pgnum = new Integer(pg);
}
if (pgnum < 1) {
pgnum = 1;
}
if (pgnum > fy.getRowsCount()){
pgnum = fy.getPagesCount();
}
fy.setPg(pgnum);
fy.setQuery(query);
List<Emp> emps = ed.queryByFy(fy);
ss.close();
return emps;
}
@Override
public int queryEmpCountByQuery(Query query) {
SqlSession ss = MybatisUtil.init().getSqlSession();
EmpDao ed = ss.getMapper(EmpDao.class);
int num = ed.queryEmpCountByQuery(query);
ss.close();
return num;
}
}