Mybatis-Plus

Mybatis-Plus簡介

什么是Mybatis-Plus

MyBatis-Plus(簡稱MP)是一個(gè)?MyBatis的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生荔烧。


為什么要學(xué)習(xí)Mybatis-Plus

我們已經(jīng)學(xué)習(xí)過Mybatis這個(gè)框架鞋囊,我們只需要在dao層定義抽象接口踪古,基于Mybatis零實(shí)現(xiàn)的特性湘捎,就可以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的crud操作。

如下兩個(gè)接口:


UserMapper接口

public?interface?UserMapper {


????int?deleteByPrimaryKey(Long id);

????int?insert(User user);

????List<User> selectList();

????User selectByPrimaryKey(Long id);

}


OrderMapper接口

public?interface?OrderMapper {


????int?deleteByPrimaryKey(Long id);

????int?insert(Order?order);

????List<Order> selectList();

????User selectByPrimaryKey(Long id);

}


在上面兩個(gè)業(yè)務(wù)接口中醒叁,我們發(fā)現(xiàn):它們定義了一組類似的crud方法司浪。


在業(yè)務(wù)類型比較多的時(shí)候,我們需要重復(fù)的定義這組功能類似的接口方法把沼。


如何解決這個(gè)問題呢啊易?


使用Mybatis-plus工具,我們只需要將我們定義的抽象接口饮睬,繼承一個(gè)公用的BaseMapper<T>接口租谈,就可以獲得一組通用的crud方法,來操作數(shù)據(jù)庫!8钊ァ窟却!


使用Mybatis-plus時(shí),甚至都不需要任何的xml映射文件或者接口方法注解呻逆,真正的dao層零實(shí)現(xiàn)夸赫。


public?interface?OrderMapper extends BaseMapper<User>?{

???//BaseMapper已經(jīng)實(shí)現(xiàn)了通用的curd的方法了。如果有需要非通用的操作咖城,才在這里自定義

}



Mybatis-Plus小結(jié)

Mybatis-Plus只是在Mybatis的基礎(chǔ)上茬腿,實(shí)現(xiàn)了功能增強(qiáng),讓開發(fā)更加簡潔高效宜雀。


Mybatis-Plus并沒有修改Mybatis的任何特性G衅健!辐董!

入門示例

需求

使用Mybatis-Plus實(shí)現(xiàn)對(duì)用戶的crud操作悴品。


配置步驟說明

(1)搭建環(huán)境(創(chuàng)建項(xiàng)目、導(dǎo)入包)

(2)配置Mybaits-Plus(基于Spring實(shí)現(xiàn))

(3)編寫測試代碼


配置步驟

第一部分:搭建環(huán)境

前提

已經(jīng)創(chuàng)建好了數(shù)據(jù)庫環(huán)境:

CREATE TABLE `tb_user` (

`id` bigint(20) NOT NULL COMMENT '主鍵ID',

`name` varchar(30) DEFAULT NULL COMMENT '姓名',

`age` int(11) DEFAULT NULL COMMENT '年齡',

`email` varchar(50) DEFAULT NULL COMMENT '郵箱',

??PRIMARY KEY (`id`)

)

說明

(1)Mybatis-Plus并沒有提供單獨(dú)的jar包简烘,而是通過Maven(或者gradle)來管理jar依賴苔严。本教程需要使用Maven構(gòu)建項(xiàng)目。


(2)Mybatis-Plus是基于Spring框架實(shí)現(xiàn)的夸研,因此使用Mybatis-Plus邦蜜,必須導(dǎo)入Spring相關(guān)依賴。


第一步:創(chuàng)建一個(gè)Maven項(xiàng)目

因?yàn)槲覀冎皇菧y試MybatisPlus框架亥至,所以創(chuàng)建一個(gè)jar項(xiàng)目就可以了



第二步:配置pom.xml構(gòu)建文件

--需要導(dǎo)入依賴,并且配置項(xiàng)目的編碼贱迟,JDK版本等構(gòu)建信息

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>org.chu.mybatisplus</groupId>

<artifactId>mybatisplus-demo-01-start</artifactId>

<version>1.0</version>


<!-- 依賴 -->

<dependencies>

<!-- spring依賴 -->


<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-jdbc</artifactId>

<version>4.3.24.RELEASE</version>

</dependency>


<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>4.3.24.RELEASE</version>

</dependency>


<!-- mybatis?plus -->

<dependency>

<groupId>com.baomidou</groupId>

<artifactId>mybatis-plus</artifactId>

<version>2.3.3</version>

</dependency>

<!-- mysql?driver -->

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.47</version>

