MyBatis 是一个优秀的持久层框架,它消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
MyBatis 简介
MyBatis 遵循约定优于配置的原则,使得其使用起来非常简单。它支持自定义 SQL、存储过程以及高级映射。MyBatis 的核心是 SQL 映射文件,通过 XML 文件定义 SQL 语句和参数,然后将 SQL 语句映射到 Java 接口的方法上。
入门篇
1. 环境搭建
首先,需要下载 MyBatis 以及相应的数据库驱动。在 Maven 项目中,可以在 pom.xml 文件中添加以下依赖:
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
</dependencies>
2. 配置文件
创建 mybatis-config.xml 文件,配置数据库连接信息、事务管理器等:
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/your_database"/>
<property name="username" value="your_username"/>
<property name="password" value="your_password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
3. 创建实体类和接口
创建实体类 User 和接口 UserMapper:
public class User {
private Integer id;
private String name;
private Integer age;
// 省略 getter 和 setter
}
public interface UserMapper {
User getUserById(Integer id);
}
4. 创建映射文件
创建 UserMapper.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="User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
5. 使用 MyBatis
在 Java 代码中,通过 SqlSessionFactory 和 SqlSession 使用 MyBatis:
public class Main {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user.getName());
}
}
}
进阶篇
1. 动态 SQL
MyBatis 支持动态 SQL,可以通过 <if>、<choose>、<when>、<otherwise> 等标签实现条件判断、选择等操作。
<select id="getUserByCondition" resultType="User">
SELECT * FROM user
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null">
AND name = #{name}
</if>
</where>
</select>
2. 关联查询
MyBatis 支持关联查询,通过 <resultMap> 标签定义实体类属性与数据库字段之间的关系。
<resultMap id="userResultMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<association property="address" javaType="Address">
<id property="id" column="address_id"/>
<result property="city" column="city"/>
<result property="street" column="street"/>
</association>
</resultMap>
3. 缓存机制
MyBatis 提供了两种缓存机制:一级缓存和二级缓存。一级缓存是 SqlSession 级别的缓存,二级缓存是 Mapper 级别的缓存。
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
精通篇
1. 插件机制
MyBatis 提供了插件机制,允许开发者自定义插件来拦截 SQL 执行过程。
public class MyInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 拦截 SQL 执行过程
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
// 设置插件配置
}
}
在 mybatis-config.xml 文件中配置插件:
<plugins>
<plugin interceptor="com.example.interceptor.MyInterceptor"/>
</plugins>
2. 高级映射
MyBatis 支持多种高级映射,如集合映射、嵌套映射、构造函数映射等。
<resultMap id="userResultMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<collection property="addresses" ofType="Address">
<id property="id" column="address_id"/>
<result property="city" column="city"/>
<result property="street" column="street"/>
</collection>
</resultMap>
总结
MyBatis 是一个功能强大、灵活的持久层框架,通过本文的介绍,相信你已经对 MyBatis 有了一定的了解。在实际项目中,可以根据需求选择合适的配置和映射方式,提高开发效率。希望本文能帮助你从入门到精通 MyBatis,学会高效 ORM 操作。
