MyBatis Plus应用实践总结

【1】MyBatis Plus中的嵌套查询

很多时候我们可能需要构造一个嵌套查询,如WHERE (name = ? AND ( (id = ? OR type = ?) ))。外层是and(or)连接,嵌套一个or(and)查询。MyBatis Plus同样对此提供了支持,在Nested接口中我们可以看到具体使用方法。

① Nested接口源码

public interface Nested extends Serializable {
//jdk1.8中支持了default方法,如下是and嵌套
    default Children and(Consumer consumer) {
        return this.and(true, consumer);
    }
//带条件的and嵌套
    Children and(boolean condition, Consumer consumer);
//or嵌套
    default Children or(Consumer consumer) {
        return this.or(true, consumer);
    }
//带条件的or嵌套
    Children or(boolean condition, Consumer consumer);
//不带and or的普通嵌套
    default Children nested(Consumer consumer) {
        return this.nested(true, consumer);
    }
//不带条件的不带and or的普通嵌套
    Children nested(boolean condition, Consumer consumer);
}

那么如何使用呢?这里建议有lambda表达式基础。关于lambda表达式可以参考博文jdk1.8新特性lambda应用。

② 嵌套应用实例

如我们要达到的SQL效果为:WHERE (name = ? AND ( (id = ? OR type = ?) ))

第一种写法

这种写法比较麻烦,相当于实现了一个匿名类。

QueryWrapper queryWrapper=new QueryWrapper<>();
queryWrapper.eq("name","jane");
queryWrapper.and(new Consumer>() {
    @Override
    public void accept(QueryWrapper sysUserQueryWrapper) {
        sysUserQueryWrapper.eq("id",1).or().eq("type",0);
    }
});

第二种写法使用lambda表达式

QueryWrapper queryWrapper=new QueryWrapper<>();
queryWrapper.eq("name","jane");
queryWrapper.and(e-> e.eq("id",1).or().eq("type",0));

这种确实很简洁了。

【2】UpdateWrapper

更新时候使用。

① update(Wrapper updateWrapper)

这里以eq…set为例说明,eq作为更新条件,set为字段赋值。实例代码如下:

UpdateWrapper updateWrapper=new UpdateWrapper();
updateWrapper.eq("order_id",1).set("state",1);
orderItemService.update(updateWrapper);

SQL如下:

UPDATE yihuiyuan.tb_sys_order_item SET state=? WHERE (order_id = ?) 

② update(T entity, Wrapper updateWrapper)

前面entity都被封装为set属性,后面的updateWrapper则如①一样被正常解析。

实例代码如下:

UpdateWrapper updateWrapper=new UpdateWrapper();
updateWrapper.eq("order_id",1).set("state",1);
SysOrderItem sysOrderItem=new SysOrderItem();
sysOrderItem.setNumber(10);
orderItemService.update(sysOrderItem,updateWrapper);

SQL如下:

UPDATE tb_sys_order_item SET number=?, state=? WHERE (order_id = ?) 

这里需要注意的是如果entity里面有字段和updateWrapper中set字段一样,则会出现重复,这时SQL执行效果为以后面的state为主:

UpdateWrapper updateWrapper=new UpdateWrapper();
updateWrapper.eq("order_id",1).set("state",1);
SysOrderItem sysOrderItem=new SysOrderItem();
sysOrderItem.setNumber(10);
//如下也设置state属性
sysOrderItem.setState(10);
orderItemService.update(sysOrderItem,updateWrapper);

SQL如下:

UPDATE tb_sys_order_item SET number=?, state=?, state=? WHERE (order_id = ?) 

你可能感兴趣的:(#,MyBatis,Plus,MyBatis,Plus)