欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

史上最全MybatisPlus從入門(mén)到精通

 更新時(shí)間:2025年08月09日 13:41:53   作者:☆致夏☆  
MyBatis-Plus是MyBatis增強(qiáng)工具,簡(jiǎn)化開(kāi)發(fā)并提升效率,支持自動(dòng)映射表名/字段與實(shí)體類,提供條件構(gòu)造器、多種查詢方式(等值/范圍/模糊/分頁(yè)等)、主鍵策略(如雪花算法、UUID)及分頁(yè)插件配置,實(shí)現(xiàn)靈活的數(shù)據(jù)操作與數(shù)據(jù)庫(kù)交互,需要的朋友跟隨小編一起看看吧

1.簡(jiǎn)介

MyBatis-Plus (簡(jiǎn)稱MP)是一個(gè)MyBatis 的增強(qiáng)工具,在MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生。

官方網(wǎng)址:MyBatis-Plus ?? 為簡(jiǎn)化開(kāi)發(fā)而生

2.基礎(chǔ)篇

2.1.通用mapper接口操作

    @Test
    void selectList() {
        List<User> users = userMapper.selectList(null);
        System.out.println(users);
    }
    @Test
    void insert() {
        User user = new User();
        user.setId(6L);
        user.setName("Nike");
        user.setAge(33);
        user.setEmail("test6@example.com");
        userMapper.insert(user);
    }
    @Test
    void deleteOne() {
        userMapper.deleteById(6L);
    }
    @Test
    void updateById() {
        User user = new User();
        user.setId(6L);
        user.setName("邁克");
        user.setAge(35);
        user.setEmail("maike@powernode.com");
        userMapper.updateById(user);
    }
    @Test
    void selectById() {
        User user = userMapper.selectById(6L);
        System.out.println(user);
    }

2.2.通用service接口操作

直接在service實(shí)現(xiàn)簡(jiǎn)單的crud操作

    @Test
    void insertService() {
        User user = new User();
        user.setId(7L);
        user.setName("zhangsan");
        user.setAge(35);
        user.setEmail("zhangsan@powernode.com");
        userService.save(user);
    }
    @Test
    void deleteService() {
        userService.removeById(7L);
    }
    @Test
    void updateService() {
        User user = new User();
        user.setId(6L);
        user.setAge(40);
        userService.updateById(user);
    }
    @Test
    void selectService() {
        List<User> users = userService.selectList();
        System.out.println(users);
    }

3.進(jìn)階篇

3.1.映射

3.1.1.自動(dòng)映射

  1. 表名和實(shí)體類名映射->表名user 實(shí)體類名User
  2. 字段名和實(shí)體類屬性名映射->字段名name 實(shí)體類屬性名name
  3. 字段名下劃線命名方式和實(shí)體類屬性小駝峰命名方式映射->字段名user_email 實(shí)體類屬性名userEmail

MybatisPlus支持這種映射規(guī)則,可以通過(guò)配置來(lái)設(shè)置

map-underscore-to-camel-case:true  #表示支持下劃線到驅(qū)它峰的映射
map-underscore-to-camel-case:false  #表示不支持下劃線到駝峰的映射

3.1.2.表映射

通過(guò)@TableName()注解指定映射的數(shù)據(jù)庫(kù)表名,就會(huì)按照指定的表名進(jìn)行映射
如:此時(shí)將數(shù)據(jù)庫(kù)的表名改為powershop_user,要完成表名和實(shí)體類合名的映射,需要將實(shí)體
類名也要指定為powershop_user

全局配置

全局配置后可刪除注解@TableName("powershop_user")

3.1.3.字段映射

當(dāng)數(shù)據(jù)庫(kù)字段和表實(shí)體類的屬性不一致時(shí),我們可以使用@TableField()注解改變字段和屬性的映射,讓注解中的名稱和表字段保持一致
如:此時(shí)將數(shù)據(jù)庫(kù)字段的名稱我們改為username,在根據(jù)實(shí)體類的屬性拼接SQL的使用,就會(huì)使用@TableField()中指定的名稱username進(jìn)行拼接,完成查詢

