SpringBoot整合mybatis-plus快速入門超詳細教程
前言
mybatis-plus 簡介
mybatis-plus 是一個 Mybatis 的增強工具,在 Mybatis 的基礎上只做增強不做改變,為簡化開發(fā)、提高效率而生。這是官方給的定義,關于mybatis-plus的更多介紹及特性,可以參考mybatis-plus官網(wǎng)。那么它是怎么增強的呢?其實就是它已經(jīng)封裝好了一些crud方法,我們不需要再寫xml了,直接調(diào)用這些方法就行,就類似于JPA。
mybatis-plus 優(yōu)點
- 無侵入:Mybatis-Plus 在 Mybatis 的基礎上進行擴展,只做增強不做改變,引入 Mybatis-Plus 不會對您現(xiàn)有的 Mybatis 構(gòu)架產(chǎn)生任何影響,而且 MP 支持所有 Mybatis 原生的特性
- 依賴少:僅僅依賴 Mybatis 以及 Mybatis-Spring
- 損耗?。簡蛹磿詣幼⑷牖綜URD,性能基本無損耗,直接面向?qū)ο蟛僮?/li>
- 通用CRUD操作:內(nèi)置通用 Mapper、通用 Service,僅僅通過少量配置即可實現(xiàn)單表大部分 CRUD 操作,更有強大的條件構(gòu)造器,滿足各類使用需求
- 多種主鍵策略:支持多達4種主鍵策略(內(nèi)含分布式唯一ID生成器),可自由配置,完美解決主鍵問題
- 支持ActiveRecord:支持 ActiveRecord 形式調(diào)用,實體類只需繼承 Model 類即可實現(xiàn)基本 CRUD 操作
- 支持代碼生成:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來使用(P.S. 比 Mybatis 官方的 Generator 更加強大!)
- 支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 內(nèi)置分頁插件:基于Mybatis物理分頁,開發(fā)者無需關心具體操作,配置好插件之后,寫分頁等同于寫基本List查詢
- 內(nèi)置性能分析插件:可輸出Sql語句以及其執(zhí)行時間,建議開發(fā)測試時啟用該功能,能有效解決慢查詢
- 內(nèi)置全局攔截插件:提供全表 delete 、 update 操作智能分析阻斷,預防誤操作
相關鏈接
下面就先用一個springboot項目演示mybatis-plus 的基礎操作
實例的完整代碼將會放在文章最后
mybatis-plus實例
正如官方所說,mybatis-plus在mybatis的基礎上只做增強不做改變,因此其與spring的整合亦非常簡單。只需把mybatis的依賴換成mybatis-plus的依賴,再把sqlSessionFactory換成mybatis-plus的即可。接下來看具體操作:
1、示例項目結(jié)構(gòu)
2、數(shù)據(jù)庫準備
-- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT, `name` varchar(10) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, `sex` char(6) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, `pwd` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, `email` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 28 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES (1, 'test0', '男', 'aaaa', '1230@qq.com'); INSERT INTO `user` VALUES (2, 'test1', '女', 'aaaa', '1231@qq.com'); INSERT INTO `user` VALUES (3, 'test2', '男', 'aaaa', '1232@qq.com'); INSERT INTO `user` VALUES (4, 'test3', '女', 'aaaa', '1233@qq.com'); INSERT INTO `user` VALUES (5, 'test4', '男', 'aaaa', '1234@qq.com'); INSERT INTO `user` VALUES (6, 'test5', '女', 'aaaa', '1235@qq.com'); INSERT INTO `user` VALUES (7, 'test6', '男', 'aaaa', '1236@qq.com'); INSERT INTO `user` VALUES (8, 'test7', '女', 'aaaa', '1237@qq.com'); INSERT INTO `user` VALUES (9, 'test8', '男', 'aaaa', '1238@qq.com'); INSERT INTO `user` VALUES (10, 'test9', '女', 'aaaa', '1239@qq.com'); INSERT INTO `user` VALUES (11, 'test10', '男', 'aaaa', '12310@qq.com'); INSERT INTO `user` VALUES (12, 'test11', '女', 'aaaa', '12311@qq.com'); INSERT INTO `user` VALUES (13, 'test12', '男', 'aaaa', '12312@qq.com'); INSERT INTO `user` VALUES (14, 'test13', '女', 'aaaa', '12313@qq.com'); INSERT INTO `user` VALUES (15, 'test14', '男', 'aaaa', '12314@qq.com');
3、pom.xml:
核心依賴如下:
<!--mybatis-plus的springboot支持--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3.1</version> </dependency> <!--mysql驅(qū)動--> <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> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> <scope>test</scope> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-core</artifactId> <version>3.4.3.1</version> </dependency>
注意:這些是核心依賴,本項目還用到了mysql驅(qū)動、lombok。集成mybatis-plus要把mybatis、mybatis-spring去掉,避免沖突;lombok是一個工具,添加了這個依賴,開發(fā)工具再安裝Lombok插件,就可以使用它了,最常用的用法就是在實體類中使用它的@Data注解,這樣實體類就不用寫set、get、toString等方法了。
4、application.yml
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #開啟sql日志 map-underscore-to-camel-case: true # 該配置就是將帶有下劃線的表字段映射為駝峰格式的實體類屬性 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mybits?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8 username: root password: aaaa
5、User.java
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Builder; import lombok.Data; @Data @Builder @TableName(value = "User")//指定表名 public class User implements Serializable { private static final long serialVersionUID = -5644799954031156649L; //value與數(shù)據(jù)庫主鍵列名一致,若實體類屬性名與表主鍵列名一致可省略value @TableId(value = "id", type = IdType.AUTO)//指定自增策略 private Integer id; private String name; private String sex; private String pwd; private String email; }
6、UserMapper.java
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.king.mybatis_plus.bean.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; @Mapper //表明這是一個Mapper,也可以在啟動類上加上包掃描 //Mapper 繼承該接口后,無需編寫 mapper.xml 文件,即可獲得CRUD功能 public interface UserMapper extends BaseMapper<User> { }
這樣就完成了mybatis-plus與springboot的整合。首先是把mybatis和mybatis-spring依賴換成mybatis-plus的依賴,然后把sqlsessionfactory換成mybatis-plus的,然后實體類中添加@TableName、@TableId等注解,最后mapper繼承BaseMapper即可。
7、UserServiceImpl.java
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.king.mybatis_plus.bean.User; import com.king.mybatis_plus.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; @Service public class UserServiceImpl { @Autowired UserMapper userMapper; //查詢?nèi)? public List<User> queryAll() { return userMapper.selectList(null); } }
8、測試類
import com.king.mybatis_plus.bean.User; import com.king.mybatis_plus.service.UserServiceImpl; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.*; @SpringBootTest public class UserServiceImplTest { @Autowired UserServiceImpl userService; @Test public void queryAll() { userService.queryAll().forEach(System.out::println); } }
本文所有代碼本人均親自測試過,本文涉及代碼又較多,為了不影響篇幅,故非必要處不再截圖。接下來的所有操作都是基于此整合好的項目。
mybatis-plus的crud:
這些方法都寫在UserServiceImpl.java中
1、insert操作:
//添加一條數(shù)據(jù) public int add(User user) { return userMapper.insert(user); } //添加多條數(shù)據(jù) public void add(List<User> users) { for (User user : users) { add(user); } }
執(zhí)行添加操作,直接調(diào)用insert方法傳入實體即可。
2、select操作:
查詢?nèi)?/p>
public List<User> queryAll() { return userMapper.selectList(null); }
通過id查詢
public User queryById(User user) { return userMapper.selectById(user.getId()); }
通過姓名模糊查詢
public List<User> queryByName(String name) { QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(); userQueryWrapper.like("name", name); //參數(shù)為表中的列名,要查詢的條件 相當于 WHERE name LIKE %name% return userMapper.selectList(userQueryWrapper); }
通過姓名精確查詢
public List<User> queryByName2(String name) { QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(); userQueryWrapper.eq("name", name);//參數(shù)為表中的列名,要查詢的條件 相當于 WHERE name = name return userMapper.selectList(userQueryWrapper); }
注
:還可以使用map來實現(xiàn)相同的效果
public List<User> queryByNameMap(String name) { Map<String, Object> map = new HashMap<>(); map.put("name", name); return userMapper.selectByMap(map); }
通過Id查詢批量查詢
public List<User> queryByIds() { List<Integer> idList = new ArrayList<>(); idList.add(10); idList.add(11); return userMapper.selectBatchIds(idList); }
計數(shù)
public int count() { QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(); return userMapper.selectCount(userQueryWrapper); }
注
:也可以和上面的一樣加入各種條件
3、update操作:
// 根據(jù)條件更新 public void changeBy(User user, String column, Object val) { QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(); userQueryWrapper.eq(column, val); int num = userMapper.update(user, userQueryWrapper); System.out.println("影響行數(shù):" + num); } // 通過ID修改信息 public void changeUserById(User user) { int num = userMapper.updateById(user); System.out.println("影響行數(shù):" + num); }
4、delete操作:
通過ID刪除
public int deleteById(User user) { return userMapper.deleteById(user.getId()); }
通過條件刪除
public void deleteBy(String column, Object val) { QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(); userQueryWrapper.eq(column, val); int num = userMapper.delete(userQueryWrapper); System.out.println("影響行數(shù):" + num); }
public void delete(Map<String, Object> map) { userMapper.deleteByMap(map); }
注:該方法與selectByMap類似,將條件封裝在columnMap中,然后調(diào)用deleteByMap方法,傳入columnMap即可,返回值是Integer類型,表示影響的行數(shù)。
通過id批量刪除
public void deleteByIds() { List<Integer> idList = new ArrayList<>(); idList.add(10); idList.add(11); int num = userMapper.deleteBatchIds(idList); System.out.println("影響行數(shù):" + num); }
注:該方法和selectBatchIds類似,把需要刪除的記錄的id裝進idList,然后調(diào)用deleteBatchIds,傳入idList即可。
最后直接放上我的測試類供參考
@SpringBootTest public class UserServiceImplTest { @Autowired UserServiceImpl userService; @Test public void queryAll() { userService.queryAll().forEach(System.out::println); } @Test public void add() { List<User> users = new ArrayList<>(); for (int i = 0; i < 15; ++i) { User user = User.builder().id(i + 1).name("test" + i).sex(i % 2 == 0 ? "男" : "女").pwd("aaaa").email("123" + i + "@qq.com").build(); users.add(user); } users.forEach(System.out::println); userService.add(users); } @Test public void query() { userService.queryAll().forEach(System.out::println); userService.queryByName1("test1").forEach(System.out::println); userService.queryByName2("test1").forEach(System.out::println); User user = userService.queryById(User.builder().id(2).build()); System.out.println(user); userService.queryByNameMap("test1").forEach(System.out::println); System.out.println(userService.count()); } @Test public void delete() { User user = User.builder().id(2).build(); userService.deleteById(user); userService.deleteBy("name", "test15"); userService.deleteByIds(); } @Test public void change() { User user1 = User.builder().name("蔡徐坤").build(); userService.changeBy(user1, "sex", "男"); user1.setName("蔡徐坤2"); userService.changeUserById(user1); } }
總結(jié)
以上便是mybatis-plus的入門教程,介紹了其如何與springboot整合、通用crud的使用,但是這并不是mybatis-plus的所有內(nèi)容,其強大不限于此。
最后附上我的演示例源碼
Github
https://github.com/KingJin-web/springboot/tree/master/mybatis_plus
到此這篇關于SpringBoot整合mybatis-plus快速入門超詳細教程的文章就介紹到這了,更多相關SpringBoot整合mybatis-plus入門內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring boot整合Mybatis實現(xiàn)級聯(lián)一對多CRUD操作的完整步驟
這篇文章主要給大家介紹了關于Spring boot整合Mybatis實現(xiàn)級聯(lián)一對多CRUD操作的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-07-07一文教會Java新手使用Spring?MVC中的查詢字符串和查詢參數(shù)
在使用springMVC框架構(gòu)建web應用,客戶端常會請求字符串、整型、json等格式的數(shù)據(jù),這篇文章主要給大家介紹了關于通過一文教會Java新手使用Spring?MVC中的查詢字符串和查詢參數(shù)的相關資料,需要的朋友可以參考下2024-01-01