MyBatis Basics

软件开发中的框架

  • 框架是可被应用开发者定制的应用骨架
  • 框架是一种规则,保证开发者遵循相同的方式开发程序
  • 不重复造轮子,对基础功能进行封装

框架的优点

  • 提高开发效率
  • 统一的编码规则,利于团队管理
  • 灵活配置的应用,拥有更好的维护性

SSM开发框架

  • Spring
    • 框架的框架
  • SpringMVC
    • 对程序解耦,替代Servlet进行web开发
  • MyBatis
    • 简化数据库交互,对JDBC进行了封装和扩展

什么是MyBatis

  • 持久层框架 DAO
  • 使用XML将SQL与程序解耦,便于维护
    • 当SQL需要改变时,只需要改变XML文件,不需要重新编译
  • 学习简单,执行高效,是JDBC的延伸

MyBatis开发流程

  • 引入MyBatis依赖(使用Maven)
  • 创建核心配置文件
  • 创建实体类(entity, POJO)
  • 创建Mapper映射文件(AutoMapper)
  • 初始化SessionFactory
    • 读取配置文件,加载Mapper映射
  • 利用SqlSession对象操作数据

单元测试与Junit

  • 单元测试是指对软件中的最小可测试单元进行检查和验证
  • 测试用例(test case)是指编写一段代码对已有功能进行校验
  • Junit是Java中最著名的单元测试工具

Junit使用方法

  • 引入Junit JAR或者增加Maven依赖
  • 编写测试用例验证目标方法是否正确运行
  • 在测试用例上增加@Test注解开始单元测试

MyBatis环境配置

  • mybatis-config.xml
  • XML格式配置数据库环境信息
  • 包含数据库驱动,URL,用户名,密码

mybatis-config.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<configuration>
<environments default="dev">
<environment id="dev">
<!-- use JDBC to control DB transaction commit and rollback-->
<transactionManager type="JDBC"></transactionManager>
<!-- use data connection pool to manager DB connections -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/babytun?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="yuan"/>
<property name="password" value="1111"/>
</dataSource>
</environment>
<!-- another env -->
<environment id="prd">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.1.155:3306/babytun?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="yuan"/>
<property name="password" value="1111"/>
</dataSource>
</environment>
</environments>
</configuration>

SqlSessionFactory

  • MyBatis的核心对象
  • 初始化MyBatis,创建SqlSession对象
  • 保证SqlSessionFactory在应用中全局唯一

SqlSession

  • 是MyBatis操作数据库的核心对象
  • 使用JDBC方式与数据库交互,是原有JDBC的扩展
  • 提供了数据表CRUD对应方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public void testSqlSessionFactory() {
try {
// 利用Reader加载classpath下的mybatis配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");

// 初始化SqlSessionFactory对象,同时解析mybatis-config.xml文件
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
System.out.println("SessionFactory loaded");

// 创建SqlSession对象,是JDBC的扩展类,用于与数据库交互
SqlSession sqlSession = sqlSessionFactory.openSession();

try {
// 创建数据库连接,只是用于测试,工程中不需要显示创建连接
Connection connection = sqlSession.getConnection();
System.out.println(connection);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sqlSession != null) {
// 如果在配置文件中type=POOLED,代表使用连接池,close会将连接放回连接池中
// 如果type=UNPOOLED,代表直连,close则会调用Connection.close()方法关闭连接
sqlSession.close();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}

MyBatisUtils初始化工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// MyBatis工具类,利用创建全局唯一的SqlSessionFactory对象
public class MyBatisUtils {
// static变量属于类而不属于对象,以保证全局唯一
private static SqlSessionFactory sqlSessionFactory = null;

// 在类的初始化过程中创建SqlSessionFactory
static {
Reader reader = null;
try {
reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

} catch (IOException e) {
e.printStackTrace();
throw new ExceptionInInitializerError(e);
}
}

// 工具类的方法一般可以标注为static
public static SqlSession openSession() {
return sqlSessionFactory.openSession();
}

public static void closeSession(SqlSession session) {
if (session != null) {
session.close();
}
}
}

MyBatis数据查询

  1. 创建实体类(entity)
  2. 创建Mapper XML
  3. 编写select SQL标签
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="goods">
<select id="selectAll" resultType="entity.Goods">
select * from t_goods order by goods_id desc limit 10;
</select>
</mapper>
  1. 开启驼峰命名映射
1
2
3
4
<settings>
<!-- goods_id => goodsId 命名转换 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
  1. 新增<mapper>
1
2
3
<mappers>
<mapper resource="mappers/goods.xml" />
</mappers>
  1. SqlSession执行sql语句
1
List<Goods> list = session.selectList("goods.selectAll");

SQL传参

  • 使用parameterType=”Integer“
1
2
3
<select id="selectById" parameterType="Integer" resultType="entity.Goods">
select * from t_goods where goods_id = #{value}
</select>

多参数

  • 使用Map数据结构传入多个参数
1
2
3
4
5
<select id="selectByPriceRange" parameterType="java.util.Map" resultType="entity.Goods">
select * from t_goods where current_price between #{min} and #{max}
order by current_price
limit 0, #{limt}
</select>

多表关联查询