數(shù)據(jù)庫(kù)字段和表實(shí)體類的屬性一致,框架在拼接SQL語(yǔ)句的時(shí)候,會(huì)使用屬性名稱直接拼接sql語(yǔ)句,例如:
SELECT id,username AS name,age,email,desc
FROM powershop_user
這條語(yǔ)句直接進(jìn)行查詢的時(shí)候,會(huì)出現(xiàn)錯(cuò)誤。

原因是,desc屬于關(guān)鍵字,不能直接用于sql查詢,要解決這個(gè)問(wèn)題就需要將desc字段加上`符號(hào),將他變?yōu)椴皇顷P(guān)鍵字,才能完成查詢,那這個(gè)個(gè)問(wèn)題的根本也是改變生成的SQL語(yǔ)句的字段名稱,也就是我們需要通過(guò)@TableField()改變實(shí)體類的屬性名稱。

3.1.4.字段失效

當(dāng)數(shù)據(jù)庫(kù)中有字段不希望被查詢,我們可以通過(guò)@TableField(select=false)來(lái)隱藏
這個(gè)字段,那在拼接SQL語(yǔ)句的時(shí)候,就不會(huì)拼接這個(gè)字段

3.1.5.視圖屬性

在實(shí)際開(kāi)發(fā)中,有些字段不需要數(shù)據(jù)庫(kù)存儲(chǔ),但是卻需要展示,需要要展示也就是意味著實(shí)體類中需要存在這個(gè)字段,我們稱這些實(shí)體類中存在但是數(shù)據(jù)庫(kù)中不存在的字段,叫做視圖字段。

像這種視圖字段,能夠作為查詢條件么,顯示是不能的。因?yàn)閿?shù)據(jù)車(chē)中沒(méi)有這個(gè)字段,所以查
詢字段如果包含這個(gè)字段,SQL語(yǔ)句會(huì)出現(xiàn)問(wèn)題。我們通過(guò)@TableField(exist = false)
來(lái)去掉這個(gè)字段,不讓他作為查詢字段。

3.2.條件構(gòu)造器

3.2.1.條件構(gòu)造器介紹

將查詢條件封裝成對(duì)象。

抽象類不能創(chuàng)建對(duì)象,重點(diǎn)在實(shí)體類。

3.3.等值查詢

3.3.1. 單條件查詢 eq

QueryWrapper 和 LambdaQueryWrapper 的對(duì)比使用

    @Test
    void eq(){
        //1.創(chuàng)建條件查詢對(duì)象
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //2.設(shè)置查詢條件,指定查詢的字段和匹配的值
        queryWrapper.eq( "name", "Jack");
        //3.進(jìn)行條件查詢
        User user = userMapper.selectOne(queryWrapper);
        System.out.println(user);
    }
    @Test
    void eq2() {
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getName, "Jack");
        User user = userMapper.selectOne(lambdaQueryWrapper);
        System.out.println(user);
    }

查詢null值判斷

條件查詢判斷,如果值為null,則不作為查詢條件 -> 查詢所有

    @Test
    void isNull(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        String name = null;
        lambdaQueryWrapper.eq(User::getName,name);
        // User user = userMapper.selectOne(lambdaQueryWrapper);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }
    @Test
    void isNull2(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        String name = null;
        lambdaQueryWrapper.eq(name != null,User::getName,name);
        // User user = userMapper.selectOne(lambdaQueryWrapper);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

3.3.2. 多條件查詢 allEq

    @Test
    void allEq1() {
        LambdaQueryWrapper<User> lambdaqueryWrapper = new LambdaQueryWrapper<>();
        lambdaqueryWrapper.eq(User::getName, "Tom");
        lambdaqueryWrapper.eq(User::getAge, 28);
        User user = userMapper.selectOne(lambdaqueryWrapper);
        System.out.println(user);
    }
    @Test
    void allEq2() {
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("name", "Tom");
        hashMap.put("age", null);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.allEq(hashMap, true);
        User user = userMapper.selectOne(queryWrapper);
        System.out.println(user);
    }

3.3.3. 不等條件查詢 ne

    @Test
    void ne() {
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.ne(User::getName, "Tom");
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

3.4.范圍查詢

3.4.1. gt,ge,lt,le的使用

大于-gt、 大于等于-ge、 小于-lt、 小于等于-le

@Test
void gt(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.設(shè)置條件,指定字段名稱和值
    Integer age = 18;
    lambdaQueryWrapper.ge(User::getAge,age);
    //3.使用條件完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.4.2.區(qū)間查詢 between notbetween

    @Test
    void between(){
        //1.創(chuàng)建QueryWrapper對(duì)象
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //2.設(shè)置條件,指定字段名稱和值
        lambdaQueryWrapper.between(User::getAge,18,30);
        //3.使用條件完成查詢
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }
    @Test
    void notBetween(){
        //1.創(chuàng)建QueryWrapper對(duì)象
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //2.設(shè)置條件,指定字段名稱和值
        lambdaQueryWrapper.notBetween(User::getAge,18,30);
        //3.使用條件完成查詢
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

3.5.模糊查詢

3.5.1.全模糊匹配 like

@Test
void like(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.設(shè)置條件,指定字段名稱和值
    lambdaQueryWrapper.like(User::getName,"J");
    //3.使用條件完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.5.2.不包含模糊匹配 notLike

@Test
void notLike(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.設(shè)置條件,指定字段名稱和值
    lambdaQueryWrapper.notLike(User::getName,"J");
    //3.使用條件完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.5.3.左模糊匹配 likeLeft

左邊模糊 %e

@Test
void likeLeft(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.設(shè)置條件,指定字段名稱和值
    lambdaQueryWrapper.likeLeft(User::getName,"e");
    //3.使用條件完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.5.4.右模糊匹配 likeRight

@Test
void likeLeft(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.設(shè)置條件,指定字段名稱和值
    lambdaQueryWrapper.likeLeft(User::getName,"J");
    //3.使用條件完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.6.判空查詢

3.6.1. isNull,isNotNull

@Test
void isNull(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.設(shè)置條件,指定字段名稱
    lambdaQueryWrapper.isNull(User::getName);
    //3.使用條件完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}
@Test
void isNotNull(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.設(shè)置條件,指定字段名稱
    lambdaQueryWrapper.isNotNull(User::getName);
    //3.使用條件完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.7.包含查詢

3.7.1. in

字段=值or字段=值  -> in

@Test
void in(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.設(shè)置條件,指定字段名稱和值
    ArrayList<Integer> arrayList = new ArrayList<>();
    Collections.addAll(arrayList,18,20,21);
    lambdaQueryWrapper.in(User::getAge,arrayList);
    //3.使用條件完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}
@Test
void in2(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.設(shè)置條件,指定字段名稱和值
    lambdaQueryWrapper.in(User::getAge,18,20,21);
    //3.使用條件完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.7.2. notIn

字段!=值and字段!=值   -> notIn

@Test
void notIn(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.設(shè)置條件,指定字段名稱和值
    ArrayList<Integer> arrayList = new ArrayList<>();
    Collections.addAll(arrayList,18,20,21);
    lambdaQueryWrapper.notIn(User::getAge,arrayList);
    //3.使用條件完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}
@Test
void notIn2(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.設(shè)置條件,指定字段名稱和值
    lambdaQueryWrapper.notIn(User::getAge,18,20,21);
    //3.使用條件完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.7.3. inSql

@Test
void inSql(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.設(shè)置條件,指定字段名稱和值
    lambdaQueryWrapper.inSql(User::getAge,"18,20,22");
    //3.使用條件完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}
@Test
void inSql2(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.設(shè)置條件,指定字段名稱和值
    lambdaQueryWrapper.inSql(User::getAge,"select age from powershop_user where age > 20");
    //3.使用條件完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.7.4. notInSql

@Test
void notInSql(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.設(shè)置條件,指定字段名稱和值
    lambdaQueryWrapper.notInSql(User::getAge,"18,20,22");
    //3.使用條件完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}
@Test
void notInSql2(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.設(shè)置條件,指定字段名稱和值
    lambdaQueryWrapper.notInSql(User::getAge,"select age from powershop_user where age > 20");
    //3.使用條件完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.8.分組查詢

3.8.1. groupBy

@Test
void groupBy(){
    //1.創(chuàng)建QueryWrapper對(duì)象
   QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //2.設(shè)置條件,指定字段名稱和值
    queryWrapper.groupBy("age");
    queryWrapper.select("age,count(*) as field_count");
    //3.使用條件完成查詢
    List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
    System.out.println(maps);
}

3.9.聚合查詢

3.9.1. having

having過(guò)濾分組后的數(shù)據(jù),where過(guò)濾分組前的數(shù)據(jù)。

@Test
void having(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //分組字段
    queryWrapper.groupBy("age");
    //查詢字段
    queryWrapper.select("age,count(*) as field_count");
    //聚合條件篩選
    queryWrapper.having("field_count = 1");
    List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
    System.out.println(maps);
}

3.10.排序查詢

3.10.1.升序查詢 orderByAsc

@Test
void orderByAsc(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.設(shè)置條件,指定升序排序字段
    lambdaQueryWrapper.orderByAsc(User::getAge,User::getId);
    //3.使用條件完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.10.2.降序查詢 orderByDesc

@Test
void orderByDesc(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.設(shè)置條件,指定降序排序字段
    lambdaQueryWrapper.orderByDesc(User::getAge,User::getId);
    //3.使用條件完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.10.3.自定義排序查詢 orderBy

    @Test
    void orderBy() {
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //設(shè)置排序字段和排序的方式參數(shù)1:如果排序字段的值存在nuLL的時(shí)候,是否還要作為排序字段參與排序,參數(shù)2:是否是升序排序,參數(shù)3:排序字段
        lambdaQueryWrapper.orderBy(true, true, User::getAge);
        lambdaQueryWrapper.orderBy(true, false, User::getId);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

3.11.邏輯查詢

3.11.1.內(nèi)嵌邏輯查詢 func

    @Test
    void func(){
        //1.創(chuàng)建QueryWrapper對(duì)象
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //2.構(gòu)建邏輯判斷語(yǔ)句
        /*lambdaQueryWrapper.func(new Consumer<LambdaQueryWrapper<User>>() {
            @Override
            public void accept(LambdaQueryWrapper<User> userLambdaQueryWrapper) {
                if(true) {
                    userLambdaQueryWrapper.eq(User::getId, 1);
                } else {
                    userLambdaQueryWrapper.ne(User::getId, 1);
                }
            }
        });*/
        lambdaQueryWrapper.func(i -> {
            if(true) {
                i.eq(User::getId, 1);
            }else {
                i.ne(User::getId, 1);
            }
        });
        //3.完成查詢
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

3.11.2. and

正常拼接默認(rèn)就是and

@Test
void and(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.構(gòu)建條件查詢語(yǔ)句
    lambdaQueryWrapper.gt(User::getAge,22).lt(User::getAge,30);
    //3.完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

and嵌套

@Test
void and2(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.構(gòu)建條件查詢語(yǔ)句
    lambdaQueryWrapper.eq(User::getName,"wang").and(i -> i.gt(User::getAge,26).or().lt(User::getAge,22));
    //3.完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.11.3. or

@Test
void or(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.構(gòu)建條件查詢語(yǔ)句
    lambdaQueryWrapper.lt(User::getAge,20).or().gt(User::getAge,23);
    //3.完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

or嵌套

@Test
void or2(){
     LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
     lambdaQueryWrapper.eq(User::getName,"wang").or(i -> i.gt(User::getAge,22).lt(User::getAge,26));
     List<User> users = userMapper.selectList(lambdaQueryWrapper);
     System.out.println(users);
}

3.11.4. nested

查詢條件直接拼在where后面

@Test
void nested(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.構(gòu)建條件查詢語(yǔ)句
    lambdaQueryWrapper.nested(i -> i.eq(User::getName, "Billie").ne(User::getAge, 22));
    //3.完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.12.自定義查詢

3.12.1. apply

查詢條件通過(guò)字符串編寫(xiě)直接拼在where后面

@Test
void apply(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.構(gòu)建條件查詢語(yǔ)句
    lambdaQueryWrapper.apply("id = 1");
    //3.完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.13.分頁(yè)查詢

3.13.1. last

查詢條件通過(guò)字符串編寫(xiě)直接拼在Sql語(yǔ)句最后

@Test
void last(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.構(gòu)建條件查詢語(yǔ)句
    lambdaQueryWrapper.last("limit 0,2");
    //3.完成查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.14. exists 查詢

3.14.1 exists

exists后的子查詢?nèi)绻薪Y(jié)果,則exists返回true,執(zhí)行exits前的主查詢語(yǔ)句;反之不執(zhí)行主查詢語(yǔ)句。

@Test
void exists(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.構(gòu)建查詢條件
    lambdaQueryWrapper.exists("select id from powershop_user where age = 18");
    //3.查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.14.2 notExists

@Test
void notExists(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.構(gòu)建查詢條件
    lambdaQueryWrapper.notExists("select id from powershop_user where age = 33");
    //3.查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.15. select 查詢

選擇要查詢的字段

@Test
void select(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.構(gòu)建查詢條件
    lambdaQueryWrapper.select(User::getId,User::getName);
    //3.查詢
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

4.高級(jí)篇

4.1.主鍵策略

4.1.1.AUTO策略

該策略為跟隨數(shù)據(jù)庫(kù)表的主鍵遞增策略,前提是數(shù)據(jù)庫(kù)表的主鍵要設(shè)置為自增

4.1.2.?????INPUT策略

該策略表示,必須由我們手動(dòng)的插入id,否則無(wú)法添加數(shù)據(jù)

4.1.3.ASSIGN_ID策略

解決主鍵自增問(wèn)題。表的數(shù)據(jù)量很大,我們需要進(jìn)行分表

水平拆分就是將一個(gè)大的表按照數(shù)據(jù)量進(jìn)行拆分

垂直拆分就是將一個(gè)大的表按照字段進(jìn)行拆分

拆分后的數(shù)據(jù),有三點(diǎn)需求

  1. 拆分前后主鍵保持有序
  2. 主鍵唯一性
  3. 主鍵不要暴露數(shù)據(jù)量

雪花算法是由一個(gè)64位的二進(jìn)制組成的,最終就是一個(gè)Long類型的數(shù)值。

主要分為四部分存儲(chǔ)

【1】1位的符號(hào)位,固定值為0

【2】41位的時(shí)間戳

【3】10位的機(jī)器碼,包含5位機(jī)器id和5位服務(wù)id

【4】12位的序列號(hào)

數(shù)據(jù)表插入數(shù)據(jù)后發(fā)現(xiàn)一個(gè)19位長(zhǎng)度的id,該id就是雪花算法生成的id,這是二級(jí)制的十進(jìn)制表示形式

4.1.4.NONE策略

NONE策略表示不指定主鍵生成策略,當(dāng)我們沒(méi)有指定主鍵生成策略或者主鍵策略為NONE的時(shí)候,他跟隨的是全局策略。默認(rèn)是雪花算法策略。

4.1.5.ASSIGN_UUID策略

UUIDUniversally Unique Identifier)全局唯一標(biāo)識(shí)符,定義為一個(gè)字符串主鍵,采用32位數(shù)字組成,編碼采用16進(jìn)制,定義了在時(shí)間和空間都完全唯一的系統(tǒng)信息。

UUID的編碼規(guī)則:

11~8位采用系統(tǒng)時(shí)間,在系統(tǒng)時(shí)間上精確到毫秒級(jí)保證時(shí)間上的唯一性;

29~16位采用底層的IP地址,在服務(wù)器集群中的唯一性;

317~24位采用當(dāng)前對(duì)象的HashCode值,在一個(gè)內(nèi)部對(duì)象上的唯一性;

425~32位采用調(diào)用方法的一個(gè)隨機(jī)數(shù),在一個(gè)對(duì)象內(nèi)的毫秒級(jí)的唯一性。

通過(guò)以上4種策略可以保證唯一性。在系統(tǒng)中需要用到隨機(jī)數(shù)的地方都可以考慮采用UUID算法。

我們想要演示UUID的效果,需要改變一下表的字段類型和實(shí)體類的屬性類型

將數(shù)據(jù)庫(kù)表的字段類型改為varchar(50),將實(shí)體類的屬性類型改為String,并指定主鍵生成策略為IdType.ASSIGN_UUID

4.2.分頁(yè)

分頁(yè)的本質(zhì)就是需要設(shè)置一個(gè)攔截器,通過(guò)攔截器攔截了SQL,通過(guò)在SQL語(yǔ)句的結(jié)尾添加limit關(guān)鍵字,來(lái)實(shí)現(xiàn)分頁(yè)的效果

4.2.1.MybatisPlus分頁(yè)插件

【1】通過(guò)配置類來(lái)指定一個(gè)具體數(shù)據(jù)庫(kù)的分頁(yè)插件

@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

【2】實(shí)現(xiàn)分頁(yè)查詢效果

@Test
void selectPage(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.創(chuàng)建分頁(yè)查詢對(duì)象,指定當(dāng)前頁(yè)和每頁(yè)顯示條數(shù)
    IPage<User> page = new Page<>(1,3);
    //3.執(zhí)行分頁(yè)查詢
    userMapper.selectPage(page, lambdaQueryWrapper);
    //4.查看分頁(yè)查詢的結(jié)果
    System.out.println("當(dāng)前頁(yè)碼值:"+page.getCurrent());
    System.out.println("每頁(yè)顯示數(shù):"+page.getSize());
    System.out.println("總頁(yè)數(shù):"+page.getPages());
    System.out.println("總條數(shù):"+page.getTotal());
    System.out.println("當(dāng)前頁(yè)數(shù)據(jù):"+page.getRecords());
}

4.2.2.自定義分頁(yè)插件

【1】在UserMapper.xml映射配置文件中提供查詢語(yǔ)句

<?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.powernode.mapper.UserMapper">
     <select id="selectByName" resultType="com.powernode.domain.User">
        select * from powershop_user where name = #{name}
     </select>
</mapper>

【2】在Mapper接口中提供對(duì)應(yīng)的方法,方法中將IPage對(duì)象作為參數(shù)傳入

@Mapper
public interface UserMapper extends BaseMapper<User> {
       IPage<User> selectByName(IPage<User> page, String name);
}

【3】實(shí)現(xiàn)分頁(yè)查詢效果

@Test
void selectPage2(){
    //1.創(chuàng)建分頁(yè)查詢對(duì)象,指定當(dāng)前頁(yè)和每頁(yè)顯示條數(shù)
    IPage<User> page = new Page<>(1,2);
    //2.執(zhí)行分頁(yè)查詢
    userMapper.selectByName(page,"Mary");
    //3.查看分頁(yè)查詢的結(jié)果
    System.out.println("當(dāng)前頁(yè)碼值:"+page.getCurrent());
    System.out.println("每頁(yè)顯示數(shù):"+page.getSize());
    System.out.println("總頁(yè)數(shù):"+page.getPages());
    System.out.println("總條數(shù):"+page.getTotal());
    System.out.println("當(dāng)前頁(yè)數(shù)據(jù):"+page.getRecords());
}

到此這篇關(guān)于史上最全MybatisPlus從入門(mén)到精通的文章就介紹到這了,更多相關(guān)MybatisPlus從入門(mén)到精通內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • windows10 JDK安裝及配置環(huán)境變量與Eclipse安裝教程

    windows10 JDK安裝及配置環(huán)境變量與Eclipse安裝教程

    這篇文章主要介紹了windows10 JDK安裝及配置環(huán)境變量與Eclipse安裝,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • SpringBoot 中的異步處理機(jī)制詳解

    SpringBoot 中的異步處理機(jī)制詳解

    本文介紹了異步處理的基礎(chǔ)配置、線程池的自定義以及常見(jiàn)應(yīng)用場(chǎng)景,在實(shí)際應(yīng)用中,異步處理可以有效提升應(yīng)用的性能,改善用戶體驗(yàn),但同時(shí)也需要我們合理管理線程池,確保系統(tǒng)資源的高效利用,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • java如何給指定類配置單獨(dú)的日志文件輸出

    java如何給指定類配置單獨(dú)的日志文件輸出

    這篇文章主要介紹了java如何給指定類配置單獨(dú)的日志文件輸出問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 解決BeanUtils.copyProperties之大坑

    解決BeanUtils.copyProperties之大坑

    這篇文章主要介紹了解決BeanUtils.copyProperties之大坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 深入淺析Random類在高并發(fā)下的缺陷及JUC對(duì)其的優(yōu)化

    深入淺析Random類在高并發(fā)下的缺陷及JUC對(duì)其的優(yōu)化

    這篇文章主要介紹了Random類在高并發(fā)下的缺陷及JUC對(duì)其的優(yōu)化 ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • 深入了解Java中的類加載機(jī)制

    深入了解Java中的類加載機(jī)制

    通常,在關(guān)于Java的類加載部分會(huì)遇到以上疑問(wèn),本文將對(duì)類加載重要部分做詳細(xì)介紹,包括重要的基礎(chǔ)概念和應(yīng)用場(chǎng)景,在編寫(xiě)過(guò)程中也幫助作者重新熟悉并加固了知識(shí)點(diǎn),希望在看完后對(duì)大家能有所幫助
    2022-11-11
  • Java單例模式的五種實(shí)現(xiàn)方式

    Java單例模式的五種實(shí)現(xiàn)方式

    單例模式(Singleton Pattern)是Java中最簡(jiǎn)單的設(shè)計(jì)模式之一,這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式,下面這篇文章主要給大家介紹了關(guān)于Java單例模式的五種實(shí)現(xiàn)方式?,需要的朋友可以參考下
    2022-06-06
  • Spring?RestTemplate如何利用攔截器打印請(qǐng)求參數(shù)和返回狀態(tài)

    Spring?RestTemplate如何利用攔截器打印請(qǐng)求參數(shù)和返回狀態(tài)

    這篇文章主要介紹了Spring?RestTemplate如何利用攔截器打印請(qǐng)求參數(shù)和返回狀態(tài)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java 排序算法之選擇排序

    java 排序算法之選擇排序

    本文主要講解了java 排序算法之選擇排序,選擇排序是最簡(jiǎn)單直觀的一種算法,想要了解相關(guān)知識(shí)的朋友快來(lái)看一看這篇文章吧
    2021-09-09
  • springboot實(shí)現(xiàn)maven多模塊和打包部署

    springboot實(shí)現(xiàn)maven多模塊和打包部署

    本文主要介紹了springboot實(shí)現(xiàn)maven多模塊和打包部署,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評(píng)論