</dependency>

</dependencies>


<!-- 只有配置了build標(biāo)簽里面的內(nèi)容姐扮,配置后都需要強(qiáng)制更新項(xiàng)目 -->

<build>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<version>3.8.1</version>

<configuration>

<!-- 設(shè)置編碼 -->

<encoding>UTF-8</encoding>

<!-- JDK版本 -->

<source>1.8</source>

<target>1.8</target>

</configuration>

</plugin>

<!-- 安裝install命令的時(shí)候跳過單元測試 -->


<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-surefire-plugin</artifactId>

<version>2.22.2</version>

<configuration>

<skipTests>true</skipTests>

</configuration>

</plugin>

</plugins>

</build>

</project>


[if !supportLists]2.3.2.?[endif]第二部分:配置整合部分

整合MybatisPlus與Spring的配置。創(chuàng)建一個(gè)spirng-data.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"

xsi:schemaLocation="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.3.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">


?????<!-- 第一步:配置數(shù)據(jù)源 -->

?????<bean?name="dataSource"?class="com.alibaba.druid.pool.DruidDataSource">

???????<property?name="driverClassName"?value="com.mysql.jdbc.Driver"></property>

???????<property?name="url"?value="jdbc:mysql://localhost:3306/mybatis-plus"></property>

???????<property?name="username"?value="root"></property>

???????<property?name="password"?value="123456"></property>

???????<!-- 最大激活的連接數(shù) -->

???????<property?name="maxActive"?value="10"></property>

???????<!-- 最大空閑連接數(shù)據(jù) -->

<!-- ???????<property name="maxIdle" value="5"></property> -->

???????<!-- 超時(shí)毫秒數(shù) -->

???????<property?name="maxWait"?value="30000"></property>

?????</bean>

?????<!-- 第二步:獲得會(huì)話工廠 -->

?????<bean?name="sqlSessionFactory"?class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">

???????<!-- 指定數(shù)據(jù)源 -->

???????<property?name="dataSource"?ref="dataSource"></property>

?????</bean>


?????<!-- 第三步:掃描動(dòng)態(tài)映射對(duì)象到Spring容器 -->

?????<bean?class="org.mybatis.spring.mapper.MapperScannerConfigurer">

???????<!-- 指定會(huì)話工廠 -->

???????<property?name="sqlSessionFactoryBeanName"?value="sqlSessionFactory"></property>

???????<!-- 指定掃描的映射包 -->

???????<property?name="basePackage"?value="org.chu.mybatisplus.mapper"></property>

?????</bean>


?????<!-- 第四步:配置事務(wù)代理 -->

?????<bean?name="tx"?class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

???????<property?name="dataSource"?ref="dataSource"></property>

?????</bean>

?????<tx:annotation-driven?transaction-manager="tx"/>

</beans>


第三部分:實(shí)現(xiàn)操作功能

說明:完成實(shí)驗(yàn)MybatisPlus對(duì)數(shù)據(jù)庫增刪改查衣吠。


第一步:編寫POJO

說明:使用Mybatis-Plus不使用xml文件茶敏,而是基于一組注解來解決實(shí)體類數(shù)據(jù)庫表映射問題。


@TableName(value="tb_user")指定對(duì)應(yīng)的表缚俏,表名和類名一致時(shí)惊搏,可以省略value屬性。

@TableId指定表的主鍵忧换。Value屬性指定表的主鍵字段恬惯,和屬性名一致時(shí),可以省略亚茬。Type指定主鍵的增長策略酪耳。

@TableField指定類的屬性映射的表字段,名稱一致時(shí)可以省略該注解刹缝。


package?org.chu.mybatisplus.pojo;


import?com.baomidou.mybatisplus.annotations.TableField;

import?com.baomidou.mybatisplus.annotations.TableId;

import?com.baomidou.mybatisplus.annotations.TableName;

import?com.baomidou.mybatisplus.enums.IdType;


@TableName(value="tb_user")

public?class?User {


???/*--

???????AUTO->`0`("數(shù)據(jù)庫ID自增")

???????INPUT->`1`(用戶輸入ID")

???????ID_WORKER->`2`("全局唯一ID")

???????UUID->`3`("全局唯一ID")

???????NONE-> 4 ("不需要ID")

???--*/

@TableId(value="id",type=IdType.AUTO)

private?Long id;//BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',

//如果屬性名與數(shù)據(jù)庫表的字段名相同可以不寫

@TableField(value="name")

private?String name;//VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',

@TableField(value="age")

private?Integer age;//INT(11) NULL DEFAULT NULL COMMENT '年齡',

@TableField(value="email")

private?String email;//VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',

?//補(bǔ)全get/set方法

}



