MyBatis-Plus实现数据库curd操作
文章目錄
- MyBatis-Plus
- 2.1、mp入門
- MP主鍵策略
- 2.2、curd
- 2.3、自動填充
- 3、樂觀鎖
- 3.1、場景
- MP實現樂觀鎖。
- 4、MP查詢
- 4.1、多個ID批量查詢
- 4.2、簡單條件查詢(Map)
- 4.3、分頁查詢
- 5、MP刪除
- 5.1、物理刪除和邏輯刪除
- 邏輯刪除
- 6、條件構造器和常用接口(wrapper)
- 7、性能分析插件
- 8、代碼自動生成器
MyBatis-Plus
MyBatis-Plus實現數據庫curd操作
mp是什么
- MyBatis-Plus(簡稱MP)是一個MyBatis 的增強工具,在MyBatis,的基礎上只做增強不做改變,為簡化開發、提高效率而生。
- 潤物無聲,
- 只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑。v
效率至上, - 只需簡單配置,即可快速進行CRUD操作,從而節省大量時間。v
- 豐富功能
- 熱加載、代碼生成、分頁、性能分析等功能一應俱全。·
mp實現添加修改刪除查詢
mp自動填充樂觀鎖
mp邏輯刪除
mp分頁查詢
2.1、mp入門
CREATE TABLE `user` (`id` bigint NOT NULL COMMENT '主鍵ID',`name` varchar(30) DEFAULT NULL COMMENT '姓名',`age` int DEFAULT NULL COMMENT '年齡',`email` varchar(50) DEFAULT NULL COMMENT '郵箱',PRIMARY KEY (`id`) )INSERT INTO `user`(`id`,`name`,`age`,`email`) VALUES (1,'Jone',18,'test1@baomidou.com'), (2,'Jack',20,'test2@baomidou.com'), (3,'Tom',28,'test3@baomidou.com'), (4,'Sandy',21,'test4@baomidou.com'), (5,'Billie',24,'test5@baomidou.com');sprinboot版本 2. 2.1
引入相關依賴
<!--mp--> <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version> </dependency> <!--mysql--> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> </dependency> <!--lombok--> <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId> </dependency>下載好lombok插件
配置數據庫信息
創建實體類User
創建對應的Mapper
繼承BaseMapper,里面封裝了常用的增刪查改方法
在啟動類上增加掃描該mapper的路徑。因為是該接口動態生成的,默認掃描不到、
@Autowired 對類成員變量、方法及構造函數進行標注,完成自動裝配的工作。
通過 @Autowired的使用來消除 set ,get方法
@Repository、@Service、@Controller 和 @Component 將類標識為Bean
@Repository(“名稱”):dao層
@Service(“名稱”):service層
@Controller(“名稱”):web層
MP主鍵策略
默認開啟ASSIGN_ID
#全局設置主鍵生成策略
mybatis-plus.global-config.db-config.id-type=auto
2.2、curd
查找
void findAll() {List<User> users = userMapper.selectList(null);users.forEach(System.out::println); }增加
void addUser(){User user = new User(12L, "黎明", 23, "592923@qq.com");int insert = userMapper.insert(user); //影響行數System.out.println(insert); }修改
public void upData(){User user = new User();user.setId(12L);user.setName("hhha");int i = userMapper.updateById(user);System.out.println("影響行數"+i); }2.3、自動填充
字段賦值的時候需要set
增加兩個字段,對應的實體類也增加
@TableField(fill = FieldFill.INSERT) private Data createTime;@TableField(fill = FieldFill.INSERT_UPDATE) private Data updateTime;點進去看該注解的FieldFill類
需要建一個類開啟自動填充的處理器。
不要忘記添加注解將它交給Spring管理
@Component public class MyMetaObjectHandler implements MetaObjectHandler {//實現兩個方法,自動填充增加、修改,設置填充策略 }3、樂觀鎖
3.1、場景
主要適用場景:當要更新一條記錄的時候,希望這條記錄沒有被別人更新,也就是說實現線程安全的數據更新
解決丟失更新的問題。(可重復讀,解決了不可重復讀,隔離性第三級別,Mysql默認)
樂觀鎖實現方式:
取出記錄時,獲取當前versione更新時,帶上這個versionv
執行更新時,set version = newexsion where version = oldVersion
如果version不對,就更新失敗
提交后修改版本號,另一個提交時,會先檢查版本號和獲取時是否一樣,不一樣提交失敗,一樣提交成功。
MP實現樂觀鎖。
1.顯然,需要在表中加上字段version,實體類也是
添加注解@Version即可 (樂觀鎖注解)
3.配置樂觀鎖插件,Spring Boot創建一個配置類
添加配置注解,添加掃描,創建一個樂觀鎖插件
@Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor(); }測試 失敗案例
@Test void lock() {User user = userMapper.selectById(1L); //注意該值需要從數據庫中取出user.setName("ZhangSan");User user2 = userMapper.selectById(1L);user2.setName("LiSi");//user2執行插隊userMapper.updateById(user2);userMapper.updateById(user); }4、MP查詢
4.1、多個ID批量查詢
selectBatchIds():Batch 批量
@Test public void select1() {List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));for (User user : users) {System.out.println(user);} }4.2、簡單條件查詢(Map)
public void select2(){Map<String, Object> columnMap = new HashMap<>();columnMap.put("name", "Jack");// name =JackcolumnMap.put("age", "20");List<User> users = userMapper.selectByMap(columnMap);System.out.println(users); }4.3、分頁查詢
public void selectPage() {Page<User> page = new Page<>(1,3);Page<User> userPage = userMapper.selectPage(page,null);long pages = userPage.getPages();//總頁數long current = userPage.getCurrent();//當前頁List<User> records = userPage.getRecords();//數據集合long total = userPage.getTotal();boolean hasNext = userPage.hasNext();//是否還有下一頁boolean previous = userPage.hasPrevious();//上一頁System.out.println(pages);System.out.println(current);System.out.println(records);System.out.println(total); }5、MP刪除
-
簡單刪除,根據id刪除。邏輯同上
-
批量刪除
-
和批量查詢一樣
-
簡單條件刪除,和上面一樣,使用map
5.1、物理刪除和邏輯刪除
物理刪除∶真實刪除,將對應數據從數據庫中刪除,之后查詢不到此條被刪除數據(易懂)
**邏輯刪除︰**假刪除,將對應數據中代表是否被刪除字段狀態修改為"被刪除狀態”,之后在數據庫中仍舊能看到此條數據記錄;
邏輯刪除
邏輯刪除實現的邏輯:
在表添加字段,作為邏輯刪除標志,每次刪除時候,修改標志位
0沒有刪除
1刪除
1.表添加字段,實體類添加屬性,這是標志
2.增加注解@TableLogic :表邏輯
執行刪除會將該字段的值設為1.
當該字段的值為1時,MP查不到該數據,但是該數據仍在數據庫中存在
添加邏輯刪除的組件
//邏輯刪除組件 @Bean public ISqlInjector sqlInjector() {return new LogicSqlInjector(); } //邏輯刪除組件 @Bean public ISqlInjector sqlInjector() {return new LogicSqlInjector(); } # 配置邏輯刪除 mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0官網版本有更新說明,版本不同配置不同。
注意:在數據庫中該字段需要設置默認值,否則為null ,查不到0,不能將其改為1
增加了邏輯刪除后,相當于在添加了AND deleted=0 的條件,雖然概述就仍在數據庫,但是使用普通查詢查不到。
6、條件構造器和常用接口(wrapper)
Wapper的使用
public void testWrapper1() {/*** ge :大于等于* gt: 大于* le : <=* lt : <*/QueryWrapper<User> wrapper = new QueryWrapper<>();QueryWrapper<User> queryWrapper = wrapper.ge("age", 18);List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println); }SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND (age >= ?)ge:大于等于
gt: 大于
le : <=
lt : <
eq :=
ne :!=
between: 閉區間
notBetween: 閉區間
**用的多:**模糊查詢
like 包含 %張%
notLike 不包含
likeLeft 張%
likeRight 張%
排序
orderBy、orderByDesc、orderByAsc. (參數)
<el-table:data="list"style="width: 100%"row-key="id"borderlazy:load="getChildrens":tree-props="{children: 'children', hasChildren: 'hasChildren'}"><el-table-column label="名稱" width="230" align="left"><template slot-scope="scope"><span>{{ scope.row.name }}</span></template></el-table-column><el-table-column label="編碼" width="220"><template slot-scope="{row}">{{ row.dictCode }}</template></el-table-column><el-table-column label="值" width="230" align="left"><template slot-scope="scope"><span>{{ scope.row.value }}</span></template></el-table-column><el-table-column label="創建時間" align="center"><template slot-scope="scope"><span>{{ scope.row.createTime }}</span></template></el-table-column></el-table>7、性能分析插件
對應新版的執行SQL分析打印插件
作用:輸出打印 SQL 及執行時長,不要再生產環境下使用,因為會影響效率
基于舊版
導入插件:
/*** sql執行效率插件*/@Bean@Profile({"dev","test"}) //在這兩個環境下開啟public PerformanceInterceptor performanceInterceptor() {PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();performanceInterceptor.setMaxTime(1);// ms 設置sql執行的最大時間,如果時間超過了則不執行。如果報錯需要調大return performanceInterceptor;} # 設置開發環境 spring.profiles.active=dev使用該插件,可以幫助我們優化性能,把執行耗時長的sql揪出來優化
8、代碼自動生成器
MyBatis-Plus 從 3.0.3 之后移除了代碼生成器與模板引擎的默認依賴,需要手動添加相關依賴:
添加 代碼生成器 依賴
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.0.5</version> </dependency>添加模板依賴:MyBatis-Plus 支持 Velocity(默認)、Freemarker、Beetl,用戶可以選擇自己熟悉的模板引擎,如果都不滿足您的要求,可以采用自定義模板引擎。
<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version> </dependency> <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version> </dependency> package com.yong;import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.InjectionConfig; import com.baomidou.mybatisplus.generator.config.*; import com.baomidou.mybatisplus.generator.config.po.TableInfo; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;import java.util.ArrayList; import java.util.List; import java.util.Scanner;import static org.junit.platform.commons.util.StringUtils.isNotBlank;/*** @Author cyh* @Date 2021/12/25 23:20*/ public class CodeGenerator {/*** <p>* 讀取控制臺內容* </p>*/public static String scanner(String tip) {Scanner scanner = new Scanner(System.in);StringBuilder help = new StringBuilder();help.append("請輸入" + tip + ":");System.out.println(help.toString());if (scanner.hasNext()) {String ipt = scanner.next();if (isNotBlank(ipt)) {return ipt;}}throw new MybatisPlusException("請輸入正確的" + tip + "!");}public static void main(String[] args) {// 代碼生成器AutoGenerator mpg = new AutoGenerator();// 全局配置GlobalConfig gc = new GlobalConfig();String projectPath = System.getProperty("user.dir");gc.setOutputDir(projectPath + "/src/main/java");gc.setAuthor("cyh");gc.setOpen(false);// gc.setSwagger2(true); 實體屬性 Swagger2 注解mpg.setGlobalConfig(gc);// 數據源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setUrl("jdbc:mysql://localhost:3306/mybatis?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai");// dsc.setSchemaName("public");dsc.setDriverName("com.mysql.jdbc.Driver");dsc.setUsername("root");dsc.setPassword("123456");mpg.setDataSource(dsc);// 包配置PackageConfig pc = new PackageConfig();pc.setModuleName(scanner("模塊")); //主要是這里pc.setParent("com.yong");mpg.setPackageInfo(pc);// 自定義配置InjectionConfig cfg = new InjectionConfig() {@Overridepublic void initMap() {// to do nothing}};// 如果模板引擎是 freemarkerString templatePath = "/templates/mapper.xml.ftl";// 如果模板引擎是 velocity// String templatePath = "/templates/mapper.xml.vm";// 自定義輸出配置List<FileOutConfig> focList = new ArrayList<>();// 自定義配置會被優先輸出focList.add(new FileOutConfig(templatePath) {@Overridepublic String outputFile(TableInfo tableInfo) {// 自定義輸出文件名 , 如果你 Entity 設置了前后綴、此處注意 xml 的名稱會跟著發生變化!!return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;}});/*cfg.setFileCreate(new IFileCreate() {@Overridepublic boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {// 判斷自定義文件夾是否需要創建checkDir("調用默認方法創建的目錄,自定義目錄用");if (fileType == FileType.MAPPER) {// 已經生成 mapper 文件判斷存在,不想重新生成返回 falsereturn !new File(filePath).exists();}// 允許生成模板文件return true;}});*/cfg.setFileOutConfigList(focList);mpg.setCfg(cfg);// 配置模板TemplateConfig templateConfig = new TemplateConfig();// 配置自定義輸出模板//指定自定義模板路徑,注意不要帶上.ftl/.vm, 會根據使用的模板引擎自動識別// templateConfig.setEntity("templates/entity2.java");// templateConfig.setService();// templateConfig.setController();templateConfig.setXml(null);mpg.setTemplate(templateConfig);// 策略配置StrategyConfig strategy = new StrategyConfig();strategy.setNaming(NamingStrategy.underline_to_camel);strategy.setColumnNaming(NamingStrategy.underline_to_camel);//strategy.setSuperEntityClass("你自己的父類實體,沒有就不用設置!");strategy.setEntityLombokModel(true);strategy.setRestControllerStyle(true);// 公共父類//strategy.setSuperControllerClass("你自己的父類控制器,沒有就不用設置!");// 寫于父類中的公共字段strategy.setSuperEntityColumns("id");strategy.setInclude(scanner("表名,多個英文逗號分割").split(","));strategy.setControllerMappingHyphenStyle(true);strategy.setTablePrefix(pc.getModuleName() + "_");mpg.setStrategy(strategy);mpg.setTemplateEngine(new FreemarkerTemplateEngine());mpg.execute();} }總結
以上是生活随笔為你收集整理的MyBatis-Plus实现数据库curd操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蚂蚁笔记(Leanote)------一
- 下一篇: Unity 5 物理