引言
MyBatis 是一个优秀的持久层框架,它消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。本文将为你提供一份MyBatis实战攻略,从入门到进阶,再到高效应用。
一、MyBatis入门
1.1 MyBatis简介
MyBatis 遵循约定大于配置的原则,通过XML或注解的方式配置SQL映射,将接口和Java对象映射成数据库中的记录。它具有以下特点:
- 简化数据库操作
- 提高开发效率
- 易于维护和扩展
1.2 环境搭建
- 添加依赖
在项目的pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
- 配置数据库
在application.properties或application.yml文件中配置数据库连接信息。
# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- 创建Mapper接口
创建一个Mapper接口,定义需要执行的SQL语句。
public interface UserMapper {
User getUserById(Integer id);
}
- 创建Mapper XML
创建一个Mapper XML文件,配置SQL映射。
<?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">
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserById" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
- 配置SqlSessionFactory
创建一个SqlSessionFactory实例,用于创建SqlSession。
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- 执行查询
使用SqlSession执行查询。
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user);
}
二、MyBatis进阶
2.1 动态SQL
MyBatis 提供了动态SQL功能,可以方便地实现条件查询、分页查询等。
- if标签
<select id="getUserByCondition" resultType="com.example.entity.User">
SELECT * FROM user
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null">
AND name = #{name}
</if>
</where>
</select>
- choose、when、otherwise标签
<select id="getUserByCondition" resultType="com.example.entity.User">
SELECT * FROM user
<where>
<choose>
<when test="id != null">
id = #{id}
</when>
<when test="name != null">
name = #{name}
</when>
<otherwise>
1 = 1
</otherwise>
</choose>
</where>
</select>
2.2 缓存
MyBatis 提供了两种缓存机制:一级缓存和二级缓存。
- 一级缓存
一级缓存是SqlSession级别的缓存,默认开启。当执行查询操作时,MyBatis 会将查询结果缓存到一级缓存中。当同一个SqlSession再次查询相同的数据时,会直接从一级缓存中获取数据。
- 二级缓存
二级缓存是Mapper级别的缓存,需要手动开启。当执行查询操作时,MyBatis 会将查询结果缓存到二级缓存中。当同一个Mapper再次查询相同的数据时,会直接从二级缓存中获取数据。
2.3 批处理
MyBatis 支持批处理操作,可以批量插入、批量更新、批量删除数据。
try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
UserMapper mapper = session.getMapper(UserMapper.class);
for (int i = 0; i < 1000; i++) {
User user = new User();
user.setName("user" + i);
user.setPassword("password" + i);
mapper.insertUser(user);
}
session.commit();
}
三、MyBatis高效应用
3.1 优化SQL语句
- 使用索引
在数据库中为经常查询的字段创建索引,可以提高查询效率。
- 避免全表扫描
尽量避免使用SELECT *查询,只查询需要的字段。
- 使用合适的SQL语句
根据实际情况选择合适的SQL语句,例如使用IN语句代替多个OR语句。
3.2 优化MyBatis配置
- 配置合理的缓存策略
根据实际情况配置一级缓存和二级缓存。
- 配置合理的SQL语句执行方式
根据实际情况配置SQL语句的执行方式,例如使用REUSE或BATCH。
- 使用合适的插件
MyBatis 提供了多种插件,可以用于优化性能、监控等。
结语
MyBatis 是一个功能强大的持久层框架,通过本文的介绍,相信你已经对MyBatis有了更深入的了解。在实际开发中,合理运用MyBatis,可以提高开发效率,降低代码复杂度。希望本文能帮助你更好地掌握MyBatis,并将其应用到实际项目中。