第二步:編寫Mapper接口

package?org.chu.mybatisplus.mapper;

import?org.chu.mybatisplus.pojo.User;

import?com.baomidou.mybatisplus.mapper.BaseMapper;

public?interface?UserMapper extends?BaseMapper<User> {


}

第三步:測試增刪改查

package?org.chu.test.mapper;

import?java.util.List;


import?org.chu.mybatisplus.mapper.UserMapper;

import?org.chu.mybatisplus.pojo.User;

import?org.junit.Test;

import?org.junit.runner.RunWith;

import?org.springframework.beans.factory.annotation.Autowired;

import?org.springframework.test.context.ContextConfiguration;

import?org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


import?com.baomidou.mybatisplus.mapper.EntityWrapper;

import?com.baomidou.mybatisplus.mapper.Wrapper;

//注意事項(xiàng):Maven的單元測試包必須放置測試源碼包里面

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations="classpath:spring-data.xml")

public?class?UserMapperTest {

@Autowired

private?UserMapper userMapper;

@Test

public?void?insert() {

try?{

User user=new?User();

user.setName("wangwu");

user.setAge(20);

user.setEmail("wangwu@163.com");

Integer insert?= userMapper.insert(user);

System.out.println(insert);

} catch?(Exception e) {

// TODO?Auto-generated catch block

e.printStackTrace();

}

}

@Test

public?void?deleteById() {

try?{

Integer count?= userMapper.deleteById(1L);

System.out.println(count);

} catch?(Exception e) {

// TODO?Auto-generated catch block

e.printStackTrace();

}

}

@Test

public?void?deleteByCondition() {

try?{

//設(shè)置條件

EntityWrapper<User> wrapper=new?EntityWrapper<>();

wrapper.like("name", "%wang%");

Integer count?= userMapper.delete(wrapper);

System.out.println(count);

} catch?(Exception e) {

e.printStackTrace();

}

}

@Test

public?void?update() {

User user=new??User();

user.setName("wangwu");

user.setEmail("wangwu@163.com");

user.setId(2L);

userMapper.updateById(user);

}

@Test

public?void?findAll() {

List<User> users?= userMapper.selectList(null);

for?(User user?: users) {

System.out.println(user.getName());

}

}


}



常用配置

實(shí)體類全局配置

如果在配置文件指定實(shí)體類的全局配置碗暗,那么可以不需要再配置實(shí)體類的關(guān)聯(lián)注解颈将。

--配置文件spring-data.xml的修改

???<!-- 第二步:獲得會(huì)話工廠 -->

?????<bean?name="sqlSessionFactory"?class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">

???????<!-- 指定數(shù)據(jù)源 -->

???????<property?name="dataSource"?ref="dataSource"></property>

???????<!-- 全局實(shí)體類配置 -->

???????<property name="globalConfig"?>

??????????<bean class="com.baomidou.mybatisplus.entity.GlobalConfiguration">

????????????<!--

????????????AUTO->`0`("數(shù)據(jù)庫ID自增")

