MP自带的条件构造器虽然很强大,有时候也避免不了写稍微复杂一点业务的sql,那么那么今天说说MP怎么自定义sql语句吧。另外,除了下文提到的通过queryWrapper实现筛选以外,调用查询时,如果你需要做分页,通过mybatisPlus提供的分页接口IPage,能够避免自己手写分页的sql语句,这么好用的东西,你还不入坑吗?详情点击:Mybatis-plus多表关联查询,多表分页查询
自定义的sql当然是写在XML文件中的啦,那么首先来定义xml文件的位置,在yml配置文件如下
-
mybatis-plus:
-
# 如果是放在src/main/java目录下 classpath:/com/*/*/mapper/*Mapper.xml
-
# 如果是放在resource目录 classpath:/mapper/**.xml
-
mapper-locations: classpath:/mapper/**.xml
使用注解实现:
在我们Mapper接口中定义自定义方法即可。
-
/**
-
* @Date: 2019/6/10 14:40
-
* @Description: User对象持久层
-
*/
-
public
interface UserMapper extends BaseMapper<User> {
-
-
/**
-
*
-
* 如果自定义的方法还希望能够使用MP提供的Wrapper条件构造器,则需要如下写法
-
*
-
* @param userWrapper
-
* @return
-
*/
-
@Select("SELECT * FROM user ${ew.customSqlSegment}")
-
List
selectByMyWrapper(
@Param(Constants.WRAPPER) Wrapper userWrapper);
-
-
/**
-
* 和Mybatis使用方法一致
-
* @param name
-
* @return
-
*/
-
@Select("SELECT * FROM user where name = #{name}")
-
List
selectByName(
@Param("name") String name);
-
-
}
使用xml文件实现:
使用xml一定要指定xml文件所在位置
-
/**
-
* @Date: 2019/6/10 14:40
-
* @Description: User对象持久层
-
*/
-
public
interface UserMapper extends BaseMapper<User> {
-
-
/**
-
*
-
* 如果自定义的方法还希望能够使用MP提供的Wrapper条件构造器,则需要如下写法
-
*
-
* @param userWrapper
-
* @return
-
*/
-
List
selectByMyWrapper(@Param(Constants.WRAPPER) Wrapper userWrapper);
-
-
/**
-
* 和Mybatis使用方法一致
-
* @param name
-
* @return
-
*/
-
List
selectByName(@Param(
"name") String name);
-
-
}
-
xml version="1.0" encoding="UTF-8" ?>
-
-
<mapper namespace="com.example.demo.mapper.UserMapper">
-
-
<select id="selectByName" resultType="com.example.demo.model.User">
-
SELECT * FROM user where name = #{name}
-
select>
-
-
<select id="selectByMyWrapper" resultType="com.example.demo.model.User">
-
SELECT * FROM user ${ew.customSqlSegment}
-
select>
-
-
mapper>
测试测试:
-
/**
-
* 自定义sql查询语句
-
*/
-
@Test
-
public void selectByMySelect() {
-
List
users = userMapper.selectByName(
"王天风");
-
users.
forEach(System.out::println);
-
}
-
-
/**
-
* 自定义sql使用Wrapper
-
*/
-
@Test
-
public void selectByMyWrapper() {
-
QueryWrapper
wrapper =
new QueryWrapper();
-
wrapper.like(
"name",
"雨").lt(
"age",
40);
-
List
users = userMapper.selectByMyWrapper(wrapper);
-
users.
forEach(System.out::println);
-
}
提问一:能否提供自定义Update语句与Wrapper的整合使用呢?
-
/**
-
*
-
* 用户 Mapper 接口
-
*
-
*
-
* @since 2019-06-14
-
*/
-
public
interface UserMapper extends BaseMapper<User> {
-
-
-
/**
-
* 自定Wrapper修改
-
*
-
* @param userWrapper 条件构造器
-
* @param user 修改的对象参数
-
* @return
-
*/
-
-
int updateByMyWrapper(@Param(Constants.WRAPPER) Wrapper
userWrapper, @Param("user") User user) ;
-
-
}
-
xml version="1.0" encoding="UTF-8" ?>
-
-
<mapper namespace="com.example.demo.mapper.UserMapper">
-
-
<update id="updateByMyWrapper">
-
UPDATE user SET email = #{user.email} ${ew.customSqlSegment}
-
update>
-
-
mapper>
-
@Test
-
public void updateByMyWrapper() {
-
// 条件构造器
-
QueryWrapper
wrapper =
new QueryWrapper();
-
wrapper.eq(
"name",
"admin");
-
-
// 修改后的对象
-
User user =
new User();
-
user.setEmail(
"[email protected]");
-
-
userMapper.updateByMyWrapper(wrapper, user);
-
-
}