使用 Mybatis-plus 進行 crud 操作


1 Mybatis-Plus簡介

1.1 什么是Mybatis-Plus

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

1.2 為什么要學習Mybatis-Plus

我們已經學習過Mybatis這個框架,我們只需要在dao層定義抽象接口,基於Mybatis零實現的特性,就可以實現對數據庫的crud操作。在業務類型比較多的時候,我們需要重復的定義一堆功能類似的接口方法。

使用Mybatis-plus工具,我們只需要將我們定義的抽象接口,繼承一個公用的 BaseMapper<T> 接口,就可以獲得一組通用的crud方法,來操作數據庫。使用Mybatis-plus時,甚至都不需要任何的xml映射文件或者接口方法注解,真正的dao層零實現。

2 入門示例

2.1 需求

使用Mybatis-Plus實現對用戶的crud操作。

2.2 配置步驟說明

  1. 搭建環境(創建項目、導入包)
  2. 配置Mybaits-Plus(基於Spring實現)
  3. 編寫測試代碼

2.3 配置步驟

2.3.1 第一步:搭建環境

2.3.1.1 數據庫准備

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`)
)

2.3.1.2 說明

  1. Mybatis-Plus並沒有提供單獨的jar包,而是通過Maven(或者gradle)來管理jar依賴。
  2. Mybatis-Plus是基於Spring框架實現的,因此使用Mybatis-Plus,必須導入Spring相關依賴。

2.3.1.3 添加依賴

編寫 pom 配置文件

<?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>org.oza.mybatisplus</groupId>
    <artifactId>mybatisplus-demo-start</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.1.2</version>
        </dependency>
        <!--spring 基礎依賴-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.2.RELEASE</version>
        </dependency>
        <!--spring jdbc 依賴-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.2.RELEASE</version>
        </dependency>
        <!--spring test-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.3.2.RELEASE</version>
        </dependency>
        <!--mysql 驅動-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
        <!--連接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.9</version>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
</project>

2.3.2 第二步:創建User實體類

使用Mybatis-Plus可以不使用xml文件,而是基於一組注解來解決實體類和數據庫表的映射問題。以下注解作用於實體類的字段聲明上:

注解 含義
@TableName(value="tb_user") 指定對應的表,表名和類名一致時,可以省略value屬性。
@TableId 指定表的主鍵。Value屬性指定表的主鍵字段,和屬性名一致時,可以省略。Type指定主鍵的增長策略。
@TableField 指定類的屬性映射的表字段,名稱一致時可以省略該注解。

源碼如下:

package org.oza.mybatisplus.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

@TableName("tb_user")
public class User {

    @TableId(value = "u_id", type = IdType.AUTO)
    private Long id;
    @TableField("u_name")
    private String name;
    @TableField("u_age")
    private Integer age;
    @TableField("u_email")
    private String email;
}

2.3.3 第三步:創建UserMapper接口

只需要繼承BaseMapper公共接口即可。

package org.oza.mybatisplus.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.oza.mybatisplus.pojo.User;

import java.util.List;


public interface UserMapper extends BaseMapper<User> {
    /**
     * 自定義方法,展示所有用戶的用戶名
     * @return 用戶名集合
     */
    @Select("select u_name from tb_user")
    List<String> listAllUsername();

    /**
     * 自定義方法,搜索所有用戶的郵箱,並封裝進 user 對象里
     * @return
     */
    @Select("select u_email from tb_user")
    @Results(
            @Result(column = "u_email", property = "email")
    )
    List<User> listAllEmail();
}

2.3.4 第四步:配置 spring 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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.xsd


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

    <!--開啟 spring 組件掃描-->
    <context:component-scan base-package="org.oza.mybatisplus"/>

    <!--1. 數據源-->
    <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false"/>
        <property name="username" value="root"/>
        <property name="password" value="password"/>
        <property name="maxActive" value="10"/>
        <property name="minIdle" value="5"/>
    </bean>

    <!--2. mybatis-plus 整合 spring-->
    <bean name="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
        <!--加載數據源-->
        <property name="dataSource" ref="dataSource"/>
        <!--配置插件-->
        <property name="plugins">
            <array>
                <!--物理分頁支持-->
                <bean class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"/>
                <!--SQL語句輸出-->
                <bean class="com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor"/>
            </array>
        </property>
    </bean>

    <!--3. 配置 mybatis-plus 動態代理-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
        <property name="basePackage" value="org.oza.mybatisplus.mapper"/>
    </bean>

    <!--4. 配置事務管理器-->
    <bean name="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--5. 開啟事務注解支持,指定事務管理器-->
    <tx:annotation-driven transaction-manager="txManager"/>
</beans>

2.3.5 第五步:編寫測試代碼

package org.oza.mybatisplus;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.session.RowBounds;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.oza.mybatisplus.mapper.UserMapper;
import org.oza.mybatisplus.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.sql.SQLOutput;
import java.util.List;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-mybatisplus.xml")
public class CrudTest {
    @Autowired
    private UserMapper userMapper;

    /**
     * 插入一條數據
     */
    @Test
    public void insert() {
        User user = new User(null, "張無忌", 18, "zwj@qq.com");
        int insert = userMapper.insert(user);
        System.out.println("Affected rows: " + insert);
    }

    /**
     * 根據 ID 刪除
     */
    @Test
    public void deleteById(){
        int delete = userMapper.deleteById(1);
        System.out.println("Affected rows: " + delete);

    }

    /**
     * 根據 ID 查詢
     */
    @Test
    public void selectById() {
        User user = userMapper.selectById(1);
        System.out.println(user);
    }

    /**
     * 根據條件刪除, 刪除名字含 張 字的
     */
    @Test
    public void deleteByCondition(){
        QueryWrapper<User> userWrapper = new QueryWrapper<>();
        userWrapper.like("u_name", "張");
        int delete = userMapper.delete(userWrapper);
        System.out.println("Affected rows: " + delete);
    }

    /**
     * 根據 Id 進行修改,只修改不為空的數據
     */
    @Test
    public void update() {
        User user = new User(4L, null, 25, null);
        int update = userMapper.updateById(user);
        System.out.println("Affected rows: " + update);
    }

    /**
     * 批量修改,將所有名字含有 張 的都修改
     */
    @Test
    public void updateByCondition() {
        User user = new User(null, null, 25, null);
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.like("u_name", "張");
        int update = userMapper.update(user, updateWrapper);
        System.out.println("Affected rows: " + update);
    }

    /**
     * 根據條件查詢,將所有名字帶 張 的查出來
     */
    @Test
    public void selectByCondition() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("u_name", "張");
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(user -> System.out.println(user));
    }

    /**
     * 分頁查詢,selectPage 可以傳入兩個參數
     *  參數 1:Page 對象,包含了分頁信息,其構造方法參數
     *      參數 1:當前頁,從 1 開始
     *      參數 2:頁面容量
     *  參數 2:QueryWrapper 對象,設置搜索的條件
     * 結果:IPage 抽象類的子類對象,包含了一下信息:
     *  1. 當前頁
     *  2. 總頁數
     *  3. 總記錄數
     *  4. 頁面容量
     *  5. 當前頁的記錄
     */
    @Test
    public void selectByPage() {
        IPage iPage = userMapper.selectPage(new Page(1L, 2), null);
        System.out.println("current page: " + iPage.getCurrent());
        System.out.println("total pages: " + iPage.getPages());
        System.out.println("total records: " + iPage.getTotal());
        System.out.println("page size: " + iPage.getSize());
        System.out.println("records: " + iPage.getRecords());
    }

    /**
     * 自定義方法測試
     */
    @Test
    public void listAllUsername() {
        List<String> usernames = userMapper.listAllUsername();
        System.out.println(usernames);

        List<User> users = userMapper.listAllEmail();
        users.forEach(user -> System.out.println(user.getEmail()));
    }
}

2.3.6 第六步:編寫 Service 層

mybatis-plus 還提供了 Service 層的快速實現。同樣不需要寫任何實現方法,即可輕松構建 Service 層。

需要注意的是,service 層方法名和 dao 層的方法名有些許不同

編寫 UserService 接口

package org.oza.mybatisplus.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.oza.mybatisplus.pojo.User;

/**
 * 繼承 IService,泛型中寫入 pojo 類
 */
public interface UserService extends IService<User> {
}

編寫 UserServiceImpl 實現類

package org.oza.mybatisplus.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.oza.mybatisplus.mapper.UserMapper;
import org.oza.mybatisplus.pojo.User;
import org.oza.mybatisplus.service.UserService;
import org.springframework.stereotype.Service;

/**
 * 繼承 ServiceImpl,實現 UserService 接口
 *      ServiceImpl:該類實現了 IService 接口,需要兩個泛型參數
 *          參數1:對應的 Mapper 類
 *          參數2:對應的 Pojo 類
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

測試代碼

/**
 * 使用 service 層執行分頁查詢
 */
@Test
public void serviceTest() {
    IPage iPage = userService.page(new Page(1L, 2), null);
    System.out.println("current page: " + iPage.getCurrent());
    System.out.println("total pages: " + iPage.getPages());
    System.out.println("total records: " + iPage.getTotal());
    System.out.println("page size: " + iPage.getSize());
    System.out.println("records: " + iPage.getRecords());
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM