MyBatis-Plus(簡稱MP)是一個(gè)?MyBatis的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生荔烧。
我們已經(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只是在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)編寫測試代碼
前提
已經(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();
}
}
}