Mybatis插件之MybatisPlus入門

目錄

一、引言

二、簡介

三、特性

四、架構

五、快速入門(基於IDEA開發工具)

5.1 數據庫準備

5.1.1 創建數據庫、表、插入數據

5.2 使用IDEA編寫入門案例

5.2.1創建maven工程

5.2.2 導入依賴(整合SpringBoot進行開發)

5.2.3 編寫application.properties文件

5.2.4 編寫User實體類

5.2.5 編寫UserMapper接口

5.2.6 編寫SpringBoot啓動類

5.2.7 編寫測試用例

5.3 BaseMapper接口

5.3.1 源碼詳解

5.3.2 BaseMapper接口的方法進行測試

5.3.3 分頁查詢

5.4 Mybatis-plus插件的配置


一、引言

針對ORM這一層的技術選型,一般採用 Mybatis框架作爲持久層框架,原因是Mybatis對SQL語句編寫更加的靈活。 爲了提升開發的效率,很多人會選用MybatisPlus作爲mybatis開發的的插件,以提升開發的效率。

二、簡介

官網地址:https://mp.baomidou.com/guide/

MyBatis-Plus(簡稱 MP)是一個 MyBatis 的增強工具,在 MyBatis 的基礎上只做增強不做改變,爲簡化開發、提高效率而生。

三、特性

  • 無侵入:只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑
  • 損耗小:啓動即會自動注入基本 CURD,性能基本無損耗,直接面向對象操作
  • 強大的CRUD操作:內置通用 Mapper、通用 Service,僅僅通過少量配置即可實現單表大部分 CRUD 操 作,更有強大的條件構造器,滿足各類使用需求
  • 支持 Lambda 形式調用:通過 Lambda 表達式,方便的編寫各類查詢條件,無需再擔心字段寫錯
  • 支持多種數據庫:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、 SQLServer2005、SQLServer 等多種數據庫
  • 支持主鍵自動生成:支持多達4種主鍵策略(內含分佈式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題支持XML熱加載:Mapper對應的XML支持熱加載,對於簡單的 CRUD 操作,甚至可以無 XML啓動支持
  • ActiveRecord 模式:支持ActiveRecord 形式調用,實體類只需繼承 Model 類即可進行強大的 CRUD 操作支持自定義
  • 全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 支持關鍵詞自動轉義:支持數據庫關鍵詞(order、key......)自動轉義,還可自定義關鍵詞
  • 內置代碼生成器:採用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來使用
  • 內置分頁插件:基於 MyBatis 物理分頁,開發者無需關心具體操作,配置好插件之後,寫分頁等同於普通 List 查詢
  • 內置性能分析插件:可輸出 Sql 語句以及其執行時間,建議開發測試時啓用該功能,能快速揪出慢查詢
  • 內置全局攔截插件:提供全表 delete 、update 操作智能分析阻斷,也可自定義攔截規則,預防誤操作
  • 內置 Sql 注入剝離器:支持 Sql 注入剝離,有效預防 Sql 注入攻擊

四、架構

五、快速入門(基於IDEA開發工具)

5.1 數據庫準備

5.1.1 創建數據庫、表、插入數據

# 創建mumu數據庫
create database dbmumu character set utf8;
# 使用數據庫
use dbmumu;

# 創建user表
create table 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)
	)engine=InnoDB default charset=utf8;
	
# 向user表插入數據
INSERT INTO `user` (`id`, `name`, `age`, `email`) VALUES ('1', 'Jone', '18','[email protected]');
INSERT INTO `user` (`id`, `name`, `age`, `email`) VALUES ('2', 'Jack', '20','[email protected]');
INSERT INTO `user` (`id`, `name`, `age`, `email`) VALUES ('3', 'Tom', '28','[email protected]');
INSERT INTO `user` (`id`, `name`, `age`, `email`) VALUES ('4', 'Sandy', '21','[email protected]');
INSERT INTO `user` (`id`, `name`, `age`, `email`) VALUES ('5', 'Billie', '24','[email protected]');
insert into user(`id`,`name`,`age`,`email`) values('6','張無忌','18','[email protected]');
insert into user(`id`,`name`,`age`,`email`) values('7','趙敏','17','[email protected]');
insert into user(`id`,`name`,`age`,`email`) values('8','周芷若','17','[email protected]');
insert into user(`id`,`name`,`age`,`email`) values('9','宋青書','20','[email protected]');
insert into user(`id`,`name`,`age`,`email`) values('10','趙敏君','30','[email protected]');


# 查看錶記錄
select * from user;

5.2 使用IDEA編寫入門案例

5.2.1創建maven工程

5.2.2 導入依賴(整合SpringBoot進行開發)

<?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>cn.poison.mybatisplus</groupId>
    <artifactId>poison-mybatis-plus</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--SpringBoot版本鎖定-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.RELEASE</version>
    </parent>

    <dependencies>
        <!--SpringBoot依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!--SpringBoot測試依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!--mybatis的SpringBoot支持-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>
        <!--mysql驅動-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!--SpringBoot的maven插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

5.2.3 編寫application.properties文件

