最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

史上最全MybatisPlus從入門到精通

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

1.簡(jiǎn)介

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

官方網(wǎng)址:MyBatis-Plus ?? 為簡(jiǎn)化開發(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ī)則,可以通過配置來設(shè)置

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

3.1.2.表映射

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

全局配置

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

3.1.3.字段映射

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

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

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

3.1.4.字段失效

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

3.1.5.視圖屬性

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

像這種視圖字段,能夠作為查詢條件么,顯示是不能的。因?yàn)閿?shù)據(jù)車中沒有這個(gè)字段,所以查
詢字段如果包含這個(gè)字段,SQL語句會(huì)出現(xiàn)問題。我們通過@TableField(exist = false)
來去掉這個(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過濾分組后的數(shù)據(jù),where過濾分組前的數(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)建邏輯判斷語句
        /*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)建條件查詢語句
    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)建條件查詢語句
    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)建條件查詢語句
    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)建條件查詢語句
    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

查詢條件通過字符串編寫直接拼在where后面

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

3.13.分頁查詢

3.13.1. last

查詢條件通過字符串編寫直接拼在Sql語句最后

@Test
void last(){
    //1.創(chuàng)建QueryWrapper對(duì)象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.構(gòu)建條件查詢語句
    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前的主查詢語句;反之不執(zhí)行主查詢語句。

@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ù)庫表的主鍵遞增策略,前提是數(shù)據(jù)庫表的主鍵要設(shè)置為自增

4.1.2.?????INPUT策略

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

4.1.3.ASSIGN_ID策略

解決主鍵自增問題。表的數(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)我們沒有指定主鍵生成策略或者主鍵策略為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í)的唯一性。

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

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

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

4.2.分頁

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

4.2.1.MybatisPlus分頁插件

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

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

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

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

4.2.2.自定義分頁插件

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

<?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)分頁查詢效果

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

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

相關(guān)文章

  • Springboot集成SSE實(shí)現(xiàn)單工通信消息推送流程詳解

    Springboot集成SSE實(shí)現(xiàn)單工通信消息推送流程詳解

    SSE簡(jiǎn)單的來說就是服務(wù)器主動(dòng)向前端推送數(shù)據(jù)的一種技術(shù),它是單向的,也就是說前端是不能向服務(wù)器發(fā)送數(shù)據(jù)的。SSE適用于消息推送,監(jiān)控等只需要服務(wù)器推送數(shù)據(jù)的場(chǎng)景中,下面是使用Spring Boot來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的模擬向前端推動(dòng)進(jìn)度數(shù)據(jù),前端頁面接受后展示進(jìn)度條
    2022-11-11
  • Java反射機(jī)制的講解

    Java反射機(jī)制的講解

    今天小編就為大家分享一篇關(guān)于Java反射機(jī)制的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 微信小程序獲取手機(jī)號(hào)的完整實(shí)例(Java后臺(tái)實(shí)現(xiàn))

    微信小程序獲取手機(jī)號(hào)的完整實(shí)例(Java后臺(tái)實(shí)現(xiàn))

    我們?cè)谧鲂〕绦蜷_發(fā)的過程中,經(jīng)常會(huì)涉及到用戶身份的問題,最普遍的就是我們要獲取用戶的手機(jī)號(hào)碼,下面這篇文章主要給大家介紹了關(guān)于微信小程序獲取手機(jī)號(hào)的完整實(shí)例,后臺(tái)由Java實(shí)現(xiàn),需要的朋友可以參考下
    2022-06-06
  • idea-java序列化serialversionUID自動(dòng)生成方式

    idea-java序列化serialversionUID自動(dòng)生成方式

    Java的Serializable接口用于實(shí)現(xiàn)對(duì)象的序列化和反序列化,通過將對(duì)象轉(zhuǎn)換為字節(jié)流來存儲(chǔ)或傳輸,實(shí)現(xiàn)Serializable接口的類需要定義serialVersionUID以保證序列化和反序列化過程的兼容性,IDEA提供了便捷的配置和快捷鍵來生成serialVersionUID
    2025-11-11
  • 淺談Java中Lambda表達(dá)式的相關(guān)操作

    淺談Java中Lambda表達(dá)式的相關(guān)操作

    java8新特性,Lambda是一個(gè)匿名函數(shù),類似Python中的Lambda表達(dá)式、js中的箭頭函數(shù),目的簡(jiǎn)化操作,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 詳解Java中如何定義和訪問靜態(tài)字段和方法

    詳解Java中如何定義和訪問靜態(tài)字段和方法

    在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,我們通常使用類來創(chuàng)建對(duì)象,類中有許多成員變量和方法,它們是直接屬于對(duì)象實(shí)例的,與之對(duì)應(yīng)的還有一類成員,那就是靜態(tài)成員,本文就來和大家聊聊Java是如何定義訪問靜態(tài)成員的吧
    2023-05-05
  • Java生成Jar包方法步驟

    Java生成Jar包方法步驟

    在Java開發(fā)中,打包成JAR文件是一種常見的方式,本文主要介紹了Java生成Jar包方法步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • java教程之java程序編譯運(yùn)行圖解(java程序運(yùn)行)

    java教程之java程序編譯運(yùn)行圖解(java程序運(yùn)行)

    最近重新復(fù)習(xí)了一下java基礎(chǔ),在使用javap的過程中遇到了一些問題,這里便講講對(duì)于一個(gè)類文件如何編譯、運(yùn)行、反編譯的。也讓自己加深一下印象
    2014-03-03
  • Java設(shè)計(jì)模式模板方法(Template)原理解析

    Java設(shè)計(jì)模式模板方法(Template)原理解析

    這篇文章主要介紹了Java設(shè)計(jì)模式模板方法(Template)原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • java實(shí)現(xiàn)大數(shù)加法(BigDecimal)的實(shí)例代碼

    java實(shí)現(xiàn)大數(shù)加法(BigDecimal)的實(shí)例代碼

    之前寫過用vector、string實(shí)現(xiàn)大數(shù)加法,現(xiàn)在用java的BigDecimal類,代碼簡(jiǎn)單很多。但是在online-judge上,java的代碼運(yùn)行時(shí)間和內(nèi)存大得多
    2013-10-10

最新評(píng)論

儋州市| 阿合奇县| 札达县| 翼城县| 临安市| 江川县| 隆昌县| 蒙自县| 图木舒克市| 文登市| 新沂市| 黄冈市| 芦溪县| 虞城县| 环江| 绥棱县| 仙游县| 台东市| 常德市| 寻乌县| 吕梁市| 团风县| 宁强县| 寿阳县| 安阳县| 河西区| 岗巴县| 体育| 镇安县| 郓城县| 二连浩特市| 秦安县| 那坡县| 阳曲县| 樟树市| 南城县| 长乐市| 凭祥市| 新丰县| 怀远县| 大名县|