mybatis-plus基本操作大全

条件构造器AbstractWrapper(公共父类)

  • QueryWrapper

  • UpdateWrapper

    用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件
    

allEq:all等于

allEq(Map<R, V> params)
allEq(Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, Map<R, V> params, boolean null2IsNull)

//例1: allEq({id:1,name:"老王",age:null})--->id = 1 and name = '老王' and age is null

//例2: allEq({id:1,name:"老王",age:null}, false)--->id = 1 and name = '老王'
    
//个别参数说明:
//params : key为数据库字段名,value为字段值
//null2IsNull : 为true则在map的value为null时调用 isNull 方法,为false时则忽略value为null的

eq:等于

eq(R column, Object val)
eq(boolean condition, R column, Object val)
//eq("name", "老王")--->name = '老王'

ne :不等于<>

ne(R column, Object val)
ne(boolean condition, R column, Object val)
//ne("name", "老王")--->name <> '老王'

ge:大于等于>=

ge(R column, Object val)
ge(boolean condition, R column, Object val)
//ge("age", 18)--->age >= 18

It:小于<

lt(R column, Object val)
lt(boolean condition, R column, Object val)
//lt("age", 18)--->age < 18

Ie:小于等于<=

le(R column, Object val)
le(boolean condition, R column, Object val)
//le("age", 18)--->age <= 18

between:值1 <=xx<= 值2

between(R column, Object val1, Object val2)
between(boolean condition, R column, Object val1, Object val2)
//between("age", 18, 30)--->age between 18 and 30

notBetween:NOT BETWEEN 值1 AND 值2

notBetween(R column, Object val1, Object val2)
notBetween(boolean condition, R column, Object val1, Object val2)
//notBetween("age", 18, 30)--->age not between 18 and 30

like:LIKE '%值%'

like(R column, Object val)
like(boolean condition, R column, Object val)
//like("name", "王")--->name like '%王%'

notLike:NOT LIKE '%值%'

notLike(R column, Object val)
notLike(boolean condition, R column, Object val)
//notLike("name", "王")--->name not like '%王%'

likeLeft:LIKE '%值'

likeLeft(R column, Object val)
likeLeft(boolean condition, R column, Object val)
//likeLeft("name", "王")--->name like '%王'

likeRight:LIKE '值%'

likeRight(R column, Object val)
likeRight(boolean condition, R column, Object val)
//likeRight("name", "王")--->name like '王%'

isNull

isNull(R column)
isNull(boolean condition, R column)
    //isNull("name")--->name is null

isNotNull

isNotNull(R column)
isNotNull(boolean condition, R column)
    //isNotNull("name")--->name is not null

in:字段 IN (value.get(0), value.get(1), ...)

in(R column, Collection<?> value)
in(boolean condition, R column, Collection<?> value)
//用法1:in("age",{1,2,3})--->age in (1,2,3)
//用法2:in("age", 1, 2, 3)--->age in (1,2,3)推荐

notIn:字段 NOT IN (value.get(0), value.get(1), ...)

notIn(R column, Collection<?> value)
notIn(boolean condition, R column, Collection<?> value)

//用法1:notIn("age",{1,2,3})--->age not in (1,2,3)
//用法2:notIn("age", 1, 2, 3)--->age not in (1,2,3)

inSql:字段 IN ( sql语句 )

inSql(R column, String inValue)
inSql(boolean condition, R column, String inValue)

//用法1:inSql("age", "1,2,3,4,5,6")--->age in (1,2,3,4,5,6)
//用法2:inSql("id", "select id from table where id < 3")--->id in (select id from table where id < 3)

notInSql:字段 NOT IN ( sql语句 )

notInSql(R column, String inValue)
notInSql(boolean condition, R column, String inValue)

//用法1:notInSql("age", "1,2,3,4,5,6")--->age not in (1,2,3,4,5,6)
//用法2:notInSql("id", "select id from table where id < 3")--->id not in (select id from table where id < 3)

or:拼接 OR

or()
or(boolean condition)

//queryWrapper.eq("id",2);
//queryWrapper.or();主动调用or表示紧接着下一个方法不是用and连接!(不调用or,默认使用and连接)
//queryWrapper.eq("name","小红");
//where id = 2 or name = '小红'  :写了or
//where id = 2 and name = '小红'  :没写or默认为and

plus,分页

  • 写一个配置类,并注册到ioc容器中

//Spring boot方式
@EnableTransactionManagement
@Configuration
@MapperScan("com.baomidou.cloud.service.*.mapper*")//这里扫描了之后,就不用再在启动类上面重复扫描了
public class MybatisPlusConfig {

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
        // paginationInterceptor.setOverflow(false);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        // paginationInterceptor.setLimit(500);
        // 开启 count 的 join 优化,只针对部分 left join
        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        return paginationInterceptor;
    }
}

  • 在dao层需要加上分页方法

    public interface UserMapper {//可以继承或者不继承BaseMapper
        /**
         * <p>
         * 查询 : 根据state状态查询用户列表,分页显示
         * </p>
         *
         * @param page 分页对象,xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位(你可以继承Page实现自己的分页对象)
         * @param state 状态
         * @return 分页对象
         */
        IPage<User> selectPageVo(Page<?> page, Integer state);
    }
    
  • UserMapper.xml 等同于编写一个普通 list 查询,mybatis-plus 自动替你分页

    <select id="selectPageVo" resultType="com.baomidou.cloud.entity.UserVo">
        SELECT id,name FROM user WHERE state=#{state}
    </select>
    
  • UserServiceImpl.java 调用分页方法

    public IPage<User> selectUserPage(Page<User> page, Integer state) {
        // 不进行 count sql 优化,解决 MP 无法自动优化 SQL 问题,这时候你需要自己查询 count 部分
        // page.setOptimizeCountSql(false);
        // 当 total 为小于 0 或者设置 setSearchCount(false) 分页插件不会进行 count 查询
        // 要点!! 分页返回的对象与传入的对象是同一个
        return userMapper.selectPageVo(page, state);
    }
    

简单的介绍一下什么是Page

//源码
public class Page<T> implements IPage<T> {

    private static final long serialVersionUID = 8545996863226528798L;

    //查询数据列表
    protected List<T> records = Collections.emptyList();

    //总数
    protected long total = 0;
    //每页显示条数,默认 10
    protected long size = 10;

    //当前页
    protected long current = 1;

    //排序字段信息
    @Getter
    @Setter
    protected List<OrderItem> orders = new ArrayList<>();

    //自动优化 COUNT SQL
    protected boolean optimizeCountSql = true;
    
    //是否进行 count 查询
    protected boolean isSearchCount = true;
    
    //是否命中count缓存
    protected boolean hitCount = false;
    
    //countId
    @Getter
    @Setter
    protected String countId;
    
    // countId
    @Getter
    @Setter
    protected Long maxLimit;
/**
 *说明具体的意思
 *records 用来存放查询出来的数据
 *total 返回记录的总数
 *size 每页显示条数,默认 10
 *current 当前页,默认1
 *orders 排序字段信息
 *optimizeCountSql 自动优化 COUNT SQL,默认true
 *isSearchCount 是否进行 count 查询,默认true
 *hitCount 是否命中count缓存,默认false
 */
    
 //构建一个Page
  Page<T> page = new Page<T>(pageNum,pageSize)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349