MyBatis 是一款优秀的持久层框架,它消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。MyBatis 通过简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
一、MyBatis 简介
1.1 持久层框架的概念
持久层框架主要解决的是数据访问层的问题,它是应用程序中负责数据持久化的部分,包括数据的增删改查等操作。在传统的开发模式中,我们通常需要编写大量的 JDBC 代码来实现这些功能,而持久层框架则可以帮助我们简化这些操作。
1.2 MyBatis 的优势
- 简化数据库操作:通过映射文件或注解,将 SQL 语句与 Java 代码分离,降低代码复杂度。
- 高效的执行:MyBatis 能够优化 SQL 语句的执行,提高数据库访问效率。
- 易于扩展:MyBatis 支持自定义插件,方便进行功能扩展。
二、MyBatis 快速入门
2.1 环境搭建
- 添加 MyBatis 依赖:在项目的
pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
- 配置 MyBatis:在项目的
resources目录下创建mybatis-config.xml文件,配置数据源、事务管理器等。
2.2 定义 Mapper 接口
在项目中创建一个 Mapper 接口,用于定义数据库操作的方法。
public interface UserMapper {
User getUserById(int id);
int addUser(User user);
int updateUser(User user);
int deleteUser(int id);
}
2.3 编写 Mapper 映射文件
在 resources 目录下创建对应的 Mapper 映射文件,定义 SQL 语句和结果映射。
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserById" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="addUser" parameterType="com.example.entity.User">
INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>
<update id="updateUser" parameterType="com.example.entity.User">
UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
<delete id="deleteUser" parameterType="int">
DELETE FROM user WHERE id = #{id}
</delete>
</mapper>
2.4 使用 MyBatis
在业务代码中,通过 SqlSessionFactory 获取 SqlSession,然后使用 Mapper 接口进行数据库操作。
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);
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserById(1);
System.out.println(user.getName());
User newUser = new User();
newUser.setName("张三");
newUser.setAge(20);
int result = userMapper.addUser(newUser);
System.out.println("添加用户成功:" + result);
user.setName("李四");
result = userMapper.updateUser(user);
System.out.println("更新用户成功:" + result);
result = userMapper.deleteUser(1);
System.out.println("删除用户成功:" + result);
} finally {
sqlSession.close();
}
}
}
三、MyBatis 实战
3.1 分页查询
MyBatis 提供了分页查询的功能,我们可以通过 <select> 标签中的 limit 属性实现分页。
<select id="getUserListByPage" resultType="com.example.entity.User">
SELECT * FROM user LIMIT #{offset}, #{limit}
</select>
在业务代码中,我们可以根据当前页码和每页显示的记录数来计算 offset 和 limit 的值。
int pageSize = 10;
int pageNum = 1;
int offset = (pageNum - 1) * pageSize;
int limit = pageSize;
List<User> userList = sqlSession.selectList("com.example.mapper.UserMapper.getUserListByPage", new HashMap<String, Object>() {{
put("offset", offset);
put("limit", limit);
}});
3.2 批量操作
MyBatis 支持批量插入、批量更新和批量删除操作,通过 <insert>、<update> 和 <delete> 标签中的 foreach 属性实现。
<insert id="addUsers" parameterType="java.util.List">
INSERT INTO user (name, age) VALUES
<foreach collection="list" item="user" separator=",">
(#{user.name}, #{user.age})
</foreach>
</insert>
在业务代码中,我们可以将多个用户对象封装成一个 List,然后调用 Mapper 接口的方法进行批量操作。
List<User> userList = new ArrayList<>();
userList.add(new User("张三", 20));
userList.add(new User("李四", 21));
int result = userMapper.addUsers(userList);
System.out.println("批量添加用户成功:" + result);
四、总结
MyBatis 是一款优秀的持久层框架,它能够帮助我们简化数据库操作,提高开发效率。通过本文的学习,相信你已经掌握了 MyBatis 的基本使用方法和实战技巧。在实际项目中,MyBatis 可以与 Spring、Hibernate 等框架结合使用,发挥更大的作用。继续探索 MyBatis 的更多功能,相信你会收获更多。
