公司從 MyBatis 升級爲MyBatis-Plus,所以開始學習,在這裏留下學習總結,也希望能帶給讀者一些幫助,同時文章中有什麼不對的地方歡迎指出。
HERE 直達 MyBatis-Plus 官網
HERE 直達 MyBatis-Plus 02- 深入學習
文章目錄
一、什麼是MyBatis-Plus
MyBatis-Plus是 MyBatis 的增強工具包,在MyBatis的基礎上只做增強不做改變,爲簡化開發,提高效率而生。MyBatis-Plus簡化了CRUD操作,提供了代碼生成器,強大的條件構造器,同時內置了多個實用插件:標配的分頁插件、性能分析插件、全局攔截插件等。使得開發過程中,基本的範式代碼都一句話解決了,省去了很多重複的操作。
二、MyBatis-Plus的特性
-
1.無侵入:只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑。
-
2.損耗小:啓動即會自動注入基本CRUD,性能基本無損耗,直接面向對象操作。
-
3.強大的CRUD操作:內置通用mapper、通用service、僅僅通過少量配置即可實現單表大部分CRUD操作,更有強大的條件構造器,滿足各類使用需求。
-
4.支持Lambda形式調用:通過Lambda表達式,方便的編寫各類查詢條件,無需再擔心字段寫錯。
-
5.支持主鍵自動生成:支持多達4種主鍵策略(內含分佈式唯一ID生成器-Sequence),可自由配置,完美解決主鍵問題。
-
6.支持ActiveRecord模式:支持ActiveRecord形式調用,實體類只需繼承Model類即可進行強大的CRUD操作。
-
7.支持自定義全局通用操作:支持全局通用方法注入(Write One,use anywhere)。
-
8.內置代碼生成器:採用代碼或Maven插件可快速生成Mapper、Modle、Service、Controller層代碼,支持模板引擎。
-
9.內置分頁插件:基於MyBatis物理分頁,開發者無需關心具體操作,配置好插件以後,寫分頁等同於普通List查詢。
-
10.分頁插件支持多種數據庫:支持MySQL、MariaDB、Oracle、DB2、H2、HSQL、Sqlite、Postgre、SQLServer。
-
11.內置性能分析插件:可輸出SQL語句以及其執行時間,建議開發測試時啓用該功能,能快速找出慢查詢。
-
12.內置全局攔截插件:提供全表delete、update操作智能分析阻斷,也可自定義攔截規則,預防誤操作。
-
13.支持多種數據庫: mysql、mariadb、oracle、db2、h2、hsql、sqlite、postgresql、sqlserver、達夢數據庫、虛谷數據庫、人大金倉數據庫。
三、SpringBoot 快速集成 MyBatis-Plus
1.初始化一個SpringBoot項目
項目到這裏就創建好了,然後建一些開發需要的包,比如dao層、service層、controller等,創建好的最終項目目錄如下,僅供參考。
2.添加相關依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.12.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.demo.kathy</groupId>
<artifactId>demo_springboot_mybatisplus</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--springboot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--Druid數據連接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- mysql數據庫驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!-- swagger -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.20</version>
</dependency>
<!--mybatisplus和springboot的集成包-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.6</version>
</dependency>
<!--mybatis-plus代碼生成器依賴包-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<!--mybatis puls分頁插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.10</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.配置
application.yml
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test_kathy?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
username: root
password: root
mybatis-plus:
# 如果是放在src/main/java目錄下 classpath:/com/yourpackage/*/mapper/*Mapper.xml
# 如果是放在resource目錄 classpath:mapper/*Mapper.xml
mapper-locations: classpath:mappers/*Mapper.xml
#實體掃描,多個package用逗號或者分號分隔
typeAliasesPackage: com.demo.kathy.domain.entity
global-config:
#主鍵類型 0:"數據庫ID自增", 1:"用戶輸入ID",2:"全局唯一ID (數字類型唯一ID)", 3:"全局唯一ID UUID";
id-type: 0
#字段策略 0:"忽略判斷",1:"非 NULL 判斷"),2:"非空判斷"
field-strategy: 1
#駝峯下劃線轉換
#db-column-underline: true
#刷新mapper 調試神器
#refresh-mapper: true
#數據庫大寫下劃線轉換
#capital-mode: true
# Sequence序列接口實現類配置
#key-generator: com.baomidou.mybatisplus.incrementer.OracleKeyGenerator
#邏輯刪除配置(下面3個配置)
#logic-delete-value: 1
#logic-not-delete-value: 0
#sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
#自定義填充策略接口實現
#meta-object-handler: com.baomidou.springboot.MyMetaObjectHandler
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
#配置JdbcTypeForNull
jdbc-type-for-null: 'null'
druid.properties
#屬性類型的字符串,通過別名的方式配置擴展插件, 監控統計用的stat 日誌用log4j 防禦sql注入:wall
filters=stat
#初始化時池中建立的物理連接個數。
initialSize=2
#最大的可活躍的連接池數量
maxActive=300
#獲取連接時最大等待時間,單位毫秒,超過連接就會失效。配置了maxWait之後,缺省啓用公平鎖,併發效率會有所下降, 如果需要可以通過配置useUnfairLock屬性爲true使用非公平鎖。
maxWait=60000
#連接回收器的運行週期時間,時間到了清理池中空閒的連接,testWhileIdle根據這個判斷
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
#用來檢測連接是否有效的sql,要求是一個查詢語句。
validationQuery=SELECT 1
#建議配置爲true,不影響性能,並且保證安全性。 申請連接的時候檢測,如果空閒時間大於timeBetweenEvictionRunsMillis, 執行validationQuery檢測連接是否有效。
testWhileIdle=true
#申請連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能。設置爲false
testOnBorrow=false
#歸還連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能,設置爲flase
testOnReturn=false
#是否緩存preparedStatement,也就是PSCache。
poolPreparedStatements=false
#池中能夠緩衝的preparedStatements語句數量
maxPoolPreparedStatementPerConnectionSize=200
SpringBoot啓動類
package com.demo.kathy;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.demo.kathy.domain.mapper")
public class DemoSpringbootMybatisplusApplication {
public static void main(String[] args) {
SpringApplication.run(DemoSpringbootMybatisplusApplication.class, args);
}
}
DruidConfig 連接池配置類
package com.demo.kathy.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import com.alibaba.druid.pool.DruidDataSource;
import javax.sql.DataSource;
/**
* @Author kathy
* @Date 2020/5/19 13:12
* @Version 1.0
*/
@Configuration
@PropertySource(value = "classpath:druid.properties")
public class DruidConfig {
@Bean(destroyMethod = "close",initMethod = "init")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource(){
DruidDataSource druidDataSource=new DruidDataSource();
return druidDataSource;
}
}
MybatisConfiguration 配置類
package com.demo.kathy.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author kathy
* @Date 2020/5/19 13:28
* @Version 1.0
*/
@EnableTransactionManagement
@Configuration
@MapperScan("com.demo.kathy.domain.mapper")
public class MybatisConfiguration {
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
}
創建數據庫表以備測試使用
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主鍵ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年齡',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',
PRIMARY KEY (id)
);
測試數據
DELETE FROM user;
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, '[email protected]'),
(2, 'Jack', 20, '[email protected]'),
(3, 'Tom', 28, '[email protected]'),
(4, 'Sandy', 21, '[email protected]'),
(5, 'Billie', 24, '[email protected]');
------------------------------至此配置完成------------------------------
4.MyBatis-Plus代碼生成器
AutoGenerator 是 MyBatis-Plus 的代碼生成器,通過 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各個模塊的代碼,極大的提升了開發效率。
編寫代碼生成器類 Generator.java
package com.demo.kathy.domain.utils;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
/**
* @Descrption 自動代碼生成工具類
* @Author kathy
* @Date 2020/5/19 13:30
* @Version 1.0
*/
public class Generator {
public static void main(String[] args) {
String packageName="com.demo.kathy";
boolean serviceNameStartWithI=false; //auth -> UserService, 設置成true: auth -> IUserService
generateByTables(serviceNameStartWithI,packageName,"kathy","test_kathy","user");
}
/**
*
* @param serviceNameStartWithI
* @param packageName 包名
* @param author 作者
* @param databaseName 數據庫名
* @param tableName 表名
*/
private static void generateByTables(boolean serviceNameStartWithI,String packageName,String author,String databaseName,String tableName){
//數據庫連接URL
String dbUrl="jdbc:mysql://localhost:3306/"+databaseName+"?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false";
//全局策略配置
GlobalConfig globalConfig=new GlobalConfig();
globalConfig.setAuthor(author) //開發人員/作者
.setOutputDir("D:\\autoGenerator") //生成文件的輸出目錄
.setFileOverride(true) //是否覆蓋已有文件,默認false
.setEnableCache(false) //是否在XML中添加二級緩存配置
.setSwagger2(true); //實體屬性 Swagger2 註解 3.x版本可設置此屬性
//是否指定Service的命名方式
if (!serviceNameStartWithI) {
//設置service命名方式默認null,例如%sBusiness 生成後 UserBusiness
globalConfig.setServiceName("%sService");
}
//設置controller 命名方式
//globalConfig.setControllerName("%sAction");
//數據源配置
DataSourceConfig dataSourceConfig=new DataSourceConfig();
dataSourceConfig.setDbType(DbType.MYSQL) //數據庫類型
.setUrl(dbUrl) //驅動連接URL
.setUsername("root") //用戶名
.setPassword("root") //密碼
.setDriverName("com.mysql.jdbc.Driver");//驅動名稱
//策略配置
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig
.setCapitalMode(true)
.setEntityLombokModel(false)
//.setDbColumnUnderline(true) //3.0版本沒有
.setNaming(NamingStrategy.underline_to_camel)
//.setSuperMapperClass("SuperClass") //你自己的父類實體,沒有就不用設置!
.setInclude(tableName) //修改替換成你需要的表名,多個表名傳數組
.setEntityLombokModel(true) //啓用lombok
.setRestControllerStyle(true); //設置controller爲RESTful風格
//創建代碼生成器並將以上配置入參
new AutoGenerator().setGlobalConfig(globalConfig)
.setDataSource(dataSourceConfig)
.setStrategy(strategyConfig)
.setPackageInfo( //包配置
new PackageConfig()
.setParent(packageName)
.setController("controller")
.setEntity("domain.entity")
.setMapper("domain.mapper")
.setService("domain.service")
.setServiceImpl("domain.service.impl")
.setXml("mappers")
).execute();
}
}
更多代碼生成器的 詳細配置
然後執行main方法,執行成功後去我們設置的輸出目錄裏查看,可以看到文件已生成,將這些文件copy到我們的項目包中,如圖。
生成的實體類
Mapper
Service
Controller
5.進行測試
我們之前已經創建了一個test測試包,忘記的小可愛請上樓翻下哦。 然後我們在這個包下創建類SampleTest測試下我們剛纔搭建的環境。
SampleTest.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class SampleTest {
@Autowired
private UserMapper userMapper;
@Test
public void testSelect(){
System.out.println(("----- selectAll method test ------"));
//UserMapper中的selectList()方法的參數爲MP內置的條件封裝器Wrapper,傳null表示無任何條件
List<User> userList=userMapper.selectList(null);
//斷言方法:如果兩者一致,程序繼續往下執行;如果兩者不一致,中斷測試方法,拋出異常信息AssertionFailedError
Assert.assertEquals(5, userList.size());
userList.forEach(System.out::println);
}
}
執行結果
博客部分內容來自: 程序員不棄
https://blog.csdn.net/kye055947/article/details/83692476
關注微信公衆號【程序媛琬淇】,專注分享Java乾貨,給你意想不到的收穫。