MyBatis Plus
1.引入
1.簡(jiǎn)介
??MyBatis-Plus(簡(jiǎn)稱 MP),是一個(gè) MyBatis 的增強(qiáng)工具包,只做增強(qiáng)不做改變. 為簡(jiǎn)化開發(fā)工作、提高生產(chǎn)率而生,愿景是成為 Mybatis 最好的搭檔,就像 魂斗羅 中的 1P、2P,基友搭配,效率
翻倍,基于mybatis
2.相關(guān)文檔
??官方地址:
http://mp.baomidou.com
https://mybatis.plus/
??代碼發(fā)布地址:Github: https://github.com/baomidou/mybatis-plusGitee: https://gitee.com/baomidou/mybatis-plus
??文檔發(fā)布地址:http://mp.baomidou.com/#/?id=簡(jiǎn)??%
3.前置知識(shí)
Mybatis、Spring、Maven
2.環(huán)境搭建
2.1 準(zhǔn)備
表結(jié)構(gòu)
-- 創(chuàng)建庫(kù)
CREATE DATABASE mp;
-- 使用庫(kù)
USE mp;
-- 創(chuàng)建表
CREATE TABLE tbl_employee(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(50),
email VARCHAR(50),
gender CHAR(1),
age int
);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Tom','tom@zhenqk.com',1,18);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Tony','jerry@zhenqk.com',0,25);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Black','black@zhenqk.com',1,20);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('White','white@zhenqk.com',0,30);
用包裝類的原因: 每個(gè)基本類型的默認(rèn)值不一樣
domain
@Setter
@Getter
@ToString
public class Employee implements Serializable {
private Integer id;
private String lastNamprivate;
String email;
private Integer gender;
private Integer age;
}
pom.xml
<dependencies>
<!-- mp依賴
mybatisPlus 會(huì)自動(dòng)的維護(hù)Mybatis 以及MyBatis-spring相關(guān)的依賴
-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.4.0</version>
</dependency>
<!--junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- c3p0 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
2.mybatis 的整合
log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- 日志輸出到控制臺(tái) -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<!-- 日志輸出格式 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss SSS}][%c]-[%m]%n"/>
</layout>
<!--過濾器設(shè)置輸出的級(jí)別-->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<!-- 設(shè)置日志輸出的最小級(jí)別 -->
<param name="levelMin" value="INFO"/>
<!-- 設(shè)置日志輸出的最大級(jí)別 -->
<param name="levelMax" value="ERROR"/>
</filter>
</appender>
<!-- 輸出日志到文件 -->
<appender name="fileAppender" class="org.apache.log4j.FileAppender">
<!-- 輸出文件全路徑名-->
<param name="File" value="/data/applogs/own/fileAppender.log"/>
<!--是否在已存在的文件追加寫:默認(rèn)時(shí)true,若為false則每次啟動(dòng)都會(huì)刪除并重新新建文件-->
<param name="Append" value="false"/>
<param name="Threshold" value="INFO"/>
<!--是否啟用緩存,默認(rèn)false-->
<param name="BufferedIO" value="false"/>
<!--緩存大小,依賴上一個(gè)參數(shù)(bufferedIO), 默認(rèn)緩存大小8K -->
<param name="BufferSize" value="512"/>
<!-- 日志輸出格式 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss SSS}][%c]-[%m]%n"/>
</layout>
</appender>
<!-- 輸出日志到文件,當(dāng)文件大小達(dá)到一定閾值時(shí),自動(dòng)備份 -->
<!-- FileAppender子類 -->
<appender name="rollingAppender" class="org.apache.log4j.RollingFileAppender">
<!-- 日志文件全路徑名 -->
<param name="File" value="/data/applogs/RollingFileAppender.log" />
<!--是否在已存在的文件追加寫:默認(rèn)時(shí)true,若為false則每次啟動(dòng)都會(huì)刪除并重新新建文件-->
<param name="Append" value="true" />
<!-- 保存?zhèn)浞萑罩镜淖畲髠€(gè)數(shù),默認(rèn)值是:1 -->
<param name="MaxBackupIndex" value="10" />
<!-- 設(shè)置當(dāng)日志文件達(dá)到此閾值的時(shí)候自動(dòng)回滾,單位可以是KB,MB,GB,默認(rèn)單位是KB,默認(rèn)值是:10MB -->
<param name="MaxFileSize" value="10KB" />
<!-- 設(shè)置日志輸出的樣式 -->`
<layout class="org.apache.log4j.PatternLayout">
<!-- 日志輸出格式 -->
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
</layout>
</appender>
<!-- 日志輸出到文件,可以配置多久產(chǎn)生一個(gè)新的日志信息文件 -->
<appender name="dailyRollingAppender" class="org.apache.log4j.DailyRollingFileAppender">
<!-- 文件文件全路徑名 -->
<param name="File" value="/data/applogs/own/dailyRollingAppender.log"/>
<param name="Append" value="true" />
<!-- 設(shè)置日志備份頻率,默認(rèn):為每天一個(gè)日志文件 -->
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<!--每分鐘一個(gè)備份-->
<!--<param name="DatePattern" value="'.'yyyy-MM-dd-HH-mm'.log'" />-->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p][%d{HH:mm:ss SSS}][%c]-[%m]%n"/>
</layout>
</appender>
<!--
1. 指定logger的設(shè)置,additivity是否遵循缺省的繼承機(jī)制
2. 當(dāng)additivity="false"時(shí),root中的配置就失靈了,不遵循缺省的繼承機(jī)制
3. 代碼中使用Logger.getLogger("logTest")獲得此輸出器,且不會(huì)使用根輸出器
-->
<logger name="logTest" additivity="false">
<level value ="INFO"/>
<appender-ref ref="dailyRollingAppender"/>
</logger>
<!-- 根logger的設(shè)置,若代碼中未找到指定的logger,則會(huì)根據(jù)繼承機(jī)制,使用根logger-->
<root>
<appender-ref ref="console"/>
<appender-ref ref="fileAppender"/>
<appender-ref ref="rollingAppender"/>
<appender-ref ref="dailyRollingAppender"/>
</root>
</log4j:configuration>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring
http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<!-- 數(shù)據(jù)源 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${druid.driver}"></property>
<property name="url" value="${druid.url}"></property>
<property name="username" value="${druid.username}"></property>
<property name="password" value="${druid.password}"></property>
</bean>
<!-- 事務(wù)管理器 -->
<bean id="dataSourceTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 基于注解的事務(wù)管理 -->
<tx:annotation-driven
transaction-manager="dataSourceTransactionManager"/>
<!-- 配置 SqlSessionFactoryBean -->
<bean id="sqlSessionFactoryBean"
class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 數(shù)據(jù)源 -->
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation"
value="classpath:mybatis-config.xml"></property>
<!-- 別名處理 -->
<property name="typeAliasesPackage"
value="cn.ccut.domain"></property>
</bean>
<!--
配置 mybatis 掃描 mapper 接口的路徑
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage"
value="cn.ccut.mapper"></property>
</bean>
</beans>
mybatisPlus 適配 更改這里, 由原來的 SqlSessionFactoryBean改成MybatisSqlSessionFactoryBean
<!-- 配置SqlSessionFactoryBean
Mybatis提供的: org.mybatis.spring.SqlSessionFactoryBean
MP提供的:com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean
-->
<bean id="sqlSessionFactoryBean"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
3.通用增刪改實(shí)現(xiàn)
0.準(zhǔn)備
1.繼承接口
基于Mybatis: 在Mapper接口中編寫CRUD相關(guān)的方法 提供Mapper接口所對(duì)應(yīng)的SQL映射文件 以及 方法對(duì)應(yīng)的SQL語句.
基于MP: 讓XxxMapper接口繼承 BaseMapper接口即可.
BaseMapper : 泛型指定的就是當(dāng)前Mapper接口所操作的實(shí)體類類型
public interface EmployeeMapper extends BaseMapper<Employee> { }
2.BaseMapper 已經(jīng)定義了各式各樣的方法不用我們?nèi)ザx
1.insert方法
1.指定主鍵策略
@TableId:
* value: 指定表中的主鍵列的列名, 如果實(shí)體屬性名與列名一致,可以省略不指定.
* type: 指定主鍵策略.
@TableId(value="id" , type =IdType.AUTO)
private Integer id ; // int
2.指定表名注解
* MybatisPlus會(huì)默認(rèn)使用實(shí)體類的類名到數(shù)據(jù)中找對(duì)應(yīng)的表.
@TableName(value="tbl_employee")
public class Employee {
3.test
@Test
public void testInsert() throws SQLException {
//初始化Employee對(duì)象
Employee employee = new Employee();
employee.setLastName("MP");
employee.setEmail("mp@zhenqk.com");
employee.setGender(1);
employee.setAge(22);
// employee.setSalary(20000.0);
int a=employeeMapper.insert(employee);
}
4.再分析
屬性名是lastName ,而數(shù)據(jù)庫(kù)是last_name(駝峰命名法) ,原因是因?yàn)槿帜J(rèn)配置是true
5.如何配置 主鍵策略和表名
通過全局配置整個(gè)都起作用,若通過注解只能在當(dāng)前類有作用
需要將配置作用在mybatis-session (注冊(cè))
spring配置文件
<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
<!-- 數(shù)據(jù)源 -->
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!-- 別名處理 -->
<property name="typeAliasesPackage" value="com.atguigu.mp.beans"></property>
// -------------------------------------------------
<!-- 注入全局MP策略配置 -->
<property name="globalConfig" ref="globalConfiguration"></property>
</bean>
<!-- 定義MybatisPlus的全局策略配置-->
<bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!-- 在2.3版本以后,dbColumnUnderline 默認(rèn)值就是true 駝峰 -->
<property name="dbColumnUnderline" value="true"></property>
<!-- 全局的主鍵策略 實(shí)體類中可以刪除了 -->
<property name="idType" value="0"></property>
<!-- 全局的表前綴策略配置 實(shí)體類中可以刪除了 -->
<property name="tablePrefix" value="tbl_"></property>
</bean>
// ------------
6.@TableField
指定別名
當(dāng)數(shù)據(jù)庫(kù)不存在此字段,選擇性過濾插入 就是舍棄掉
@TableField(exist=false)
7.插入獲取當(dāng)前數(shù)據(jù)的主鍵值
8.insertAllColumn方法 -- 全字段的插入,
默認(rèn)數(shù)據(jù)為空就不插入
// insert方法在插入時(shí), 會(huì)根據(jù)實(shí)體類的每個(gè)屬性進(jìn)行非空判斷,只有非空的屬性對(duì)應(yīng)的字段才會(huì)出現(xiàn)到SQL語句中
//insertAllColumn方法在插入時(shí), 不管屬性是否非空, 屬性所對(duì)應(yīng)的字段都會(huì)出現(xiàn)到SQL語句中.
2.更新操作
1.updateById
會(huì)做非空判斷,選擇性更新操作
2.沒有賦值就為null(在全賦值情況下) updateAllColumnById
//初始化修改對(duì)象
Employee employee = new Employee();
employee.setId(7);
employee.setLastName("小澤老師");
employee.setEmail("xz@sina.com");
employee.setGender(0);
Integer result = employeeMapper.updateAllColumnById(employee);
System.out.println("result: " + result );
沒有給值就為ull,為每一個(gè)字段賦值
3.通用的查詢操作
1.selectById(Serialize id)
2.通過多列進(jìn)行查詢 id+lastName selectOne |
注意: 最多只能查詢一條,不能查詢多條(當(dāng)條件相同的列有多條的時(shí)候)
3.通過多個(gè)id 進(jìn)行查詢 in () ===mybatis foreach
4.通過map封裝條件查詢----selectByMap
注意:是數(shù)據(jù)庫(kù)類名
分頁(yè)查詢--selectPage
wapper 條件構(gòu)造器
注意:當(dāng)前頁(yè)碼,每頁(yè)顯示的條數(shù),不是通過limit
是一種內(nèi)存分頁(yè) RowBound,物理分頁(yè)借助分頁(yè)插件
不推薦使用
4.通用刪除
1.根據(jù)id 進(jìn)行刪除--- deleteById
2.根據(jù)條件進(jìn)行刪除-----deleteByMap
where 進(jìn)行可拼接
3.批量刪除 deleteBatchIds
底層 in
5.MP 啟動(dòng)自動(dòng)注入SQL原理分析
??啟動(dòng)的時(shí)候就注入進(jìn)來了,繼承了BaseMapper 中提供的CRUB方法,方法來源于BaseMapper有方法就必須有SQL,因?yàn)镸abatis最終還是需要通過SQL語句操作實(shí)現(xiàn),要熟悉:MyBatis 執(zhí)行流程, 透過現(xiàn)象看本質(zhì)
Configuration 全局配置--->MappedStatement
?AutoSqlInjector
?SqlMethod 枚舉對(duì)象 MP支持的SQL方法
?TableInfo 數(shù)據(jù)庫(kù)表放射信息,可以獲取數(shù)據(jù)庫(kù)表的相關(guān)信息
?SqlSource :sql 處理對(duì)象
?MapperbuilderAssistant 用于緩存sql參數(shù) 查詢方法的結(jié)果集處理等
? 通過MapperbuilderAssistant 將每一個(gè)MappedStatement添加到Configuration中
?MappedStatements
共17 種方法
wrapper 實(shí)體對(duì)象封裝操作類
4.條件構(gòu)造器
1.EntityWrapper 簡(jiǎn)介
Mybatis-Plus 通過 EntityWrapper(簡(jiǎn)稱 EW,MP 封裝的一個(gè)查詢條件構(gòu)造器)或者Condition(與 EW 類似) 來讓用戶自由的構(gòu)建查詢條件,簡(jiǎn)單便捷,沒有額外的負(fù)擔(dān),
能夠有效提高開發(fā)效率
實(shí)體包裝器,主要用于處理 sql 拼接,排序,實(shí)體參數(shù)查詢等
注意: 使用的是數(shù)據(jù)庫(kù)字段,不是 Java 屬性!
條件參數(shù)的說明
用的最多是查詢操作
2.需求
??現(xiàn)有一個(gè)需求,我們需要分頁(yè)查詢 tbl_employee 表中,年齡在 18~50 之間性別為男且姓名為 xx 的所有用戶,這時(shí)候我們?cè)撊绾螌?shí)現(xiàn)上述需求呢?
??MyBatis : 需要在 SQL 映射文件中編寫帶條件查詢的 SQL,并基于 PageHelper 插件完成分頁(yè). 實(shí)現(xiàn)以上一個(gè)簡(jiǎn)單的需求,往往需要我們做很多重復(fù)單調(diào)的工作。普通的 Mapper能夠解決這類痛點(diǎn)嗎?
??MP: 依舊不用編寫 SQL 語句, MP 提供了功能強(qiáng)大的條件構(gòu)造器 EntityWrapper
利用條件構(gòu)造器查詢
//我們需要分頁(yè)查詢tbl_employee表中,年齡在18~50之間且性別為男且姓名為Tom的所有用戶
// 是數(shù)據(jù)庫(kù)字段名
List<Employee> emps =employeeMapper.selectPage(new Page<Employee>(1, 2),
new EntityWrapper<Employee>()
.between("age", 18, 50)
.eq("gender", 1)
.eq("last_name", "Tom")
);
System.out.println(emps);
3. 帶條件的查詢selectList方法
小語法
or() 或者 關(guān)系 前面是一起的,后面是一起
orNew()
// 查詢tbl_employee表中, 性別為女并且名字中帶有"老師" 或者 郵箱中帶有"a"
List<Employee> emps = employeeMapper.selectList(
new EntityWrapper<Employee>()
.eq("gender", 0)
.like("last_name", "老師")
//.or()
// SQL: (gender = ? AND last_name LIKE ? OR email LIKE ?)
.orNew()
// SQL: (gender = ? AND last_name LIKE ?) OR (email LIKE ?) or New 另起一個(gè)括號(hào)
.like("email", "a")
);
System.out.println(emps);
4. 帶條件的修改
??update
把tom 修改成蒼老師
Employee employee = new Employee();
employee.setLastName("蒼老師");
employee.setEmail("cls@sina.com");
employee.setGender(0);
employeeMapper.update(employee,
new EntityWrapper<Employee>()
.eq("last_name", "Tom")
.eq("age", 44)
);
5.帶條件的刪除
employeeMapper.delete(
new EntityWrapper<Employee>()
.eq("last_name", "Tom")
.eq("age", 22)
);
6.其他常用方法
orderby 默認(rèn)是升序列
orderSesc 降序
// 查詢性別為女的, 根據(jù)age進(jìn)行排序(asc/desc), 簡(jiǎn)單分頁(yè)
List<Employee> emps = employeeMapper.selectList(
new EntityWrapper<Employee>()
.eq("gender", 0)
.orderBy("age")
//.orderDesc(Arrays.asList(new String [] {"age"}))
.last("desc limit 1,3")
);
last 具有SQL注入風(fēng)險(xiǎn)
7.使用Condition的方式打開如上需求
List<Employee > emps = employeeMapper.selectPage(
new Page<Employee>(1,2),
Condition.create() // 獲取方式一樣 new EntityWrapper<Employee>()
.between("age", 18, 50)
.eq("gender", "1")
.eq("last_name", "Tom")
);
System.out.println(emps);
mp 條件構(gòu)造器 Condition // EntityWrapper
逆向工程qbc
5.ActiveRecord 活動(dòng)記錄
1.介紹
? Active Record(活動(dòng)記錄),是一種領(lǐng)域模型模式,特點(diǎn)是一個(gè)模型類對(duì)應(yīng)關(guān)系型數(shù)據(jù)庫(kù)中的
一個(gè)表,而模型類的一個(gè)實(shí)例對(duì)應(yīng)表中的一行記錄。
? ActiveRecord 一直廣受動(dòng)態(tài)語言( PHP 、 Ruby 等)的喜愛,而 Java 作為準(zhǔn)靜態(tài)語言,
對(duì)于 ActiveRecord 往往只能感嘆其優(yōu)雅,所以 MP 也在 AR 道路上進(jìn)行了一定的探索
概念慢慢理解 慢慢會(huì)用就可以了
2.開啟AR模式
僅僅需要讓實(shí)體類繼承 Model 類且實(shí)現(xiàn)主鍵指定方法,即可開啟 AR 之旅
@TableName("tbl_employee")
public class Employee extends Model<Employee>{
// .. fields
// .. getter and setter
@Override
protected Serializable pkVal() {
return this.id;
}
3.基本CRUB
1. 插入操作
對(duì)象進(jìn)行操作 自己插入自己
/**
* AR 插入操作
*/
@Test
public void testARInsert() {
Employee employee = new Employee();
employee.setLastName("王老師");
employee.setEmail("king@ccut.com");
employee.setGender(1);
employee.setAge(35);
boolean result = employee.insert();
System.out.println("result:" +result );
}
2.修改操作
/**
* AR 修改操作
*/
@Test
public void testARUpdate() {
Employee employee = new Employee();
employee.setId(20);
employee.setLastName("王大師");
employee.setEmail("king@ccut.com");
employee.setGender(1);
employee.setAge(36);
boolean result = employee.updateById();
System.out.println("result:" +result );
}
3.AR的查詢操作
1.selectById方法 and selectById(Serializable id)
第一種方式:
Employee employee = new Employee();
Employee result = employee.selectById(14);
System.out.println(result );
第二種方式:
Employee employee = new Employee();
employee.setId(14);
Employee result = employee.selectById();
System.out.println(result );
2.selectAll()
Employee employee = new Employee();
List<Employee> emps = employee.selectAll();
System.out.println(emps);
3.selectList and selectCount 方法
Employee employee = new Employee();
List<Employee > emps=
employee.selectList(new EntityWrapper<Employee>().like("last_name", "老師"));
System.out.println(emps);
Employee employee = new Employee();
Integer result = employee.selectCount(new EntityWrapper<Employee>().eq("gender", 0));
// 全表統(tǒng)計(jì) 就不要加條件了
System.out.println("result: " +result );
4. 刪除操作
1.注意: 刪除不存在的數(shù)據(jù) 邏輯上也是屬于成功的.
2.deleteById(id) 和deleteById()
第一種方式
Employee employee = new Employee();
boolean result = employee.deleteById(2);
第二種方式
刪除不存在在邏輯上也是成功的
Employee employee = new Employee();
employee.setId(2);
boolean result = employee.deleteById();
System.out.println("result:" +result );
3.delete(wrapper)
boolean result = employee.delete(new EntityWrapper<Employee>().like("last_name", "小"));
System.out.println(result );
4.分頁(yè)的復(fù)雜操作
@Test
public void testARPage() {
Employee employee = new Employee();
Page<Employee> page = employee.selectPage(new Page<>(1, 1),
new EntityWrapper<Employee>().like("last_name", "老"));
List<Employee> emps = page.getRecords(); //獲取查詢數(shù)據(jù)庫(kù) 查詢回來的記錄返回
System.out.println(emps);
}
返回的是一個(gè)page 對(duì)象,更加的方便使用分頁(yè)信息
5.小結(jié):
AR 模式提供了一種更加便捷的方式實(shí)現(xiàn) CRUD 操作,其本質(zhì)還是調(diào)用的 Mybatis 對(duì)
應(yīng)的方法,類似于語法糖
語法糖是指計(jì)算機(jī)語言中添加的某種語法,這種語法對(duì)原本語言的功能并沒有影響.可以更方便開發(fā)者使用,可以避免出錯(cuò)的機(jī)會(huì),讓程序可讀性更好.
到此,我們簡(jiǎn)單領(lǐng)略了 Mybatis-Plus 的魅力與高效率,值得注意的一點(diǎn)是:我們提供了強(qiáng)大的代碼生成器,可以快速生成各類代碼,真正的做到了即開即用
6.代碼生成器
通過java代碼來實(shí)現(xiàn)的
逆向軟件通過 xml而配置
1.MP與MBG的簡(jiǎn)單比較
??1) MP 提供了大量的自定義設(shè)置,生成的代碼完全能夠滿足各類型的需求
??2) MP 的代碼生成器 和 Mybatis MBG 代碼生成器:MP 的代碼生成器都是基于 java 代碼來生成。MBG 基于 xml 文件進(jìn)行代碼生成
?MyBatis 的代碼生成器可生成: 實(shí)體類、Mapper 接口、Mapper 映射文件
?MP 的代碼生成器可生成: 實(shí)體類(可以選擇是否支持 AR)、Mapper 接口、Mapper 映射文件、 Service 層、Controller 層.
??3) 表及字段命名策略選擇
??在 MP 中,我們建議數(shù)據(jù)庫(kù)表名 和 表字段名采用駝峰命名方式, 如果采用下劃線命名方式 請(qǐng)開啟全局下劃線開關(guān),如果表名字段名命名方式不一致請(qǐng)注解指定,我們建議最好保持一致。
??這么做的原因是為了避免在對(duì)應(yīng)實(shí)體類時(shí)產(chǎn)生的性能損耗,這樣字段不用做映射就能直接和實(shí)體類對(duì)應(yīng)。當(dāng)然如果項(xiàng)目里不用考慮這點(diǎn)性能損耗,那么你采用下滑線也是沒問題的,只需要在生成代碼時(shí)配置 ; dbColumnUnderline 屬性就可以
2. 準(zhǔn)備
導(dǎo)入代碼產(chǎn)生器依賴
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
加入日志 sl4f 日志輸出依賴
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.7</version>
</dependency>
3. GlobalConfig全局配置參數(shù)
1.全局配置
//1. 全局配置
GlobalConfig config = new GlobalConfig();
config.setActiveRecord(true) // 是否支持AR模式
.setAuthor("weiyunhui") // 作者
.setOutputDir("D:\workspace_mp\mp03\src\main\java") // 生成路徑
.setFileOverride(true) // 文件覆蓋
.setIdType(IdType.AUTO) // 主鍵策略
.setServiceName("%sService") // 設(shè)置生成的service接口的名字的首字母是否為I
// IEmployeeService
.setBaseResultMap(true)
.setBaseColumnList(true);
2.數(shù)據(jù)源配置
//2. 數(shù)據(jù)源配置
DataSourceConfig dsConfig = new DataSourceConfig();
dsConfig.setDbType(DbType.MYSQL) // 設(shè)置數(shù)據(jù)庫(kù)類型
.setDriverName("com.mysql.jdbc.Driver")
.setUrl("jdbc:mysql://localhost:3306/mp")
.setUsername("root")
.setPassword("1234");
3.策略配置
原來在配置文件
StrategyConfig stConfig = new StrategyConfig();
stConfig.setCapitalMode(true) //全局大寫命名
.setDbColumnUnderline(true) // 指定表名 字段名是否使用下劃線
.setNaming(NamingStrategy.underline_to_camel) // 數(shù)據(jù)庫(kù)表映射到實(shí)體的命名策略
.setTablePrefix("tbl_")
.setInclude("tbl_employee"); // 生成的表 所使用的表
4.包名策略設(shè)置
//4. 包名策略配置
PackageConfig pkConfig = new PackageConfig();
pkConfig.setParent("com.atguigu.mp")
.setMapper("mapper")
.setService("service")
.setController("controller")
.setEntity("beans")
.setXml("mapper");
// .setBaseResultMap(true) xml
// .setBaseColumnList(true);
5.整合配置
//5. 整合配置
AutoGenerator ag = new AutoGenerator();
ag.setGlobalConfig(config)
.setDataSource(dsConfig)
.setStrategy(stConfig)
.setPackageInfo(pkConfig);
//6. 執(zhí)行
ag.execute();
導(dǎo)入包 spring-webmvc
@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {
//不用再進(jìn)行mapper的注入.
/**
* EmployeeServiceImpl 繼承了ServiceImpl
* 1. 在ServiceImpl中已經(jīng)完成Mapper對(duì)象的注入,直接在EmployeeServiceImpl中進(jìn)行使用
* 2. 在ServiceImpl中也幫我們提供了常用的CRUD方法, 基本的一些CRUD方法在Service中不需要我們自己定義.
*
*
*/
}
Controller
@Controller
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
// public String login() {
//
// //employeeService.select
// }
}
更多詳情信息可以看文檔
7.插件擴(kuò)展
1.介紹
??1) 插件機(jī)制: Mybatis 通過插件(Interceptor) 可以做到攔截四大對(duì)象相關(guān)方法的執(zhí)行,根據(jù)需求,完 成相關(guān)數(shù)據(jù)的動(dòng)態(tài)改變。 Executor StatementHandler ParameterHandler ResultSetHandler
?? 2) 插件原理 四大對(duì)象的每個(gè)對(duì)象在創(chuàng)建時(shí),都會(huì)執(zhí)行 interceptorChain.pluginAll(),會(huì)經(jīng)過每個(gè)插 件對(duì)象的 plugin()方法,目的是為當(dāng)前的四大對(duì)象創(chuàng)建代理。代理對(duì)象就可以攔截到四 大對(duì)象相關(guān)方法的執(zhí)行,因?yàn)橐獔?zhí)行四大對(duì)象的方法需要經(jīng)過代理.
2.分頁(yè)插件
??物理分頁(yè)
com.baomidou.mybatisplus.plugins.PaginationInterceptor
??注冊(cè)有兩種方式
1.mybaiss 配置文件
<configuration>
<!-- <plugins>
<plugin interceptor="com.baomidou.mybatisplus.plugins.PaginationInterceptor"></plugin>
</plugins> -->
</configuration>
?2.放在spring中 數(shù)組可以用list
<!-- 插件注冊(cè) -->
<property name="plugins">
<list>
<!-- 注冊(cè)分頁(yè)插件 -->
<bean class="com.baomidou.mybatisplus.plugins.PaginationInterceptor"></bean>
</list>
</property>
</bean>
?測(cè)試方法
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
EmployeeMapper employeeMapper = ctx.getBean("employeeMapper",EmployeeMapper.class);
Page<Employee> page = new Page<>(1,1);
List<Employee > emps =
employeeMapper.selectPage(page, null);
System.out.println(emps);
?把mapper 中開啟二級(jí)緩存去掉
注冊(cè)分頁(yè)插件后,Page對(duì)象的使用
@Test
public void testPage() {
Page<Employee> page = new Page<>(1,1);
List<Employee > emps =
employeeMapper.selectPage(page, null);
System.out.println(emps);
System.out.println("===============獲取分頁(yè)相關(guān)的一些信息======================");
System.out.println("總條數(shù):" +page.getTotal());
System.out.println("當(dāng)前頁(yè)碼: "+ page.getCurrent());
System.out.println("總頁(yè)碼:" + page.getPages());
System.out.println("每頁(yè)顯示的條數(shù):" + page.getSize());
System.out.println("是否有上一頁(yè): " + page.hasPrevious());
System.out.println("是否有下一頁(yè): " + page.hasNext());
//將查詢的結(jié)果封裝到page對(duì)象中
page.setRecords(emps);
}
3.執(zhí)行分析插件(不建議生產(chǎn)環(huán)境用)
1) com.baomidou.mybatisplus.plugins.SqlExplainInterceptor
2) SQL 執(zhí)行分析攔截器,只支持 MySQL5.6.3 以上版本
3) 該插件的作用是分析 DELETE UPDATE 語句,防止小白
或者惡意進(jìn)行 DELETE UPDATE 全表操作
4) 只建議在開發(fā)環(huán)境中使用,不建議在生產(chǎn)環(huán)境使用
5) 在插件的底層 通過 SQL 語句分析命令:Explain 分析當(dāng)前的 SQL 語句,
根據(jù)結(jié)果集中的 Extra 列來斷定當(dāng)前是否全表操作。
插件注冊(cè)
<!-- 插件注冊(cè) -->
<property name="plugins">
<list>
<!-- 注冊(cè)分頁(yè)插件 -->
<bean class="com.baomidou.mybatisplus.plugins.PaginationInterceptor"></bean>
<!-- 注冊(cè)執(zhí)行分析插件 發(fā)現(xiàn)對(duì)全表的操作就停止 -->
<bean class="com.baomidou.mybatisplus.plugins.SqlExplainInterceptor">
<property name="stopProceed" value="true"></property>
</bean>
測(cè)試
/**
* 測(cè)試SQL執(zhí)行分析插件 發(fā)現(xiàn)全表刪除操作 就停止
*/
@Test
public void testSQLExplain() {
employeeMapper.delete(null); // 全表刪除
}
explain sql分析
4. 性能分析插件
?1) com.baomidou.mybatisplus.plugins.PerformanceInterceptor
?2) 性能分析攔截器,用于輸出每條 SQL 語句及其執(zhí)行時(shí)間
?3) SQL 性能執(zhí)行分析,開發(fā)環(huán)境使用,超過指定時(shí)間,停止運(yùn)行。有助于發(fā)現(xiàn)問題----測(cè)試可以用
注冊(cè)插件
<!-- 注冊(cè)性能分析插件 -->
<bean class="com.baomidou.mybatisplus.plugins.PerformanceInterceptor"> 是否格式化sql語句
<property name="format" value="true"></property>
<!-- <property name="maxTime" value="5"></property> --> 每條sql語句執(zhí)行所消耗的時(shí)間
</bean>
時(shí)間是 5毫秒
測(cè)試
/**
* 測(cè)試 性能分析插件
*/
@Test
public void testPerformance() {
Employee employee = new Employee();
employee.setLastName("瑪利亞老師");
employee.setEmail("mly@sina.com");
employee.setGender("0");
employee.setAge(22);
employeeMapper.insert(employee);
}
5.樂觀鎖插件
?1) com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor
?2) 如果想實(shí)現(xiàn)如下需求: 當(dāng)要更新一條記錄的時(shí)候,希望這條記錄沒有被別人更新
?3) 樂觀鎖的實(shí)現(xiàn)原理: 取出記錄時(shí),獲取當(dāng)前 version 2 更新時(shí),帶上這個(gè) version 2 執(zhí)行更新時(shí), set version = yourVersion+1 where version = yourVersion 如果 version 不對(duì),就更新失敗
?4) @Version 用于注解實(shí)體字段,必須要有。
domian
加上字段
? - 數(shù)據(jù)庫(kù)也要加上 version int 11
注冊(cè)樂觀鎖
<!-- 基于注解的事務(wù)管理 -->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
<!-- 配置SqlSessionFactoryBean
Mybatis提供的: org.mybatis.spring.SqlSessionFactoryBean
MP提供的:com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean
-->
<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
<!-- 數(shù)據(jù)源 -->
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!-- 別名處理 -->
<property name="typeAliasesPackage" value="com.atguigu.mp.beans"></property>
<!-- 注入全局MP策略配置 -->
<property name="globalConfig" ref="globalConfiguration"></property>
<!-- 插件注冊(cè) -->
<property name="plugins">
<list>
<!-- 注冊(cè)分頁(yè)插件 -->
<bean class="com.baomidou.mybatisplus.plugins.PaginationInterceptor"></bean>
<!-- 注冊(cè)執(zhí)行分析插件 -->
<bean class="com.baomidou.mybatisplus.plugins.SqlExplainInterceptor">
<property name="stopProceed" value="true"></property>
</bean>
<!-- 注冊(cè)性能分析插件 -->
<bean class="com.baomidou.mybatisplus.plugins.PerformanceInterceptor">
<property name="format" value="true"></property>
<!-- <property name="maxTime" value="5"></property> -->
</bean>
<!-- 注冊(cè)樂觀鎖插件 -->
<bean class="com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor">
</bean>
</list>
</property>
</bean>
?測(cè)試比對(duì)
/**
* 測(cè)試 樂觀鎖插件
*/
@Test
public void testOptimisticLocker() {
//更新操作
Employee employee = new Employee();
employee.setId(15);
employee.setLastName("TomAA");
employee.setEmail("tomAA@sina.com");
employee.setGender("1");
employee.setAge(22);
employee.setVersion(3);
employeeMapper.updateById(employee);
}
8.全局配置
? 根據(jù) MybatisPlus 的 AutoSqlInjector 可以自定義各種你想要的 sql ,注入到全局中,相當(dāng)于自 定義 Mybatisplus 自動(dòng)注入的方法。
? 之前需要在 xml 中進(jìn)行配置的 SQL 語句,現(xiàn)在通過擴(kuò)展 AutoSqlInjector 在加載 mybatis 環(huán)境 時(shí)就注入。
8.1 AutoSqlInjector
在 Mapper 接口中定義相關(guān)的 CRUD 方法
擴(kuò)展 AutoSqlInjector inject 方法,實(shí)現(xiàn) Mapper 接口中方法要注入的 SQL
新建包 injector/MySqlInjector.java
/**
* 自定義全局操作
*/
public class MySqlInjector extends AutoSqlInjector{
/**
* 擴(kuò)展inject 方法,完成自定義全局操作
a模仿 injectDeleteSql
*/
@Override
public void inject(Configuration configuration, MapperBuilderAssistant builderAssistant, Class<?> mapperClass,
Class<?> modelClass, TableInfo table) {
//將EmployeeMapper中定義的deleteAll, 處理成對(duì)應(yīng)的MappedStatement對(duì)象,加入到configuration對(duì)象中。
//注入的SQL語句
String sql = "delete from " +table.getTableName();
//注入的方法名 一定要與EmployeeMapper接口中的方法名一致
String method = "deleteAll" ;
//構(gòu)造SqlSource對(duì)象
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
//構(gòu)造一個(gè)刪除的MappedStatement
this.addDeleteMappedStatement(mapperClass, method, sqlSource);
}
}
?3) 在 MP 全局策略中,配置 自定義注入器
<!-- 定義MybatisPlus的全局策略配置-->
<bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!-- 在2.3版本以后,dbColumnUnderline 默認(rèn)值就是true -->
<property name="dbColumnUnderline" value="true"></property>
<!-- Mysql 全局的主鍵策略 -->
<!-- <property name="idType" value="0"></property> -->
<!-- Oracle全局主鍵策略 -->
<property name="idType" value="1"></property>
<!-- 全局的表前綴策略配置 -->
<property name="tablePrefix" value="tbl_"></property>
<!--注入自定義全局操作
<property name="sqlInjector" ref="mySqlInjector"></property>
<property name="keyGenerator" ref="oracleKeyGenerator"></property>
</bean>
<!-- 定義自定義注入器 -->
<bean id="mySqlInjector" class="com.ccut.mp.injector.MySqlInjector"></bean>
測(cè)試
/**
* 測(cè)試自定義全局操作
*/
@Test
public void testMySqlInjector() {
Integer result = employeeMapper.deleteAll();
System.out.println("result: " +result );
}
沒有寫映射文件mapper 是在啟動(dòng)的時(shí)候就注入了
8.2 自定義注入器的應(yīng)用之 邏輯刪除
假刪除、邏輯刪除: 并不會(huì)真正的從數(shù)據(jù)庫(kù)中將數(shù)據(jù)刪除掉,而是將當(dāng)前被刪除的這條數(shù)據(jù) 中的一個(gè)邏輯刪除字段置為刪除狀態(tài). tbl_user logic_flag = 1 → -1
com.baomidou.mybatisplus.mapper.LogicSqlInjector
logicDeleteValue 邏輯刪除全局值
logicNotDeleteValue 邏輯未刪除全局值
在 POJO 的邏輯刪除字段 添加 @TableLogic 注解
會(huì)在 mp 自帶查詢和更新方法的 sql 后面,追加『邏輯刪除字段』=『LogicNotDeleteValue 默認(rèn)值』 刪除方法: deleteById()和其他 delete 方法, 底層 SQL 調(diào)用的是 update tbl_xxx set 『邏輯刪除字段』=『logicDeleteValue 默認(rèn)值』
8.3 實(shí)戰(zhàn)
全局sql 注入器的使用,配置
1.appcattionContex.xml
<!-- 定義MybatisPlus的全局策略配置-->
<bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!-- 在2.3版本以后,dbColumnUnderline 默認(rèn)值就是true -->
<property name="dbColumnUnderline" value="true"></property>
.....
<!-- 注入邏輯刪除 -->
<property name="sqlInjector" ref="logicSqlInjector"></property>
<!-- 注入邏輯刪除全局值 -->
<property name="logicDeleteValue" value = "-1"></property>
<property name="logicNotDeleteValue" value="1"></property>
</bean>
<!-- 邏輯刪除 -->
<bean id="logicSqlInjector" class="com.baomidou.mybatisplus.mapper.LogicSqlInjector"></bean>
創(chuàng)建表:
logflag 字段
實(shí)體類
usermapper
直接繼承BaseMapper<User>
/**
* 測(cè)試邏輯刪除
*/
@Test
public void testLogicDelete() {
// Integer result = userMapper.deleteById(1); 變成了更新狀態(tài)
// System.out.println("result:" +result );
User user = userMapper.selectById(1); //查詢不到的 null 判斷 and 邏輯字段等于1
System.out.println(user);
}
9.公共字段填充
希望有些默認(rèn)的值給他填充上去
?9.1 元數(shù)據(jù)處理器接口 com.baomidou.mybatisplus.mapper.MetaObjectHandler
insertFill(MetaObject metaObject) 插入的填充
updateFill(MetaObject metaObject) 更新的時(shí)候填充
metaobject: 元對(duì)象. 是 Mybatis 提供的一個(gè)用于更加方便,更加優(yōu)雅的訪問對(duì)象的屬性, 給對(duì)象的屬性設(shè)置值 的一個(gè)對(duì)象. 還會(huì)用于包裝對(duì)象. 支持對(duì) Object 、Map、Collection 等對(duì)象進(jìn)行包裝
本質(zhì)上 metaObject 獲取對(duì)象的屬性值或者是給對(duì)象的屬性設(shè)置值,最終是要 通過 Reflector 獲取到屬性的對(duì)應(yīng)方法的 Invoker, 最終 invoke.
?9.2 開發(fā)步驟
注解填充字段 @TableFile(fill = FieldFill.INSERT) 查看 FieldFill
自定義公共字段填充處理器
MP 全局注入 自定義公共字段填充處理器
1.實(shí)現(xiàn)步驟
實(shí)體類
公共字段處理器
全局配置
放在全局策略上
<!-- 注入公共字段填充處理器 -->
<property name="metaObjectHandler" ref="myMetaObjectHandler"></property>
<!-- 注入Oracle主鍵Sequence -->
<property name="keyGenerator" ref="oracleKeyGenerator"></property>
</bean>
<!-- 公共字段填充 處理器 -->
<bean id="myMetaObjectHandler" class="com.atguigu.mp.metaObjectHandler.MyMetaObjectHandler"> </bean>
2.自定義填充處理器的實(shí)現(xiàn)
/**
* 自定義公共字段填充處理器
*/
public class MyMetaObjectHandler extends MetaObjectHandler {
/**
* 插入操作 自動(dòng)填充
*/
@Override
public void insertFill(MetaObject metaObject) {
//獲取到需要被填充的字段的值
Object fieldValue = getFieldValByName("name", metaObject);
if(fieldValue == null) {
System.out.println("*******插入操作 滿足填充條件*********");
setFieldValByName("name", "weiyunhui", metaObject);
}
}
/**
* 修改操作 自動(dòng)填充
*/
@Override
public void updateFill(MetaObject metaObject) {
Object fieldValue = getFieldValByName("name", metaObject);
if(fieldValue == null) {
System.out.println("*******修改操作 滿足填充條件*********");
setFieldValByName("name", "weiyh", metaObject);
}
}
}
3.測(cè)試
/**
* 測(cè)試公共字段填充
有名字就不會(huì)進(jìn)行填充
*/
@Test
public void testMetaObjectHandler() {
User user = new User();
//user.setName("Tom");
// userMapper.insert(user);
user.setId(5);
user.setLogicFlag(1);
userMapper.updateById(user);
}
對(duì)某個(gè)字段修改,就不適合了,它認(rèn)為沒有值就填充了
10. Oracle 主鍵 Sequence
MySQL: 支持主鍵自增。 IdType.Auto
Oracle: 序列(Sequence) 不支持主鍵自增
1.步驟
實(shí)體類配置主鍵 Sequence @KeySequence(value=”序列名”,
clazz=xxx.class 主鍵屬性類 型)
全局 MP 主鍵生成策略為 IdType.INPUT
多個(gè) ,也就是整個(gè)環(huán)境都在使用oracle數(shù)據(jù)庫(kù)
<!-- Oracle全局主鍵策略 -->
<property name="idType" value="1"></property>
全局 MP 中配置 Oracle 主鍵 Sequence com.baomidou.mybatisplus.incrementer.OracleKeyGenerator
<!-- 注入Oracle主鍵Sequence -->
<property name="keyGenerator" ref="oracleKeyGenerator"></property>
</bean>
<!-- 配置Oracle主鍵Sequence -->
<bean id="oracleKeyGenerator" class="com.baomidou.mybatisplus.incrementer.OracleKeyGenerator"></bean>
可以將@keySequence 定義在父類中,可實(shí)現(xiàn)多個(gè)子類對(duì)應(yīng)的多個(gè)表公用一個(gè) Sequence
2.Oracle 驅(qū)動(dòng)依賴問題
3.配置連接信息
orcl.driver=oracle.jdbc.OracleDriver
orcl.url=jdbc:oracle:thin:@localhost:1521:xe
orcl.username=system
orcl.password=1234
4.創(chuàng)建表及序列
5.演示.
/**
* 測(cè)試Oracle 主鍵 Sequence
*/
@Test
public void testOracle() {
User user = new User();
user.setLogicFlag(1);
user.setName("OracleSEQ");
userMapper.insert(user);
}
6. 擴(kuò)展 多個(gè)實(shí)體類公用一個(gè)序列
11. idea
MybatisX 輔助 idea 快速開發(fā)插件,
為效率而生. 可以實(shí)現(xiàn) java 與 xml 跳轉(zhuǎn),根據(jù) Mapper 接口中的方法自動(dòng)生成 xml 結(jié)構(gòu).
官方安裝: File -> Settings -> Plugins -> Browse Repositories.. 輸入 mybatisx 安裝下載
Jar 安裝: File -> Settings -> Plugins -> Install plugin from disk.. 選中 mybatisx..jar 安裝
不停的思考,就會(huì)不停的進(jìn)步
總結(jié)
以上是生活随笔為你收集整理的MyBatis Plus的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django 之 CBV
- 下一篇: mysql绿色版下载及应用