MyBatis 是一个优秀的持久层框架,它消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,简单的 Java 对象)映射成数据库中的记录。
本文将为你提供一个实战教程和案例解析,帮助你轻松掌握 MyBatis。
MyBatis 简介
什么是 MyBatis?
MyBatis 是一个半自动化的持久层框架。它将 SQL 映射成 Java 对象,并提供了强大的数据持久层操作能力。
MyBatis 的优势
- 简化开发:减少手动编写 SQL 和 JDBC 代码,提高开发效率。
- 灵活配置:可以通过 XML 或注解来配置 SQL 映射,方便维护和扩展。
- 支持定制化:允许自定义 SQL 映射,满足复杂查询需求。
- 易于集成:与 Spring 等框架集成,简化项目结构。
MyBatis 实战教程
环境搭建
- 添加依赖:在你的项目中添加 MyBatis 依赖,例如 Maven。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
- 配置数据库:设置数据库连接信息,包括 URL、用户名、密码等。
创建 Mapper 接口
public interface UserMapper {
User getUserById(Integer id);
}
编写 Mapper XML
在 src/main/resources 目录下创建 UserMapper.xml 文件,配置 SQL 映射。
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserById" resultType="com.example.entity.User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
配置 MyBatis
在 src/main/resources 目录下创建 mybatis-config.xml 文件,配置 MyBatis。
<?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.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
使用 MyBatis
在 Java 代码中,你可以通过 SqlSessionFactoryBuilder 来创建 SqlSessionFactory,然后通过 SqlSessionFactory 创建 SqlSession,最后通过 SqlSession 执行 SQL 映射。
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(new FileInputStream("src/main/resources/mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("com.example.mapper.UserMapper.getUserById", 1);
sqlSession.close();
案例解析
以下是一个简单的案例,展示如何使用 MyBatis 进行分页查询。
创建分页插件
在 src/main/java/com/example/plugin/PaginationInterceptor.java 文件中,创建一个分页插件。
public class PaginationInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 获取 SQL 映射
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[2];
// 获取 SQL
String sql = mappedStatement.getBoundSql().getSql();
// 添加分页 SQL
sql = sql + " LIMIT #{offset}, #{limit}";
// 替换原 SQL
BoundSql newBoundSql = mappedStatement.getBoundSql().clone(new BoundSql(mappedStatement.getConfiguration(), sql, mappedStatement.getParameterObject(), mappedStatement.getSqlSource().getBoundSql(mappedStatement.getParameterObject())));
invocation.getArgs()[2] = mappedStatement;
invocation.getArgs()[3] = newBoundSql;
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.plugin.PaginationInterceptor"/>
</plugins>
使用分页插件
在 SQL 映射中,添加分页参数。
<select id="selectUsersByPage" resultType="com.example.entity.User">
SELECT * FROM users LIMIT #{offset}, #{limit}
</select>
Java 代码中使用分页插件
int offset = 0;
int limit = 10;
Map<String, Object> parameters = new HashMap<>();
parameters.put("offset", offset);
parameters.put("limit", limit);
List<User> users = sqlSession.selectList("com.example.mapper.UserMapper.selectUsersByPage", parameters);
通过以上教程和案例解析,相信你已经对 MyBatis 有了一定的了解。希望这些内容能够帮助你轻松掌握 MyBatis,并在实际项目中发挥其优势。
