MyBatis 以其高效灵活的特性成为了众多开发者的首选持久化框架。而其中,使用 xml 方式进行查询与分页操作更是一种常见且强大的技术手段。在今天的博客中,我们将深入探讨 MyBatis 如何通过 xml 实现查询与分页。
我们使用 MyBatis-Flex 作为 MyBatis 的增强框架进行代码开发,并不会影响原有的 MyBatis 的任何功能,所以我再上篇的环境配置基础上进行编辑。
一、项目目录结构
在上篇基础上新增/resources/mapper/AccountMapper.xml
二、创建数据库
CREATE TABLE `tb_account` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`user_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`age` int(0) NULL DEFAULT NULL,
`birthday` datetime(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of tb_account
-- ----------------------------
INSERT INTO `tb_account` VALUES (1, '张三', 18, '2020-01-11 00:00:00');
INSERT INTO `tb_account` VALUES (2, '李四', 19, '2021-03-21 00:00:00');
INSERT INTO `tb_account` VALUES (3, 'ssj', 20, '2024-09-06 19:28:54');
INSERT INTO `tb_account` VALUES (4, '测试', 22, '2024-09-12 19:29:13');
三、MyBatis 原生注解
使用 @Select 等 MyBatis 原生注解
MyBatis 提供了 @Insert 、@Delete 、@Update 、@Select 4 个注解,用于对 Mapper 的方法进行配置,用于原生编写原生 SQL 进行增删改查, 在 MyBatis-Flex 我们一样可以使用这些注解。
具体代码:
public interface AccountMapper extends BaseMapper<Account> {
@Select("select * from tb_account where id = #{id}")
Account selectById(@Param("id") int id);
}
@Insert 、@Delete 、@Update 等注解也是一样的,也就是说,原有的 MyBatis 功能如何使用,在 MyBatis-Flex 就如何使用。
@InsertProvider、@DeleteProvider、@UpdateProvider、@SelectProvider 等还是和原生 MyBatis 一样的用法。
四、使用 xml 的方式查询
在开始使用 xml 之前,我们需要添加如下配置,告知 mybatis 的 xml 存放路径。
具体代码:
mybatis-flex:
mapper-locations:
- classpath*:/mapper/*.xml
配置完成后,我们就可以编写自己的 xml 和 mapper 代码了
mapper
具体代码:
public interface AccountMapper extends BaseMapper<Account> {
@Select("select * from tb_account where id = #{id}")
Account selectById(@Param("id") int id);
Account selectByName(@Param("user_name") String user_name);
}
xml
具体代码:
<?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.mybatisflex.demo.mapper.AccountMapper">
<!-- selectByName -->
<select id="selectByName" resultType="com.mybatisflex.demo.entity.Account">
select * from `tb_account` ${qwSql} limit ${pageOffset}, ${pageSize};
</select>
<select id="selectByName_COUNT" resultType="long">
select count(*) from `tb_account` ${qwSql}
</select>
</mapper>
编写测试语句
具体代码:
@Test
void test1(){
Account a=accountMapper.selectById(4);
System.out.println(a);
}
五、使用 xml 的方式分页
xml
具体代码:
<!-- 分页查询-->
<select id="selectAll" resultType="com.mybatisflex.demo.entity.Account">
select * from `tb_account` ${qwSql} limit ${pageOffset}, ${pageSize}
</select>
测试语句:
XML 参数解释:
${qwSql}: 传入的 QueryWrapper 生成的 where 部分的 SQL,带有 “where” 关键字
${pageOffset}: sql offset 的值
${pageSize}: 需要查询的数据量
${pageNumber}: 当前的页码
${dbType}: 当前用户配置的数据库类型,用户切换数据源也有可能造成数据库类型发生变化。我们可以通过不同的 dbType 来编写不同的 SQL,以适配不同的数据库类型。
具体代码:
class MybatisFlexDemoApplicationTests {
@Autowired
private AccountMapper accountMapper;
@Test
void contextLoads() {
List<Account> accounts = accountMapper.selectAll();
QueryWrapper qw = QueryWrapper.create()
.where(Account::getId).ge(0);
Page<Account> accountPage = accountMapper
.xmlPaginate("selectByName", Page.of(1, 4), qw);
System.out.println(accountPage);
}
}
六、mybatisX插件
可安装mybatisX插件,点击小鸟快速到达接口