我上一篇文章写了集成,这里说下使用。
先看下官方提供了很多方法:
这里通过的CRUD满足不了时,条件构造器就派上用场了。主要提供了实体包装器,用于处理 sql 拼接,排序,实体参数查询等!
这里需要注意:使用的是数据库字段,不是Java属性!,原来使用另一款通用mapper
时记得使用的是JAVA属性。
Sql拼接条件:
@RunWith(SpringRunner.class)
//SpringBootTest 是springboot 用于测试的注解,可指定启动类或者测试环境等,这里直接默认。
@SpringBootTest
@Slf4j
public class ConditionTest {
@Autowired
IUserService userService;
@Test
public void testOne() {
User user = new User();
user.setCode("101");
user.setName("张三");
user.insert();
EntityWrapper<User> qryWrapper = new EntityWrapper<>();
qryWrapper.eq(User.CODE, user.getCode());
qryWrapper.eq(User.NAME, user.getName());
//也可以直接
// qryWrapper.setEntity(user);
//打印sql语句
System.out.println(qryWrapper.getSqlSegment());
//设置select 字段 即:select code,name from
qryWrapper.setSqlSelect(User.CODE,User.NAME);
System.out.println(qryWrapper.getSqlSelect());
//查询
User qryUser = userService.selectOne(qryWrapper);
System.out.println(qryUser);
log.info("拼接一结束");
}
@Test
public void testTwo() {
User user = new User();
user.setCode("102");
user.setName("李四");
user.insert();
EntityWrapper<User> qryWrapper = new EntityWrapper<>();
qryWrapper.where("code = {0}", user.getCode())
.and("name = {0}",user.getName())
.andNew("status = 0");
System.out.println(qryWrapper.getSqlSegment());
//等等很复杂的。
//复杂的建议直接写在xml里面了,要是非动态的话 比较xml一眼看得懂呀
//查询
User qryUser = userService.selectOne(qryWrapper);
System.out.println(qryUser);
log.info("拼接二结束");
}
}
com.baomidou.mybatisplus.mapper.Wrapper<T>
类还有很多的方法,大家可以试试。
条件参数说明:
查询方式 | 说明 |
---|---|
setSqlSelect | 设置 SELECT 查询字段 |
where | WHERE 语句,拼接 + WHERE 条件 |
and | AND 语句,拼接 + AND 字段=值 |
andNew | AND 语句,拼接 + AND (字段=值) |
or | OR 语句,拼接 + OR 字段=值 |
orNew | OR 语句,拼接 + OR (字段=值) |
eq | 等于= |
allEq | 基于 map 内容等于= |
ne | 不等于<> |
gt | 大于> |
ge | 大于等于>= |
lt | 小于< |
le | 小于等于<= |
like | 模糊查询 LIKE |
notLike | 模糊查询 NOT LIKE |
in | IN 查询 |
notIn | NOT IN 查询 |
isNull | NULL 值查询 |
isNotNull | IS NOT NULL |
groupBy | 分组 GROUP BY |
having | HAVING 关键词 |
orderBy | 排序 ORDER BY |
orderAsc | ASC 排序 ORDER BY |
orderDesc | DESC 排序 ORDER BY |
exists | EXISTS 条件语句 |
notExists | NOT EXISTS 条件语句 |
between | BETWEEN 条件语句 |
notBetween | NOT BETWEEN 条件语句 |
addFilter | 自由拼接 SQL |
last | 拼接在最后,例如:last("LIMIT 1") |
自定义SQL使用条件构造器:
UserDao.java
加入接口方法:
/**
*
* @param rowBounds 分页对象 直接传入page即可
* @param wrapper 条件构造器
* @return
*/
List<User> selectUserWrapper(RowBounds rowBounds, @Param("ew") Wrapper<User> wrapper);
UserMapper.xml
加入对应的xml节点:
<!-- 条件构造器形式 -->
<select id="selectUserWrapper" resultType="user">
SELECT
<include refid="Base_Column_List" />
FROM USER
<where>
${ew.sqlSegment}
</where>
</select>
测试类:
@Test
public void testCustomSql() {
User user = new User();
user.setCode("703");
user.setName("okong-condition");
user.insert();
EntityWrapper<User> qryWrapper = new EntityWrapper<>();
qryWrapper.eq(User.CODE, user.getCode());
Page<User> pageUser = new Page<>();
pageUser.setCurrent(1);
pageUser.setSize(10);
List<User> userlist = userDao.selectUserWrapper(pageUser, qryWrapper);
System.out.println(userlist.get(0));
log.info("自定义sql结束");
}
xml形式使用wrapper
UserDao.java
/**
*
* @param rowBounds 分页对象 直接传入page即可
* @param wrapper 条件构造器
* @return
*/
List<User> selectUserWrapper(RowBounds rowBounds, @Param("ew") Wrapper<User> wrapper);
对应的UserMapper.xml
:
<!-- 条件构造器形式 -->
<select id="selectUserWrapper" resultType="user">
SELECT
<include refid="Base_Column_List" />
FROM USER
<where>
${ew.sqlSegment}
</where>
</select>
自定义SQL语句
在一些需要多表关联时,条件构造器和通用CURD都无法满足时,还可以自行手写sql语句进行扩展。注意:这都是
mybatis
的用法。
以下两种方式都是改造UserDao
接口。
注解形式
@Select("SELECT * FROM USER WHERE CODE = #{userCode}")
List<User> selectUserCustomParamsByAnno(@Param("userCode")String userCode);
xml形式
List<User> selectUserCustomParamsByXml(@Param("userCode")String userCode);
同时,UserMapper.xml
新增一个节点:
<!-- 由于设置了别名:typeAliasesPackage=cn.lqdev.learning.mybatisplus.samples.biz.entity,所以resultType可以不写全路径了。 -->
<select id="selectUserCustomParamsByXml" resultType="user">
SELECT
<include refid="Base_Column_List"/>
FROM USER
WHERE CODE = #{userCode}
</select>
测试类CustomSqlTest.java
:
@RunWith(SpringRunner.class)
//SpringBootTest 是springboot 用于测试的注解,可指定启动类或者测试环境等,这里直接默认。
@SpringBootTest
@Slf4j
public class CustomSqlTest {
@Autowired
UserDao userDao;
@Test
public void testCustomAnno() {
User user = new User();
user.setCode("101");
user.setName("张三");
user.insert();
List<User> userlist = userDao.selectUserCustomParamsByAnno(user.getCode());
//由于新增的 肯定不为null 故不判断了。
System.out.println(userlist.get(0).toString());
log.info("注解形式结束------");
}
@Test
public void testCustomXml() {
User user = new User();
user.setCode("102");
user.setName("李四");
user.insert();
List<User> userlist = userDao.selectUserCustomParamsByXml(user.getCode());
//由于新增的 肯定不为null 故不判断了。
System.out.println(userlist.get(0).toString());
log.info("xml形式结束------");
}
}