#SpringBoot應用配置的名稱
spring.application.name=poison-mybatis-plus

#mysql驅動
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#mysql數據源連接地址
spring.datasource.url=jdbc:mysql://10.10.10.220:3306/dbmumu?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&userSSL=false
#mysql數據庫登錄名
spring.datasource.username=root
#mysql數據庫登錄密碼
spring.datasource.password=root

5.2.4 編寫User實體類

package cn.poison.mybatisplus.pojo;
import java.io.Serializable;
/**
 * 用戶表實體類
 * Tool: IntelliJ IDEA.
 * Author: Poison
 * CreateDateTime: 2020/3/15 12:03
 */
public class User implements Serializable {
    @TableId(value = "ID",type = IdType.AUTO)  //設置id自增
    private Long id;      //用戶id
    private String name;  //用戶姓名
    private Integer age;  //用戶年齡
    private String email; //用戶郵箱

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                '}';
    }
}
  • 注意點1:

這裏通過@TableId註解設置user實體類封裝時的id自增,它會根據數據庫的自增初始值進行增加,所以數據庫user表要先設置id自增

  • 注意點2:

如果數據庫user表設置了id自增,而不在user實體類中添加@TableId註解設置id屬性自增的話,則id值會在實體類封裝的時候隨機生成,不會按照數據庫user表的自增初始值進行增長,並且會把隨機生成的隨機值設置爲數據庫user表的自增初始值,如下面

5.2.5 編寫UserMapper接口

這裏使用mybatis-plus插件,直接繼承BaseMapper接口,

package cn.poison.mybatisplus.mapper;
import cn.poison.mybatisplus.pojo.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
 * 用戶表mapper接口
 * 繼承mybatisplus插件的BaseMapper接口,傳入User泛型
 * Tool: IntelliJ IDEA.
 * Author: Poison
 * CreateDateTime: 2020/3/15 12:06
 */
public interface UserMapper extends BaseMapper<User> {

}

5.2.6 編寫SpringBoot啓動類

package cn.poison.mybatisplus;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
 * SpringBoot啓動類
 * Tool: IntelliJ IDEA.
 * Author: Poison
 * CreateDateTime: 2020/3/15 12:26
 */
@MapperScan(basePackages = "cn.poison.mybatisplus.mapper") //指定mapper接口的掃描包
@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class,args);
    }
}

5.2.7 編寫測試用例

在test目錄下編寫

package cn.poison.mybatisplus.mapper;

import cn.poison.mybatisplus.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;

/**
 * 編寫UserMapper接口的測試用例
 * Tool: IntelliJ IDEA.
 * Author: Poison
 * CreateDateTime: 2020/3/15 12:30
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {

    /**
     * 此處會報錯,實際上沒有錯誤,不影響運行
     */
    @Autowired
    private UserMapper userMapper;

    @Test
    public void testUserMapper(){
        List<User> users = this.userMapper.selectList(null);
        for (User user : users) {
            System.out.println("--->"+user);
        }
    }
}

運行結果:

5.3 BaseMapper接口

5.3.1 源碼詳解

在MybatisPlus中,BaseMapper中定義了一些常用的CRUD方法,當我們自定義的Mapper接口繼承BaseMapper 後即可擁有了這些方法。

需要說明的是:這些方法僅適合單表操作。

/**
 * Mapper 繼承該接口後,無需編寫 mapper.xml 文件,即可獲得CRUD功能
 * 這個 Mapper 支持 id 泛型
 */
public interface BaseMapper<T> {
    /**
     * 插入一條記錄
     *
     * @param entity 實體對象
     */
    int insert(T entity);

    /**
     * 根據 ID 刪除
     * @param id 主鍵ID
     */
    int deleteById(Serializable id);

    /**
     * 根據 columnMap 條件,刪除記錄
     * @param columnMap 表字段 map 對象
     */
    int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

    /**
     * 根據 entity 條件,刪除記錄
     * @param queryWrapper 實體對象封裝操作類(可以爲 null)
     */
    int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 刪除(根據ID 批量刪除)
     * @param idList 主鍵ID列表(不能爲 null 以及 empty)
     */
    int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

    /**
     * 根據 ID 修改
     * @param entity 實體對象
     */
    int updateById(@Param(Constants.ENTITY) T entity);

