16.SSM框架集~MybatisPlus初步
本文是上一篇文章的後續,詳情點擊該鏈接
MybatisPlus
Mybatis-Plus(簡稱MP)是一個 Mybatis 的增強工具,在 Mybatis 的基礎上只做增強不做改變,爲簡化開發、提高效率而生。官方文檔說的願景是成爲 Mybatis 最好的搭檔。
MyBatis和Mybatis Plus的使用比較
MybatisPlus包含了Mybatis的所有功能,也就說在MybatisPlus中我們仍然可以按照Mybatis的方式來完成數據庫的操作(無侵入)。
MybatisPlus的數據庫操作的Mapper層的接口只需要繼承BaseMapper接口,就自動的擁有了當前對應的表的基本的CRUE操作,無需聲明接口方法及其xml文件,極大的提升了開發效率(MybatisPlus是通過實體類來逆向動態生成對應的表的基本的Sql語句)
MybatisPlus特性
無侵入:只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑
損耗小:啓動即會自動注入基本CURD,性能基本無損耗,直接面向對象操作
強大的CRUD操作:內置通用Mapper.通用Service,僅僅通過少量配置即可實現單表大部分CRUD操作,更有強大的條件構造器,滿足各類使用需求
支持Lambda形式調用:通過Lambda表達式,方便的編寫各類查詢條件,無需再擔心字段寫錯
支持主鍵自動生成:支持多達4種主健策略(內含分佈式唯一ID 生成器. Sequence),可自由配置,完美解決主鍵問題
支持ActiveRecord模式:支持ActiveRecord形式調用,實體類只需繼承Model類即可進行強大的CRUD操作
支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )
無內置代碼生成器:採用代碼或者Maven插件可快速生成Mapper. Model. Service、Controller層代碼,支持模板引擎,更有超多自定義配置等您來使用
內置分頁插件:基於MyBatis物理分頁,開發者無需關心具體操作,配置好插件之後,寫分頁等同於普通List查詢
分頁插件支持多種數據庫:支持MySQL. MariaDB. Oracle. DB2. H2、 HSQL. sQlite. Postgre.SQLServer等多種數據庫
內置性能分析插件:可輸出Sql語句以及其執行時間,建議開發測試時啓用該功能,能快速揪出慢查詢
內置全局攔截插件:提供全表delete、update操作智能分析阻斷,也可自定義攔截規則,預防誤操作
MybatisPlus依賴
<!--MyBatisPlus依賴-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.3.2</version>
</dependency>
代碼實現
新建一個jar項目
導入需要的依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.alvin</groupId>
<artifactId>MybatisPlusProject</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<mysql-version>8.0.11</mysql-version>
<mybatis-version>3.5.2</mybatis-version>
<spring-version>5.2.2.RELEASE</spring-version>
<mybatis-spring-version>2.0.4</mybatis-spring-version>
<slf4j-version>1.7.25</slf4j-version>
<junit-version>4.12</junit-version>
</properties>
<dependencies>
<!--mysql的驅動依賴-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-version}</version>
</dependency>
<!--mybatis的核心依賴-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis-version}</version>
</dependency>
<!--springIOC的核心依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<!--spring-jdbc連依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
<!--spring-test依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-version}</version>
</dependency>
<!--spring-webmvc依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-version}</version>
</dependency>
<!--mybatis連接spring的依賴-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring-version}</version>
</dependency>
<!--日誌依賴-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j-version}</version>
</dependency>
<!--單元測試的依賴-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit-version}</version>
<scope>test</scope>
</dependency>
<!--AOP的命名空間依賴-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<!--文件上傳組件的依賴-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<!--跨服務文件訪問依賴-->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19</version>
</dependency>
<!--MyBatisPlus依賴-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.3.2</version>
</dependency>
</dependencies>
</project>
配置applicationContext-mybatis.xml
<?xml version="1.0" encoding="UTF8"?>
<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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
https://www.springframework.org/schema/tx/spring-tx.xsd">
<!--把jdbc.properties文件引入-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!--[A]連接數據庫 獲得數據源-->
<bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${m_driver}"></property>
<property name="url" value="${m_url}"></property>
<property name="username" value="${m_uname}"></property>
<property name="password" value="${m_pwd}"></property>
</bean>
<!--[B]獲得sqlsession工廠-->
<bean id="factory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean" >
<!--引入全局策略-->
<property name="globalConfig" ref="config"></property>
<!--配置分頁插件-->
<property name="plugins">
<array>
<bean class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor">
<!--設置連接數據庫方言-->
<property name="dialectType" value="mysql"></property>
</bean>
</array>
</property>
<property name="dataSource" ref="ds"></property>
<property name="typeAliasesPackage" value="com.alvin.pojo"></property>
</bean>
<!--配置全局策略-->
<bean id="config" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
<property name="dbConfig">
<bean id="db" class="com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig">
<!--表名稱的前綴-->
<!-- <property name="tablePrefix" value="t_"></property>-->
<!--主鍵自增的操作-->
<property name="idType" value="AUTO"></property>
</bean>
</property>
</bean>
<!--[C]掃描mapper文件-->
<bean id="mapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="factory"></property>
<property name="basePackage" value="com.alvin.mapper"></property>
</bean>
</beans>
編寫實體類
public class Flower implements Serializable {
//指定當前字段是主鍵
@TableId(type = IdType.AUTO)
private Integer id;
//@TableField(value = "t_name")
private String name;
private Double price;
private String production;
}//get set就不再文章裏面寫了
編寫Mapper層
public interface FlowerMapper extends BaseMapper<Flower> { }
寫到這裏會不會感覺很奇怪?爲什麼Mapper層一行代碼都沒有,僅僅只是繼承了一個BaseMapper類?好吧,我們現在點進去看一看
在這裏面我們可以看到很多熟悉的方法,沒錯,繼承了這個類之後,對於增刪查改等一些簡單的操作,從此不再需要我們手動來寫Sql語句了~我們來測試類看一看
Test測試類
@ContextConfiguration(locations ={"classpath:applicationContext-mybatis.xml"} )
@RunWith(SpringJUnit4ClassRunner.class)
public class TestA {
@Autowired
private FlowerMapper flowerMapper;
@Test
public void testFlower1(){
List<Flower> list = flowerMapper.selectList(null);
Iterator iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
你看,數據傳過來了~
MyBatis Plus 中的CRUD
查詢操作
查詢全部信息
List<Flower> list = flowerMapper.selectList(null);
Iterator iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
根據ID查詢信息
SELECT id,name,price,production FROM flower WHERE id=?
Flower flower = flowerMapper.selectById(10002);
System.out.println("根據ID查詢: " + flower);
批量查詢
SELECT id,name,price,production FROM flower WHERE id IN ( ? , ? )
List<Integer>listS = new ArrayList<Integer>();
listS.add(10001); listS.add(10003);
list = flowerMapper.selectBatchIds(listS);
System.out.println("批量查詢" + list);
Map查詢
SELECT id,name,price,production FROM flower WHERE name = ? AND id = ?
Map<String,Object> map = new HashMap<String, Object>();
map.put("id",10005);
map.put("name","西蘭花");
List<Flower> list1 = flowerMapper.selectByMap(map);
System.out.println("Map查詢" + list1);
自定義查詢條件
SELECT id,name,price,production FROM flower WHERE (name = ? OR id = ?)
//自定義查詢
QueryWrapper<Flower> queryWrapper = new QueryWrapper<Flower>();
queryWrapper.eq("name","西蘭花").or().eq("id",10005);
List<Flower> list2 = flowerMapper.selectList(queryWrapper);
System.out.println(list2);
添加操作
public void Insert(){
//在添加的時候需要注意 ,如果數據庫中主鍵是自增的,我們一定要在
//實體類中指定主鍵屬性爲 @TableId(type = IdType.AUTO)
Flower flower=new Flower();
flower.setName("XXX");
flower.setPrice((double) 18);
flower.setProduction("中國");
//INSERT INTO flower ( name, price, production ) VALUES ( ?, ?, ? )
int insert = flowerMapper.insert(flower);
}
修改操作
public void Update(){
Flower flower = new Flower();
flower.setId(10001);
flower.setName("玫瑰花");
flowerMapper.updateById(flower);
}
自定義修改條件
//指定修改條件
//UPDATE flower SET production=? WHERE (name = ?)
QueryWrapper queryWrapper=new QueryWrapper();
queryWrapper.eq("name","西蘭花");
flowerMapper.update(f,queryWrapper);
刪除操作
public void Delete(){
//[1]根據ID進行刪除操作
//DELETE FROM flower WHERE id=?
// flowerMapper.deleteById(5);
List<Integer> list=new ArrayList<Integer>();
list.add(10001);
list.add(10003);
//[2]根據ID進行批量刪除操作
//DELETE FROM flower WHERE id IN ( ? , ? )
flowerMapper.deleteBatchIds(list);
//[3]多條件刪除操作,條件之間使用的是and進行關聯
//flowerMapper.deleteByMap();
//[4]自定義刪除條件
//DELETE FROM flower WHERE (name = ? OR production = ?)
QueryWrapper<Flower> queryWrapper=new QueryWrapper();
queryWrapper.eq("name","xxx").or().eq("production","XXX");
flowerMapper.delete(queryWrapper);
}