Appearance
使用 MyBatis 原生功能
我们使用 MyBatis-Flex 作为 MyBatis 的增强框架进行代码开发,并不会影响原有的 MyBatis 的任何功能。
使用 @Select
等 MyBatis 原生注解
MyBatis 提供了 @Insert
、@Delete
、@Update
、@Select
4 个注解,用于对 Mapper 的方法进行配置,用于原生编写原生 SQL 进行增删改查, 在 MyBatis-Flex 我们一样可以使用这些注解。例如:
java
public interface MyAccountMapper extends BaseMapper<Account> {
@Select("select * from tb_account where id = #{id}")
Account selectById(@Param("id") Object id);
}
@Insert
、@Delete
、@Update
等注解也是一样的,也就是说,原有的 MyBatis 功能如何使用,在 MyBatis-Flex 就如何使用。
@InsertProvider
、@DeleteProvider
、@UpdateProvider
、@SelectProvider
等还是和原生 MyBatis 一样的用法。
使用 xml 的方式
在开始使用 xml 之前,我们需要添加如下配置,告知 mybatis 的 xml 存放路径。
yaml
mybatis-flex:
mapper-locations:
- classpath*:/mapper/*.xml
配置完成后,我们就可以编写自己的 xml 和 mapper 代码了,如下所示:
mapper:
java
public interface MyAccountMapper extends BaseMapper<Account> {
Account selectByName(@Param("name") String name);
}
xml:
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.test.mapper.MyAccountMapper">
<!-- selectByName -->
<select id="selectByName" resultType="com.test.model.Account">
select * from `tb_account` where `user_name` = #{name}
</select>
</mapper>
XML 分页^ v1.5.5
XML 分页是 MyBatis-Flex 在 v1.5.5 开始提供的一个 XML 分页解决方案,方便用户在使用 XML 时,对数据进行分页查询。
示例代码如下:
java
QueryWrapper qw = QueryWrapper.create()
.where(Account::getAge).eq(18)
.and(Account::getId).ge(0);
Page<Account> accountPage = accountMapper
.xmlPaginate("selectByName", Page.of(1, 10), qw);
参数
selectByName
指的是在 XML 里定义的 select 节点的 id 的名称。selectByName
也可以全写为:com.mybatisflex.test.mapper.AccountMapper.selectByName
。此时,需要也在 XML 里定义名称为
selectByName_COUNT
的 select 节点,用于查询数据总量。
XML 代码如下:
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.test.mapper.AccountMapper">
<!-- selectByName -->
<select id="selectByName" resultType="com.mybatisflex.test.model.Account">
select * from `tb_account` ${qwSql} limit ${pageOffset}, ${pageSize}
</select>
<select id="selectByName_COUNT" resultType="long">
select count(*) from `tb_account` ${qwSql}
</select>
</mapper>
其执行的 SQL 如下:
sql
-- 查询数据量
select count(*) from `tb_account` WHERE `age` = 18 AND `id` >= 0
-- 查询数据
select * from `tb_account` WHERE `age` = 18 AND `id` >= 0 limit 0, 10
XML 参数解释:
- ${qwSql}: 传入的 QueryWrapper 生成的 where 部分的 SQL,带有 "
where
" 关键字 - ${pageOffset}: sql offset 的值
- ${pageSize}: 需要查询的数据量
- ${pageNumber}: 当前的页码
- ${dbType}: 当前用户配置的数据库类型,用户切换数据源也有可能造成数据库类型发生变化。我们可以通过不同的 dbType 来编写不同的 SQL,以适配不同的数据库类型。
其他自定义参数:
java
QueryWrapper qw = QueryWrapper.create()
.where(Account::getAge).eq(18)
.and(Account::getId).ge(0);
//设置其他参数
Map<String,Object> otherParams = new HashMap<>();
otherParams.put("otherName", "michael");
Page<Account> accountPage = accountMapper
.xmlPaginate("selectByName", Page.of(1, 10), qw, otherParams);
此时,我们在 XML 中可以直接使用自定义的参数,例如:
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.test.mapper.AccountMapper">
<!-- selectByName -->
<select id="selectByName" resultType="com.mybatisflex.test.model.Account">
select * from `tb_account` ${qwSql}
and user_name = #{otherName}
limit ${pageOffset}, ${pageSize}
</select>
<select id="selectByName_COUNT" resultType="long">
select count(*) from `tb_account` ${qwSql}
and user_name = #{otherName}
</select>
</mapper>