史上最全MybatisPlus從入門(mén)到精通
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)映射
- 表名和實(shí)體類名映射->表名user 實(shí)體類名User
- 字段名和實(shí)體類屬性名映射->字段名name 實(shí)體類屬性名name
- 字段名下劃線命名方式和實(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)需求
- 拆分前后主鍵保持有序
- 主鍵唯一性
- 主鍵不要暴露數(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策略
UUID(Universally Unique Identifier)全局唯一標(biāo)識(shí)符,定義為一個(gè)字符串主鍵,采用32位數(shù)字組成,編碼采用16進(jìn)制,定義了在時(shí)間和空間都完全唯一的系統(tǒng)信息。
UUID的編碼規(guī)則:
【1】1~8位采用系統(tǒng)時(shí)間,在系統(tǒng)時(shí)間上精確到毫秒級(jí)保證時(shí)間上的唯一性;
【2】9~16位采用底層的IP地址,在服務(wù)器集群中的唯一性;
【3】17~24位采用當(dāng)前對(duì)象的HashCode值,在一個(gè)內(nèi)部對(duì)象上的唯一性;
【4】25~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安裝,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10深入淺析Random類在高并發(fā)下的缺陷及JUC對(duì)其的優(yōu)化
這篇文章主要介紹了Random類在高并發(fā)下的缺陷及JUC對(duì)其的優(yōu)化 ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04Spring?RestTemplate如何利用攔截器打印請(qǐng)求參數(shù)和返回狀態(tài)
這篇文章主要介紹了Spring?RestTemplate如何利用攔截器打印請(qǐng)求參數(shù)和返回狀態(tài)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07springboot實(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