?????????????INPUT->`1`(用戶輸入ID")

????????????ID_WORKER->`2`("全局唯一ID")

????????????UUID->`3`("全局唯一ID")

???????? -->

????????????<property name="idType"?value="0"></property>

????????????<!-- 實(shí)體類名與表名的關(guān)聯(lián)規(guī)則是,忽略前綴 -->

????????????<property name="tablePrefix"?value="tb_"></property>

??????????</bean>

???????</property>

?????</bean>

--實(shí)體類就可以去掉關(guān)聯(lián)的注解了

package?org.chu.mybatisplus.pojo;

public?class?User {

private?Long id;

private?String name;

private?Integer age;

private?String email;

//補(bǔ)全get言疗、set方法

}


插件配置

Mybatis默認(rèn)情況下晴圾,是不支持物理分頁的。默認(rèn)提供的RowBounds這個(gè)分頁是邏輯分頁來的噪奄。


所謂的邏輯分頁疑务,就是將數(shù)據(jù)庫里面的數(shù)據(jù)全部查詢出來后,在根據(jù)設(shè)置的參數(shù)返回對(duì)應(yīng)的記錄梗醇。(分頁是在程序的內(nèi)存中完成)知允。【表數(shù)據(jù)過多時(shí)叙谨,會(huì)溢出】


所謂的物理分頁温鸽,就是根據(jù)條件限制,返回指定的記錄手负。(分頁在數(shù)據(jù)庫里面已經(jīng)完成)


MybatisPlus是默認(rèn)使用RowBounds對(duì)象是支持物理分頁的涤垫。但是需要通過配置Mybatis插件來開啟。



配置代碼

?????<!-- 第二步:獲得會(huì)話工廠 -->

?????<bean?name="sqlSessionFactory"?class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">

???????<!-- 指定數(shù)據(jù)源 -->

???????<property?name="dataSource"?ref="dataSource"></property>

???????<!-- 全局實(shí)體類配置 -->

???????<property?name="globalConfig"?>

??????????<bean?class="com.baomidou.mybatisplus.entity.GlobalConfiguration">

????????????<!--

????????????AUTO->`0`("數(shù)據(jù)庫ID自增")

?????????????INPUT->`1`(用戶輸入ID")

????????????ID_WORKER->`2`("全局唯一ID")

????????????UUID->`3`("全局唯一ID")

???????? -->

????????????<property?name="idType"?value="0"></property>

????????????<!-- 實(shí)體類名與表名的關(guān)聯(lián)規(guī)則是竟终,忽略前綴 -->

????????????<property?name="tablePrefix"?value="tb_"></property>

??????????</bean>

???????</property>

???????<!-- 配置插件 -->

???????<property name="plugins">

??????????<list>

????????????<!-- 分頁的支持 -->

????????????<bean class="com.baomidou.mybatisplus.plugins.PaginationInterceptor">

???????????????<!-- 方言 -->

???????????????<!-- 我們使用的是MySQL數(shù)據(jù)庫蝠猬,所以需要配置MySQL的方言 -->

???????????????<property name="dialectClazz"?value="com.baomidou.mybatisplus.plugins.pagination.dialects.MySqlDialect"></property>

????????????</bean>

????????????<!-- 配置支持SQL輸出 -->

????????????<bean class="com.baomidou.mybatisplus.plugins.PerformanceInterceptor">

???????????????<property name="format"?value="true"></property>

????????????</bean>

??????????</list>

???????</property>

?????</bean>


自定義SQL語句支持

--實(shí)現(xiàn)代碼

package?org.chu.mybatisplus.mapper;

import?java.util.List;

import?org.apache.ibatis.annotations.Select;

import?org.chu.mybatisplus.pojo.User;

import?com.baomidou.mybatisplus.mapper.BaseMapper;

public?interface?UserMapper extends?BaseMapper<User> {

@Select(value="select * from tb_user")

List<User> findAll();

}

--測試代碼

package?org.chu.test.mapper;

import?java.util.List;


import?org.chu.mybatisplus.mapper.UserMapper;

import?org.chu.mybatisplus.pojo.User;

import?org.junit.Test;

import?org.junit.runner.RunWith;

import?org.springframework.beans.factory.annotation.Autowired;

import?org.springframework.test.context.ContextConfiguration;

import?org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

//注意事項(xiàng):Maven的單元測試包必須放置測試源碼包里面

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations="classpath:spring-data.xml")

public?class?UserMapperTest {

@Autowired

private?UserMapper userMapper;

@Test

public?void?findAll() {


try?{

List<User> users?= userMapper.findAll();

for?(User user?: users) {

System.out.println(user.getName());

}

} catch?(Exception e) {

e.printStackTrace();

}

}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市统捶,隨后出現(xiàn)的幾起案子榆芦,更是在濱河造成了極大的恐慌,老刑警劉巖喘鸟,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匆绣,死亡現(xiàn)場離奇詭異,居然都是意外死亡什黑,警方通過查閱死者的電腦和手機(jī)崎淳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愕把,“玉大人拣凹,你說我怎么就攤上這事『藁恚” “怎么了嚣镜?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長圣絮。 經(jīng)常有香客問我祈惶,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任捧请,我火速辦了婚禮凡涩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疹蛉。我一直安慰自己活箕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布可款。 她就那樣靜靜地躺著育韩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闺鲸。 梳的紋絲不亂的頭發(fā)上筋讨,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音摸恍,去河邊找鬼悉罕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛立镶,可吹牛的內(nèi)容都是我干的壁袄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼媚媒,長吁一口氣:“原來是場噩夢啊……” “哼嗜逻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缭召,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤栈顷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后恼琼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妨蛹,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年晴竞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狠半。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡噩死,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出神年,到底是詐尸還是另有隱情已维,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布已日,位于F島的核電站垛耳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜堂鲜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一栈雳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缔莲,春花似錦哥纫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至读拆,卻和暖如春擅憔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背檐晕。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工暑诸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棉姐。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓屠列,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伞矩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子笛洛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容