    /**
     * 根據 whereEntity 條件,更新記錄
     * @param entity 實體對象 (set 條件值,不能爲 null)
     * @param updateWrapper 實體對象封裝操作類(可以爲 null,裏面的 entity 用於生成 where
    語句)
     */
    int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER)Wrapper<T> updateWrapper);

    /**
     * 根據 ID 查詢
     * @param id 主鍵ID
     */
    T selectById(Serializable id);

    /**
     * 查詢(根據ID 批量查詢)
     * @param idList 主鍵ID列表(不能爲 null 以及 empty)
     */
    List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
    /**
     * 查詢(根據 columnMap 條件)
     * @param columnMap 表字段 map 對象
     */
    List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object>
                            columnMap);
    /**
     * 根據 entity 條件,查詢一條記錄
     * @param queryWrapper 實體對象
     */
    T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根據 Wrapper 條件,查詢總記錄數
     * @param queryWrapper 實體對象
     */
    Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根據 entity 條件,查詢全部記錄
     * @param queryWrapper 實體對象封裝操作類(可以爲 null)
     */
    List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根據 Wrapper 條件,查詢全部記錄
     * @param queryWrapper 實體對象封裝操作類(可以爲 null)
     */
    List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T>
                                                 queryWrapper);
    /**
     * 根據 Wrapper 條件,查詢全部記錄
     * 注意: 只返回第一個字段的值
     * @param queryWrapper 實體對象封裝操作類(可以爲 null)
     */
    List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根據 entity 條件,查詢全部記錄(並翻頁)
     * @param page 分頁查詢條件(可以爲 RowBounds.DEFAULT)
     * @param queryWrapper 實體對象封裝操作類(可以爲 null)
     */
    IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根據 Wrapper 條件,查詢全部記錄(並翻頁)
     * @param page 分頁查詢條件
     * @param queryWrapper 實體對象封裝操作類
     */
    IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}

5.3.2 BaseMapper接口的方法進行測試

接着上面的入門案例對BaseMapper的CRUD方法進行調用

  • 通過主鍵查詢
    /**
     * 測試通過id查詢用戶
     */
    @Test
    public void testSelectById(){
        //id爲long類型
        User user = this.userMapper.selectById(3L);
        System.out.println(user);
    }

  • 通過字段模糊查詢(like)
    /**
     * 測試模糊查詢
     */
    @Test
    public void testSelectListByLike(){
        //定義Wrapper類型對象
        QueryWrapper<User> wrapper=new QueryWrapper<>();
        //添加模糊查詢字段
        wrapper.like("name","o");
        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println("--->"+user);
        }
    }

  • 通過條件查詢
    /**
     * 測試條件查詢
     */
    @Test
    public void testSelectListByLe(){
        //定義Wrapper類型對象
        QueryWrapper<User> wrapper=new QueryWrapper<>();
        //添加條件查詢字段,年齡小於18的用戶(包含18)
        wrapper.le("age","18");
        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println("--->"+user);
        }
    }

  • 插入數據
   /**
     * 測試插入數據
     */
    @Test
    public void testSave(){
        User user = new User();
        user.setName("楊過");
        user.setAge(20);
        user.setEmail("[email protected]");
        int i = this.userMapper.insert(user);
    }

  • 刪除數據
    /**
     * 測試刪除數據
     */
    @Test
    public void testDelete(){
        int i = this.userMapper.deleteById(12L);
        System.out.println("刪除數據-->"+i);

    }

 --------->

  • 修改數據

根據id修改user對象中不爲null的用戶數據

    /**
     * 根據id修改user不爲null的字段
     */
    @Test
    public void testUpdate(){
        User user = new User();
        user.setId(11L);
        user.setName("郭靖");

        int i = this.userMapper.updateById(user);
        System.out.println("修改結果--->"+i);
    }

----------->

5.3.3 分頁查詢

第一步:在案例的SpringBoot啓動類MyApplication中添加分頁插件,註冊到Spring容器

   /**
     * 添加分頁插件,放進Spring容器
     * @return
     */
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }
    

第二步:測試使用

   /**
     * 分頁查詢
     */
    @Test
    public void testSelectByPage(){
        //第一個參數爲當前頁碼,第二個參數爲每頁顯示的數據
        Page<User> page=new Page<>(1,5);
        IPage<User> userIPage = this.userMapper.selectPage(page, null);
        System.out.println("總條數---->"+userIPage.getTotal());
        System.out.println("當前頁碼-->"+userIPage.getCurrent());
        System.out.println("每頁顯示記錄條數--->"+userIPage.getSize());
        System.out.println("總頁數---->"+userIPage.getPages());
        System.out.println("查詢得到的記錄---->"+userIPage.getRecords());
    }

運行結果: 

5.4 Mybatis-plus插件的配置

雖然在MybatisPlus中可以實現零配置,但是有些時候需要我們自定義一些配置,就需要使用Mybatis原生的一些配置文件方式了。

可在application.properties文件中配置

# 指定全局配置文件
mybatis-plus.config-location = classpath:mybatis-config.xml
# 指定mapper.xml文件
mybatis-plus.mapper-locations = classpath*:mybatis/*.xml

詳細配置可查看官網:https://mp.baomidou.com/config/#%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE

  • Spring Boot 工程:

    • 配置 MapperScan 註解

      @SpringBootApplication
      @MapperScan("com.baomidou.mybatisplus.samples.quickstart.mapper")
      public class Application {
      
          public static void main(String[] args) {
              SpringApplication.run(QuickStartApplication.class, args);
          }
      
      }
      
  • Spring MVC 工程:

    • 配置 MapperScan

      <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
          <property name="basePackage" value="com.baomidou.mybatisplus.samples.quickstart.mapper"/>
      </bean>
      
    • 調整 SqlSessionFactory 爲 MyBatis-Plus 的 SqlSessionFactory

      <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
          <property name="dataSource" ref="dataSource"/>
      </bean>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章