日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

MyBatis Plus

發(fā)布時(shí)間:2024/1/4 综合教程 26 生活家
生活随笔 收集整理的這篇文章主要介紹了 MyBatis Plus 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。