javascript
SpringBoot整合MyBatis-Plus3.1详细教程
一.說明
Mybatis-Plus是一個Mybatis框架的增強插件,根據官方描述,MP只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑.并且只需簡單配置,即可快速進行 CRUD 操作,從而節省大量時間.代碼生成,分頁,性能分析等功能一應俱全,最新已經更新到了3.1.1版本了,3.X系列支持lambda語法,讓我在寫條件構造的時候少了很多的"魔法值",從代碼結構上更簡潔了.
二.項目環境
MyBatis-Plus版本: 3.1.0
SpringBoot版本:2.1.5
JDK版本:1.8
Maven依賴如下:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- mybatisPlus 核心庫 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.0</version></dependency><!-- 引入阿里數據庫連接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.6</version></dependency> </dependencies> 復制代碼配置如下:
# 配置端口 server: port: 8081 spring:# 配置數據源 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mp_student?useUnicode=true&characterEncoding=utf-8 username: root password: root type: com.alibaba.druid.pool.DruidDataSource # mybatis-plus相關配置 mybatis-plus:# xml掃描,多個目錄用逗號或者分號分隔(告訴 Mapper 所對應的 XML 文件位置) mapper-locations: classpath:mapper/*.xml# 以下配置均有默認值,可以不設置 global-config: db-config:#主鍵類型 auto:"數據庫ID自增" 1:"用戶輸入ID",2:"全局唯一ID (數字類型唯一ID)", 3:"全局唯一ID UUID"; id-type: auto#字段策略 IGNORED:"忽略判斷" NOT_NULL:"非 NULL 判斷") NOT_EMPTY:"非空判斷" field-strategy: NOT_EMPTY#數據庫類型 db-type: MYSQL configuration:# 是否開啟自動駝峰命名規則映射:從數據庫列名到Java屬性駝峰命名的類似映射 map-underscore-to-camel-case: true# 如果查詢結果中包含空值的列,則 MyBatis 在映射的時候,不會映射這個字段 call-setters-on-nulls: true# 這個配置會將執行的sql打印出來,在開發或測試的時候可以用 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 復制代碼表結構:
CREATE TABLE `user_info` (`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',`name` varchar(32) DEFAULT NULL COMMENT '姓名',`age` int(11) DEFAULT NULL COMMENT '年齡',`skill` varchar(32) DEFAULT NULL COMMENT '技能',`evaluate` varchar(64) DEFAULT NULL COMMENT '評價',`fraction` bigint(11) DEFAULT NULL COMMENT '分數',PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COMMENT='學生信息表'; 復制代碼表數據:
INSERT INTO `user_info` VALUES (1, '小明', 20, '畫畫', '該學生在畫畫方面有一定天賦', 89); INSERT INTO `user_info` VALUES (2, '小蘭', 19, '游戲', '近期該學生由于游戲的原因導致分數降低了', 64); INSERT INTO `user_info` VALUES (3, '張張', 18, '英語', '近期該學生參加英語比賽獲得二等獎', 90); INSERT INTO `user_info` VALUES (4, '大黃', 20, '體育', '該學生近期由于參加籃球比賽,導致腳傷', 76); INSERT INTO `user_info` VALUES (5, '大白', 17, '繪畫', '該學生參加美術大賽獲得三等獎', 77); INSERT INTO `user_info` VALUES (7, '小龍', 18, 'JAVA', '該學生是一個在改BUG的碼農', 59); INSERT INTO `user_info` VALUES (9, 'Sans', 18, '睡覺', 'Sans是一個愛睡覺,并且身材較矮骨骼巨大的骷髏小胖子', 60); INSERT INTO `user_info` VALUES (10, 'papyrus', 18, 'JAVA', 'Papyrus是一個講話大聲、個性張揚的骷髏,給人自信、有魅力的骷髏小瘦子', 58); INSERT INTO `user_info` VALUES (11, '刪除數據1', 3, '畫肖像', NULL, 61); INSERT INTO `user_info` VALUES (12, '刪除數據2', 3, NULL, NULL, 61); INSERT INTO `user_info` VALUES (13, '刪除數據3', 3, NULL, NULL, 61); INSERT INTO `user_info` VALUES (14, '刪除數據4', 5, '刪除', NULL, 10); INSERT INTO `user_info` VALUES (15, '刪除數據5', 6, '刪除', NULL, 10); 復制代碼二.編寫基礎類
在啟動類上添加掃描DAO的注解
(basePackages = {"com.mp.demo.dao"}) //掃描DAO public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);} } 復制代碼編寫Config配置類
/*** @Description MybatisPlus配置類* @Author Sans* @CreateTime 2019/5/26 17:20*/ public class MybatisPlusConfig {/*** mybatis-plus SQL執行效率插件【生產環境可以關閉】*/public PerformanceInterceptor performanceInterceptor() {return new PerformanceInterceptor();}/*** 分頁插件*/public PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();} } 復制代碼編寫Entity類
/*** @Description 學生信息實體類* @Author Sans* @CreateTime 2019/5/26 21:41*/ ("user_info")//@TableName中的值對應著表名 public class UserInfoEntity {/*** 主鍵* @TableId中可以決定主鍵的類型,不寫會采取默認值,默認值可以在yml中配置* AUTO: 數據庫ID自增* INPUT: 用戶輸入ID* ID_WORKER: 全局唯一ID,Long類型的主鍵* ID_WORKER_STR: 字符串全局唯一ID* UUID: 全局唯一ID,UUID類型的主鍵* NONE: 該類型為未設置主鍵類型*/(type = IdType.AUTO)private Long id;/*** 姓名*/private String name;/*** 年齡*/private Integer age;/*** 技能*/private String skill;/*** 評價*/private String evaluate;/*** 分數*/private Long fraction; } 復制代碼編寫Dao類
/*** @Description 用戶信息DAO* @Author Sans* @CreateTime 2019/6/8 16:24*/ public interface UserInfoDao extends BaseMapper<UserInfoEntity> { } 復制代碼編寫Service類
/*** @Description 用戶業務接口* @Author Sans* @CreateTime 2019/6/8 16:26*/ public interface UserInfoService extends IService<UserInfoEntity> { } 復制代碼編寫ServiceImpl類
/*** @Description 用戶業務實現* @Author Sans* @CreateTime 2019/6/8 16:26*/ public class UserInfoSerivceImpl extends ServiceImpl<UserInfoDao, UserInfoEntity> implements UserInfoService { } 復制代碼三.MyBatis-Plus基礎演示
這里我們看到,service中我們沒有寫任何方法,MyBatis-Plus官方封裝了許多基本CRUD的方法,可以直接使用大量節約時間,MP共通方法詳見IService,ServiceImpl,BaseMapper源碼,寫入操作在ServiceImpl中已有事務綁定,這里我們舉一些常用的方法演示.
/*** @Description UserInfoController* @Author Sans* @CreateTime 2019/6/8 16:27*/ ("/userInfo") public class UserInfoController {private UserInfoService userInfoService;/*** 根據ID獲取用戶信息* @Author Sans* @CreateTime 2019/6/8 16:34* @Param userId 用戶ID* @Return UserInfoEntity 用戶實體*/("/getInfo")public UserInfoEntity getInfo(String userId){UserInfoEntity userInfoEntity = userInfoService.getById(userId);return userInfoEntity;}/*** 查詢全部信息* @Author Sans* @CreateTime 2019/6/8 16:35* @Param userId 用戶ID* @Return List<UserInfoEntity> 用戶實體集合*/("/getList")public List<UserInfoEntity> getList(){List<UserInfoEntity> userInfoEntityList = userInfoService.list();return userInfoEntityList;}/*** 分頁查詢全部數據* @Author Sans* @CreateTime 2019/6/8 16:37* @Return IPage<UserInfoEntity> 分頁數據*/("/getInfoListPage")public IPage<UserInfoEntity> getInfoListPage(){//需要在Config配置類中配置分頁插件IPage<UserInfoEntity> page = new Page<>();page.setCurrent(5); //當前頁page.setSize(1); //每頁條數page = userInfoService.page(page);return page;}/*** 根據指定字段查詢用戶信息集合* @Author Sans* @CreateTime 2019/6/8 16:39* @Return Collection<UserInfoEntity> 用戶實體集合*/("/getListMap")public Collection<UserInfoEntity> getListMap(){Map<String,Object> map = new HashMap<>();//kay是字段名 value是字段值map.put("age",20);Collection<UserInfoEntity> userInfoEntityList = userInfoService.listByMap(map);return userInfoEntityList;}/*** 新增用戶信息* @Author Sans* @CreateTime 2019/6/8 16:40*/("/saveInfo")public void saveInfo(){UserInfoEntity userInfoEntity = new UserInfoEntity();userInfoEntity.setName("小龍");userInfoEntity.setSkill("JAVA");userInfoEntity.setAge(18);userInfoEntity.setFraction(59L);userInfoEntity.setEvaluate("該學生是一個在改BUG的碼農");userInfoService.save(userInfoEntity);}/*** 批量新增用戶信息* @Author Sans* @CreateTime 2019/6/8 16:42*/("/saveInfoList")public void saveInfoList(){//創建對象UserInfoEntity sans = new UserInfoEntity();sans.setName("Sans");sans.setSkill("睡覺");sans.setAge(18);sans.setFraction(60L);sans.setEvaluate("Sans是一個愛睡覺,并且身材較矮骨骼巨大的骷髏小胖子");UserInfoEntity papyrus = new UserInfoEntity();papyrus.setName("papyrus");papyrus.setSkill("JAVA");papyrus.setAge(18);papyrus.setFraction(58L);papyrus.setEvaluate("Papyrus是一個講話大聲、個性張揚的骷髏,給人自信、有魅力的骷髏小瘦子");//批量保存List<UserInfoEntity> list =new ArrayList<>();list.add(sans);list.add(papyrus);userInfoService.saveBatch(list);}/*** 更新用戶信息* @Author Sans* @CreateTime 2019/6/8 16:47*/("/updateInfo")public void updateInfo(){//根據實體中的ID去更新,其他字段如果值為null則不會更新該字段,參考yml配置文件UserInfoEntity userInfoEntity = new UserInfoEntity();userInfoEntity.setId(1L);userInfoEntity.setAge(19);userInfoService.updateById(userInfoEntity);}/*** 新增或者更新用戶信息* @Author Sans* @CreateTime 2019/6/8 16:50*/("/saveOrUpdateInfo")public void saveOrUpdate(){//傳入的實體類userInfoEntity中ID為null就會新增(ID自增)//實體類ID值存在,如果數據庫存在ID就會更新,如果不存在就會新增UserInfoEntity userInfoEntity = new UserInfoEntity();userInfoEntity.setId(1L);userInfoEntity.setAge(20);userInfoService.saveOrUpdate(userInfoEntity);}/*** 根據ID刪除用戶信息* @Author Sans* @CreateTime 2019/6/8 16:52*/("/deleteInfo")public void deleteInfo(String userId){userInfoService.removeById(userId);}/*** 根據ID批量刪除用戶信息* @Author Sans* @CreateTime 2019/6/8 16:55*/("/deleteInfoList")public void deleteInfoList(){List<String> userIdlist = new ArrayList<>();userIdlist.add("12");userIdlist.add("13");userInfoService.removeByIds(userIdlist);}/*** 根據指定字段刪除用戶信息* @Author Sans* @CreateTime 2019/6/8 16:57*/("/deleteInfoMap")public void deleteInfoMap(){//kay是字段名 value是字段值Map<String,Object> map = new HashMap<>();map.put("skill","刪除");map.put("fraction",10L);userInfoService.removeByMap(map);} } 復制代碼四.MyBatis-Plus的QueryWrapper條件構造器
當查詢條件復雜的時候,我們可以使用MP的條件構造器,請參考下面的QueryWrapper條件參數說明
| setSqlSelect | 設置 SELECT 查詢字段 |
| where | WHERE 語句,拼接 + WHERE 條件 |
| and | AND 語句,拼接 + AND 字段=值 |
| or | OR 語句,拼接 + OR 字段=值 |
| eq | 等于= |
| allEq | 基于 map 內容等于= |
| ne | 不等于<> |
| gt | 大于> |
| ge | 大于等于>= |
| lt | 小于< |
| le | 小于等于<= |
| like | 模糊查詢 LIKE |
| notLike | 模糊查詢 NOT LIKE |
| in | IN 查詢 |
| notIn | NOT IN 查詢 |
| isNull | NULL 值查詢 |
| isNotNull | IS NOT NULL |
| groupBy | 分組 GROUP BY |
| having | HAVING 關鍵詞 |
| orderBy | 排序 ORDER BY |
| orderByAsc | ASC 排序 ORDER BY |
| orderByDesc | DESC 排序 ORDER BY |
| exists | EXISTS 條件語句 |
| notExists | NOT EXISTS 條件語句 |
| between | BETWEEN 條件語句 |
| notBetween | NOT BETWEEN 條件語句 |
| addFilter | 自由拼接 SQL |
| last | 拼接在最后,例如:last("LIMIT 1") |
下面我們來舉一些常見的示例
/*** @Description UserInfoPlusController* @Author Sans* @CreateTime 2019/6/9 14:52*/ ("/userInfoPlus") public class UserInfoPlusController {private UserInfoService userInfoService;/*** MP擴展演示* @Author Sans* @CreateTime 2019/6/8 16:37* @Return Map<String,Object> 返回數據*/("/getInfoListPlus")public Map<String,Object> getInfoListPage(){//初始化返回類Map<String,Object> result = new HashMap<>();//查詢年齡等于18歲的學生//等價SQL: SELECT id,name,age,skill,evaluate,fraction FROM user_info WHERE age = 18QueryWrapper<UserInfoEntity> queryWrapper1 = new QueryWrapper<>();queryWrapper1.lambda().eq(UserInfoEntity::getAge,18);List<UserInfoEntity> userInfoEntityList1 = userInfoService.list(queryWrapper1);result.put("studentAge18",userInfoEntityList1);//查詢年齡大于5歲的學生且小于等于18歲的學生//等價SQL: SELECT id,name,age,skill,evaluate,fraction FROM user_info WHERE age > 5 AND age <= 18QueryWrapper<UserInfoEntity> queryWrapper2 = new QueryWrapper<>();queryWrapper2.lambda().gt(UserInfoEntity::getAge,5);queryWrapper2.lambda().le(UserInfoEntity::getAge,18);List<UserInfoEntity> userInfoEntityList2 = userInfoService.list(queryWrapper2);result.put("studentAge5",userInfoEntityList2);//模糊查詢技能字段帶有"畫"的數據,并按照年齡降序//等價SQL: SELECT id,name,age,skill,evaluate,fraction FROM user_info WHERE skill LIKE '%畫%' ORDER BY age DESCQueryWrapper<UserInfoEntity> queryWrapper3 = new QueryWrapper<>();queryWrapper3.lambda().like(UserInfoEntity::getSkill,"畫");queryWrapper3.lambda().orderByDesc(UserInfoEntity::getAge);List<UserInfoEntity> userInfoEntityList3 = userInfoService.list(queryWrapper3);result.put("studentAgeSkill",userInfoEntityList3);//模糊查詢名字帶有"小"或者年齡大于18的學生//等價SQL: SELECT id,name,age,skill,evaluate,fraction FROM user_info WHERE name LIKE '%小%' OR age > 18QueryWrapper<UserInfoEntity> queryWrapper4 = new QueryWrapper<>();queryWrapper4.lambda().like(UserInfoEntity::getName,"小");queryWrapper4.lambda().or().gt(UserInfoEntity::getAge,18);List<UserInfoEntity> userInfoEntityList4 = userInfoService.list(queryWrapper4);result.put("studentOr",userInfoEntityList4);//查詢評價不為null的學生,并且分頁//等價SQL: SELECT id,name,age,skill,evaluate,fraction FROM user_info WHERE evaluate IS NOT NULL LIMIT 0,5IPage<UserInfoEntity> page = new Page<>();page.setCurrent(1);page.setSize(5);QueryWrapper<UserInfoEntity> queryWrapper5 = new QueryWrapper<>();queryWrapper5.lambda().isNotNull(UserInfoEntity::getEvaluate);page = userInfoService.page(page,queryWrapper5);result.put("studentPage",page);return result;} } 復制代碼五.自定義SQL
引入Mybatis-Plus不會對項目現有的 Mybatis 構架產生任何影響,而且Mybatis-Plus支持所有 Mybatis 原生的特性,這也是我喜歡使用它的原因之一,由于某些業務復雜,我們可能要自己去寫一些比較復雜的SQL語句,我們舉一個簡單的例子來演示自定義SQL.
示例:查詢大于設置分數的學生(分數為動態輸入,且有分頁)
編寫Mapper.xml文件
<mapper namespace="com.mp.demo.dao.UserInfoDao"><!-- Sans 2019/6/9 14:35 --><select id="selectUserInfoByGtFraction" resultType="com.mp.demo.entity.UserInfoEntity" parameterType="long">SELECT * FROM user_info WHERE fraction > #{fraction}</select> </mapper> 復制代碼在DAO中加入方法
/*** 查詢大于該分數的學生* @Author Sans* @CreateTime 2019/6/9 14:28* @Param page 分頁參數* @Param fraction 分數* @Return IPage<UserInfoEntity> 分頁數據*/IPage<UserInfoEntity> selectUserInfoByGtFraction(IPage<UserInfoEntity> page, Long fraction); 復制代碼在service加入方法
/*** 查詢大于該分數的學生* @Author Sans* @CreateTime 2019/6/9 14:27* @Param page 分頁參數* @Param fraction 分數* @Return IPage<UserInfoEntity> 分頁數據*/IPage<UserInfoEntity> selectUserInfoByGtFraction(IPage<UserInfoEntity> page,Long fraction); 復制代碼在serviceImpl加入方法
/*** 查詢大于該分數的學生* @Author Sans* @CreateTime 2019/6/9 14:27* @Param page 分頁參數* @Param fraction 分數* @Return IPage<UserInfoEntity> 分頁數據*/public IPage<UserInfoEntity> selectUserInfoByGtFraction(IPage<UserInfoEntity> page, Long fraction) {return this.baseMapper.selectUserInfoByGtFraction(page,fraction);} 復制代碼在Controller中測試
/*** MP自定義SQL* @Author Sans* @CreateTime 2019/6/9 14:37* @Return IPage<UserInfoEntity> 分頁數據*/("/getInfoListSQL")public IPage<UserInfoEntity> getInfoListSQL(){//查詢大于60分以上的學生,并且分頁IPage<UserInfoEntity> page = new Page<>();page.setCurrent(1);page.setSize(5);page = userInfoService.selectUserInfoByGtFraction(page,60L);return page;} 復制代碼六.項目源碼
項目源碼: gitee.com/liselotte/s…
個人確實很喜歡用MyBatis-Plus,不僅節約時間,代碼也簡潔干凈,它給了我那時候從SSM到SpringBoot過度的那種感覺
嗯,這玩意真香~
謝謝大家閱讀,如果喜歡,請收藏點贊,文章不足之處,也請給出寶貴意見.
轉載于:https://juejin.im/post/5cfa6e465188254ee433bc69
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的SpringBoot整合MyBatis-Plus3.1详细教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开发短视频APP跟上时代的快车
- 下一篇: 远程 不显示本地硬盘解决办法(高级版)