您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)SpringBoot中怎么整合MyBatis-Plus3.1,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
一.說明
Mybatis-Plus是一個(gè)Mybatis框架的增強(qiáng)插件,根據(jù)官方描述,MP只做增強(qiáng)不做改變,引入它不會(huì)對現(xiàn)有工程產(chǎn)生影響,如絲般順滑.并且只需簡單配置,即可快速進(jìn)行 CRUD 操作,從而節(jié)省大量時(shí)間.代碼生成,分頁,性能分析等功能一應(yīng)俱全,最新已經(jīng)更新到了3.1.1版本了,3.X系列支持lambda語法,讓我在寫條件構(gòu)造的時(shí)候少了很多的"魔法值",從代碼結(jié)構(gòu)上更簡潔了.
二.項(xiàng)目環(huán)境
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> <!-- 引入阿里數(shù)據(jù)庫連接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.6</version> </dependency> </dependencies>
配置如下:
# 配置端口 server: port: 8081 spring: # 配置數(shù)據(jù)源 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相關(guān)配置 mybatis-plus: # xml掃描,多個(gè)目錄用逗號或者分號分隔(告訴 Mapper 所對應(yīng)的 XML 文件位置) mapper-locations: classpath:mapper/*.xml # 以下配置均有默認(rèn)值,可以不設(shè)置 global-config: db-config: #主鍵類型 AUTO:"數(shù)據(jù)庫ID自增" INPUT:"用戶輸入ID",ID_WORKER:"全局唯一ID (數(shù)字類型唯一ID)", UUID:"全局唯一ID UUID"; id-type: auto #字段策略 IGNORED:"忽略判斷" NOT_NULL:"非 NULL 判斷") NOT_EMPTY:"非空判斷" field-strategy: NOT_EMPTY #數(shù)據(jù)庫類型 db-type: MYSQL configuration: # 是否開啟自動(dòng)駝峰命名規(guī)則映射:從數(shù)據(jù)庫列名到Java屬性駝峰命名的類似映射 map-underscore-to-camel-case: true # 如果查詢結(jié)果中包含空值的列,則 MyBatis 在映射的時(shí)候,不會(huì)映射這個(gè)字段 call-setters-on-nulls: true # 這個(gè)配置會(huì)將執(zhí)行的sql打印出來,在開發(fā)或測試的時(shí)候可以用 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 表結(jié)構(gòu): 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 '評價(jià)', `fraction` bigint(11) DEFAULT NULL COMMENT '分?jǐn)?shù)', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COMMENT='學(xué)生信息表'; 表數(shù)據(jù): INSERT INTO `user_info` VALUES (1, '小明', 20, '畫畫', '該學(xué)生在畫畫方面有一定天賦', 89); INSERT INTO `user_info` VALUES (2, '小蘭', 19, '游戲', '近期該學(xué)生由于游戲的原因?qū)е路謹(jǐn)?shù)降低了', 64); INSERT INTO `user_info` VALUES (3, '張張', 18, '英語', '近期該學(xué)生參加英語比賽獲得二等獎(jiǎng)', 90); INSERT INTO `user_info` VALUES (4, '大黃', 20, '體育', '該學(xué)生近期由于參加籃球比賽,導(dǎo)致腳傷', 76); INSERT INTO `user_info` VALUES (5, '大白', 17, '繪畫', '該學(xué)生參加美術(shù)大賽獲得三等獎(jiǎng)', 77); INSERT INTO `user_info` VALUES (7, '小龍', 18, 'JAVA', '該學(xué)生是一個(gè)在改BUG的碼農(nóng)', 59); INSERT INTO `user_info` VALUES (9, 'Sans', 18, '睡覺', 'Sans是一個(gè)愛睡覺,并且身材較矮骨骼巨大的骷髏小胖子', 60); INSERT INTO `user_info` VALUES (10, 'papyrus', 18, 'JAVA', 'Papyrus是一個(gè)講話大聲、個(gè)性張揚(yáng)的骷髏,給人自信、有魅力的骷髏小瘦子', 58); INSERT INTO `user_info` VALUES (11, '刪除數(shù)據(jù)1', 3, '畫肖像', NULL, 61); INSERT INTO `user_info` VALUES (12, '刪除數(shù)據(jù)2', 3, NULL, NULL, 61); INSERT INTO `user_info` VALUES (13, '刪除數(shù)據(jù)3', 3, NULL, NULL, 61); INSERT INTO `user_info` VALUES (14, '刪除數(shù)據(jù)4', 5, '刪除', NULL, 10); INSERT INTO `user_info` VALUES (15, '刪除數(shù)據(jù)5', 6, '刪除', NULL, 10);
三.編寫基礎(chǔ)類
在啟動(dòng)類上添加掃描DAO的注解
@SpringBootApplication @MapperScan(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 */ @Configuration public class MybatisPlusConfig { /** * mybatis-plus SQL執(zhí)行效率插件【生產(chǎn)環(huán)境可以關(guān)閉】 */ @Bean public PerformanceInterceptor performanceInterceptor() { return new PerformanceInterceptor(); } /** * 分頁插件 */ @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } }
編寫Entity類
/** * @Description 學(xué)生信息實(shí)體類 * @Author Sans * @CreateTime 2019/5/26 21:41 */ @Data @TableName("user_info")//@TableName中的值對應(yīng)著表名 public class UserInfoEntity { /** * 主鍵 * @TableId中可以決定主鍵的類型,不寫會(huì)采取默認(rèn)值,默認(rèn)值可以在yml中配置 * AUTO: 數(shù)據(jù)庫ID自增 * INPUT: 用戶輸入ID * ID_WORKER: 全局唯一ID,Long類型的主鍵 * ID_WORKER_STR: 字符串全局唯一ID * UUID: 全局唯一ID,UUID類型的主鍵 * NONE: 該類型為未設(shè)置主鍵類型 */ @TableId(type = IdType.AUTO) private Long id; /** * 姓名 */ private String name; /** * 年齡 */ private Integer age; /** * 技能 */ private String skill; /** * 評價(jià) */ private String evaluate; /** * 分?jǐn)?shù) */ private Long fraction; }
編寫Dao類
/** * @Description 用戶信息DAO * @Author Sans * @CreateTime 2019/6/8 16:24 */ public interface UserInfoDao extends BaseMapper<UserInfoEntity> { }
編寫Service類
/** * @Description 用戶業(yè)務(wù)接口 * @Author Sans * @CreateTime 2019/6/8 16:26 */ public interface UserInfoService extends IService<UserInfoEntity> { }
編寫ServiceImpl類
/** * @Description 用戶業(yè)務(wù)實(shí)現(xiàn) * @Author Sans * @CreateTime 2019/6/8 16:26 */ @Service @Transactional public class UserInfoSerivceImpl extends ServiceImpl<UserInfoDao, UserInfoEntity> implements UserInfoService { }
四.MyBatis-Plus基礎(chǔ)演示
這里我們看到,service中我們沒有寫任何方法,MyBatis-Plus官方封裝了許多基本CRUD的方法,可以直接使用大量節(jié)約時(shí)間,MP共通方法詳見IService,ServiceImpl,BaseMapper源碼,寫入操作在ServiceImpl中已有事務(wù)綁定,這里我們舉一些常用的方法演示.
/** * @Description UserInfoController * @Author Sans * @CreateTime 2019/6/8 16:27 */ @RestController @RequestMapping("/userInfo") public class UserInfoController { @Autowired private UserInfoService userInfoService; /** * 根據(jù)ID獲取用戶信息 * @Author Sans * @CreateTime 2019/6/8 16:34 * @Param userId 用戶ID * @Return UserInfoEntity 用戶實(shí)體 */ @RequestMapping("/getInfo") public UserInfoEntity getInfo(String userId){ UserInfoEntity userInfoEntity = userInfoService.getById(userId); return userInfoEntity; } /** * 查詢?nèi)啃畔? * @Author Sans * @CreateTime 2019/6/8 16:35 * @Param userId 用戶ID * @Return List<UserInfoEntity> 用戶實(shí)體集合 */ @RequestMapping("/getList") public List<UserInfoEntity> getList(){ List<UserInfoEntity> userInfoEntityList = userInfoService.list(); return userInfoEntityList; } /** * 分頁查詢?nèi)繑?shù)據(jù) * @Author Sans * @CreateTime 2019/6/8 16:37 * @Return IPage<UserInfoEntity> 分頁數(shù)據(jù) */ @RequestMapping("/getInfoListPage") public IPage<UserInfoEntity> getInfoListPage(){ //需要在Config配置類中配置分頁插件 IPage<UserInfoEntity> page = new Page<>(); page.setCurrent(5); //當(dāng)前頁 page.setSize(1); //每頁條數(shù) page = userInfoService.page(page); return page; } /** * 根據(jù)指定字段查詢用戶信息集合 * @Author Sans * @CreateTime 2019/6/8 16:39 * @Return Collection<UserInfoEntity> 用戶實(shí)體集合 */ @RequestMapping("/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 */ @RequestMapping("/saveInfo") public void saveInfo(){ UserInfoEntity userInfoEntity = new UserInfoEntity(); userInfoEntity.setName("小龍"); userInfoEntity.setSkill("JAVA"); userInfoEntity.setAge(18); userInfoEntity.setFraction(59L); userInfoEntity.setEvaluate("該學(xué)生是一個(gè)在改BUG的碼農(nóng)"); userInfoService.save(userInfoEntity); } /** * 批量新增用戶信息 * @Author Sans * @CreateTime 2019/6/8 16:42 */ @RequestMapping("/saveInfoList") public void saveInfoList(){ //創(chuàng)建對象 UserInfoEntity sans = new UserInfoEntity(); sans.setName("Sans"); sans.setSkill("睡覺"); sans.setAge(18); sans.setFraction(60L); sans.setEvaluate("Sans是一個(gè)愛睡覺,并且身材較矮骨骼巨大的骷髏小胖子"); UserInfoEntity papyrus = new UserInfoEntity(); papyrus.setName("papyrus"); papyrus.setSkill("JAVA"); papyrus.setAge(18); papyrus.setFraction(58L); papyrus.setEvaluate("Papyrus是一個(gè)講話大聲、個(gè)性張揚(yáng)的骷髏,給人自信、有魅力的骷髏小瘦子"); //批量保存 List<UserInfoEntity> list =new ArrayList<>(); list.add(sans); list.add(papyrus); userInfoService.saveBatch(list); } /** * 更新用戶信息 * @Author Sans * @CreateTime 2019/6/8 16:47 */ @RequestMapping("/updateInfo") public void updateInfo(){ //根據(jù)實(shí)體中的ID去更新,其他字段如果值為null則不會(huì)更新該字段,參考yml配置文件 UserInfoEntity userInfoEntity = new UserInfoEntity(); userInfoEntity.setId(1L); userInfoEntity.setAge(19); userInfoService.updateById(userInfoEntity); } /** * 新增或者更新用戶信息 * @Author Sans * @CreateTime 2019/6/8 16:50 */ @RequestMapping("/saveOrUpdateInfo") public void saveOrUpdate(){ //傳入的實(shí)體類userInfoEntity中ID為null就會(huì)新增(ID自增) //實(shí)體類ID值存在,如果數(shù)據(jù)庫存在ID就會(huì)更新,如果不存在就會(huì)新增 UserInfoEntity userInfoEntity = new UserInfoEntity(); userInfoEntity.setId(1L); userInfoEntity.setAge(20); userInfoService.saveOrUpdate(userInfoEntity); } /** * 根據(jù)ID刪除用戶信息 * @Author Sans * @CreateTime 2019/6/8 16:52 */ @RequestMapping("/deleteInfo") public void deleteInfo(String userId){ userInfoService.removeById(userId); } /** * 根據(jù)ID批量刪除用戶信息 * @Author Sans * @CreateTime 2019/6/8 16:55 */ @RequestMapping("/deleteInfoList") public void deleteInfoList(){ List<String> userIdlist = new ArrayList<>(); userIdlist.add("12"); userIdlist.add("13"); userInfoService.removeByIds(userIdlist); } /** * 根據(jù)指定字段刪除用戶信息 * @Author Sans * @CreateTime 2019/6/8 16:57 */ @RequestMapping("/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條件構(gòu)造器
當(dāng)查詢條件復(fù)雜的時(shí)候,我們可以使用MP的條件構(gòu)造器,請參考下面的QueryWrapper條件參數(shù)說明
下面我們來舉一些常見的示例
/** * @Description UserInfoPlusController * @Author Sans * @CreateTime 2019/6/9 14:52 */ @RestController @RequestMapping("/userInfoPlus") public class UserInfoPlusController { @Autowired private UserInfoService userInfoService; /** * MP擴(kuò)展演示 * @Author Sans * @CreateTime 2019/6/8 16:37 * @Return Map<String,Object> 返回?cái)?shù)據(jù) */ @RequestMapping("/getInfoListPlus") public Map<String,Object> getInfoListPage(){ //初始化返回類 Map<String,Object> result = new HashMap<>(); //查詢年齡等于18歲的學(xué)生 //等價(jià)SQL: SELECT id,name,age,skill,evaluate,fraction FROM user_info WHERE age = 18 QueryWrapper<UserInfoEntity> queryWrapper1 = new QueryWrapper<>(); queryWrapper1.lambda().eq(UserInfoEntity::getAge,18); List<UserInfoEntity> userInfoEntityList1 = userInfoService.list(queryWrapper1); result.put("studentAge18",userInfoEntityList1); //查詢年齡大于5歲的學(xué)生且小于等于18歲的學(xué)生 //等價(jià)SQL: SELECT id,name,age,skill,evaluate,fraction FROM user_info WHERE age > 5 AND age <= 18 QueryWrapper<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); //模糊查詢技能字段帶有"畫"的數(shù)據(jù),并按照年齡降序 //等價(jià)SQL: SELECT id,name,age,skill,evaluate,fraction FROM user_info WHERE skill LIKE '%畫%' ORDER BY age DESC QueryWrapper<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的學(xué)生 //等價(jià)SQL: SELECT id,name,age,skill,evaluate,fraction FROM user_info WHERE name LIKE '%小%' OR age > 18 QueryWrapper<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); //查詢評價(jià)不為null的學(xué)生,并且分頁 //等價(jià)SQL: SELECT id,name,age,skill,evaluate,fraction FROM user_info WHERE evaluate IS NOT NULL LIMIT 0,5 IPage<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不會(huì)對項(xiàng)目現(xiàn)有的 Mybatis 構(gòu)架產(chǎn)生任何影響,而且Mybatis-Plus支持所有 Mybatis 原生的特性,這也是我喜歡使用它的原因之一,由于某些業(yè)務(wù)復(fù)雜,我們可能要自己去寫一些比較復(fù)雜的SQL語句,我們舉一個(gè)簡單的例子來演示自定義SQL.
示例:查詢大于設(shè)置分?jǐn)?shù)的學(xué)生(分?jǐn)?shù)為動(dòng)態(tài)輸入,且有分頁)
編寫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中加入方法
IPage<UserInfoEntity> selectUserInfoByGtFraction(IPage<UserInfoEntity> page, Long fraction);
在service加入方法
IPage<UserInfoEntity> selectUserInfoByGtFraction(IPage<UserInfoEntity> page,Long fraction);
在serviceImpl加入方法
@Override public IPage<UserInfoEntity> selectUserInfoByGtFraction(IPage<UserInfoEntity> page, Long fraction) { return this.baseMapper.selectUserInfoByGtFraction(page,fraction); }
在Controller中測試
@RequestMapping("/getInfoListSQL") public IPage<UserInfoEntity> getInfoListSQL(){ //查詢大于60分以上的學(xué)生,并且分頁 IPage<UserInfoEntity> page = new Page<>(); page.setCurrent(1); page.setSize(5); page = userInfoService.selectUserInfoByGtFraction(page,60L); return page; }
看完上述內(nèi)容,你們對SpringBoot中怎么整合MyBatis-Plus3.1有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。