SpringBoot+Mybatis+MybatisPlus整合實現基本的CRUD操做

SpringBoot+Mybatis+MybatisPlus整合實現基本的CRUD操做

1> 數據準備

-- 建立測試表
CREATE TABLE `tb_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID', `user_name` varchar(20) NOT NULL COMMENT '用戶名', `password` varchar(20) NOT NULL COMMENT '密碼', `name` varchar(30) DEFAULT NULL COMMENT '姓名', `age` int(11) DEFAULT NULL COMMENT '年齡', `email` varchar(50) DEFAULT NULL COMMENT '郵箱', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; -- 插入測試數據
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('1', 'zhangsan', '123456', '張三', '18', 'test1@qq.com'); INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('2', 'lisi', '123456', '李四', '20', 'test2@qq.com'); INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('3', 'wangwu', '123456', '王五', '28', 'test3@qq.com'); INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('4', 'zhaoliu', '123456', '趙六', '21', 'test4@qq.com'); INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('5', 'sunqi', '123456', '孫七', '24', 'test5@qq.com');

2> 建立工程,導入依賴

pom.xml文件以下:java

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.darren</groupId>
    <artifactId>mp</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mp</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--簡化代碼的工具包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--mybatis-plus的springboot支持-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>
        <!--mysql驅動-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3> 添加打印Log的配置文件 log4j.properties

log4j.rootLogger=DEBUG,A1

log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%t] [%c]-[%p] %m%n

說明:對於這部分,能夠添加,也能夠不加,不加會有如下提示信息,建議仍是添加mysql

 4> 編寫 application.yml 配置文件

spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql:///mp?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false username: root password: root

5> 編寫 pojo實體類

import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("tb_user") public class User { @TableId(type = IdType.AUTO) //指定id類型爲自增加
    private Long id; private String userName; private String password; private String name; private Integer age; private String email; }

說明:spring

@TableId註解 指定數據庫id的生成策略,
對於數據庫Id的生成策略,MybatisPlus提供有如下策略,固然這部分小夥伴們也能夠自行查看源碼。
package com.baomidou.mybatisplus.annotation; import lombok.Getter; /** * 生成ID類型枚舉類 * * @author hubin * @since 2015-11-10 */ @Getter public enum IdType { /** * 數據庫ID自增 */ AUTO(0), /** * 該類型爲未設置主鍵類型(將跟隨全局) */ NONE(1), /** * 用戶輸入ID * <p>該類型能夠經過本身註冊自動填充插件進行填充</p> */ INPUT(2), /* 如下3種類型、只有當插入對象ID 爲空,才自動填充。 */
    /** * 全局惟一ID (idWorker) */ ID_WORKER(3), /** * 全局惟一ID (UUID) */ UUID(4), /** * 字符串全局惟一ID (idWorker 的字符串表示) */ ID_WORKER_STR(5); private final int key; IdType(int key) { this.key = key; } }
補充:
MybatisPlus實體類中經常使用的註解,還有一個 @TableField ,此註解主要解決如下兩個問題:
1、對象中的屬性名和字段名不一致的問題(非駝峯) 二、對象中的屬性字段在表中不存在的問題

6> 編寫Mapper 映射接口

import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.darren.mp.pojo.User; public interface UserMapper extends BaseMapper<User> { }

說明:這裏的Mapper接口經過集成 MybatisPlus 提供的 BaseMapper接口來實現對於單表的各類CURD操做,BaseMapper接口中包含的方法有:sql

/** * Mapper 繼承該接口後,無需編寫 mapper.xml 文件,便可得到CRUD功能 * <p>這個 Mapper 支持 id 泛型</p> * * @author hubin * @since 2016-01-23 */
public interface BaseMapper<T> extends Mapper<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 wrapper 實體對象封裝操做類(能夠爲 null) */
    int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper); /** * 刪除(根據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 實體對象封裝操做類(能夠爲 null) */ T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根據 Wrapper 條件,查詢總記錄數 * * @param queryWrapper 實體對象封裝操做類(能夠爲 null) */ 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 條件,查詢所有記錄 * <p>注意: 只返回第一個字段的值</p> * * @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); }

七、編寫測試用例

7.1 插入操做

import com.darren.mp.mapper.UserMapper; import com.darren.mp.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; @SpringBootTest @RunWith(SpringRunner.class) public class UserMapperTest { @Autowired private UserMapper userMapper; /** * 插入操做: * * 插入一條記錄 * entity 實體對象 * int insert(T entity); */ @Test public void testInsert(){ User user = new User(); user.setAge(20); user.setEmail("test8@itcast.cn"); user.setName("lily"); user.setUserName("lily"); user.setPassword("123456"); int result = this.userMapper.insert(user); //返回的result是受影響的行數,並非自增後的id,下同
        System.out.println("result: " + result); System.out.println(user.getId()); //自增後的id會回填到對象中
 } }

測試結果:數據庫

 7.2 更新操做

在MybatisPlus中,更新操做有2種,一種是根據id更新,另外一種是根據條件更新。apache

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.darren.mp.mapper.UserMapper; import com.darren.mp.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; @SpringBootTest @RunWith(SpringRunner.class) public class UserMapperTest { @Autowired private UserMapper userMapper; /** * 更新操做 * 一、根據 ID 修改 * * entity 實體對象 * int updateById(@Param(Constants.ENTITY) T entity) */ @Test public void testUpdateById(){ User user = new User(); user.setId(6L); user.setAge(30); int result = userMapper.updateById(user); System.out.println("result: "+result); } /** * 更新操做 * 二、根據 whereEntity 條件,更新記錄 * * entity 實體對象 (set 條件值,能夠爲 null) * updateWrapper 實體對象封裝操做類(能夠爲 null,裏面的 entity 用於生成 where 語句) * int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper); */ @Test public void testUpdate(){ User user = new User(); user.setEmail("zhangsan@qq.com");//更新的字段
 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("name","張三");//更新的條件 //執行更新操做
        int result = userMapper.update(user, queryWrapper); System.out.println("result: "+result); } }

測試結果:springboot

一、根據Id更新mybatis

二、根據條件更新app

 7.3 刪除操做

MybatisPlus提供的刪除操做有:根據Id刪除、根據Map集合刪除、根據條件刪除、根據Id集合批量刪除maven

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.darren.mp.mapper.UserMapper; import com.darren.mp.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.Arrays; import java.util.HashMap; import java.util.List; @SpringBootTest @RunWith(SpringRunner.class) public class UserMapperTest { @Autowired private UserMapper userMapper; /** * 刪除操做 * 一、根據 ID 刪除 * * id爲主鍵ID * int deleteById(Serializable id); */ @Test public void testDeleteById(){ int result = userMapper.deleteById(6L); System.out.println("result : "+result); } /** * 刪除操做 * 二、根據 columnMap 條件,刪除記錄 * * columnMap 表字段 map 對象 * int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); */ @Test public void testDeleteByMap(){ HashMap<String, Object> columnMap = new HashMap<>(); columnMap.put("age",21); columnMap.put("name", "張三"); //將columnMap中的元素設置爲刪除的條件,多個條件之間爲 AND 關係
        int result = userMapper.deleteByMap(columnMap); System.out.println("result : "+result); } /** * 刪除操做 * 三、根據 entity 條件,刪除記錄 * * wrapper 實體對象封裝操做類(能夠爲 null) * int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper); */ @Test public void testDelete(){ //用法一: //QueryWrapper<User> wrapper = new QueryWrapper<>(); //wrapper.eq("user_name", "lisi") //.eq("password", "123456"); //用法二:
        User user = new User(); user.setUserName("lisi"); user.setPassword("123456"); QueryWrapper<User> wrapper = new QueryWrapper<>(user); // 將實體對象包裝爲操做條件,根據包裝條件執行刪除,多個條件之間爲 AND 關係
        int result = userMapper.delete(wrapper); System.out.println("result: " + result); } /** * 刪除操做 * 四、刪除(根據ID 批量刪除) * * idList 主鍵ID列表(不能爲 null 以及 empty) * int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper); */ @Test public void testDeleteBatchIds(){ // 根據id集合批量刪除數據
        int result = userMapper.deleteBatchIds(Arrays.asList(3L, 4L)); System.out.println("result:" + result); } }

測試結果:

一、根據Id刪除

 二、根據Map集合刪除

 三、根據條件刪除

 四、根據Id集合批量刪除

 7.4 查詢操做

MybatisPlus提供了多種查詢操做,包括根據id查詢、批量查詢、查詢單條數據、查詢列表、分頁查詢等操做,這裏只列出了經常使用的操做。

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.darren.mp.mapper.UserMapper; import com.darren.mp.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.Arrays; import java.util.List; @SpringBootTest @RunWith(SpringRunner.class) public class UserMapperTest { @Autowired private UserMapper userMapper; /** * 查詢操做 * 一、根據 ID 查詢 * * id 主鍵ID * T selectById(Serializable id); */ @Test public void testSelectById(){ User user = userMapper.selectById(5L); System.out.println(user); } /** * 查詢操做 * 二、根據 ID集合 批量查詢 * * idList 主鍵ID列表(不能爲 null 以及 empty) * List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); */ @Test public void testSelectBatchIds(){ // 根據id集合批量查詢數據
        List<User> users = userMapper.selectBatchIds(Arrays.asList(5L, 6L, 7L, 100L)); for (User user : users) { System.out.println(user); } } /** * 查詢操做 * 三、根據 entity 條件,查詢一條記錄 * * queryWrapper 實體對象封裝操做類(能夠爲 null) * T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); */ @Test public void testSelectOne(){ QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("user_name","lily"); User user = userMapper.selectOne(wrapper); System.out.println(user); //        //查詢條件 // wrapper.eq("password", "123456"); //        // 查詢的數據超過一條時,會拋出異常 // User user = userMapper.selectOne(wrapper); // System.out.println(user);
 } /** * 查詢操做 * 四、根據 Wrapper 條件,查詢總記錄數 * * queryWrapper 實體對象封裝操做類(能夠爲 null) * Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); */ @Test public void testSelectCount(){ QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.gt("age", 20); // 條件:年齡大於20歲的用戶 // 根據條件查詢數據條數
        Integer count = userMapper.selectCount(wrapper); System.out.println("count => " + count); } /** * 查詢操做 * 五、根據 entity 條件,查詢所有記錄 * * queryWrapper 實體對象封裝操做類(能夠爲 null) * List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); */ @Test public void testSelect(){ // List<User> userList = userMapper.selectList(null); // for (User user : userList) { // System.out.println(user); // }
 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); //設置查詢條件
        queryWrapper.like("email", "qq.com"); List<User> users = this.userMapper.selectList(queryWrapper); for (User user : users) { System.out.println(user); } } }

說明:

分頁查詢操做,須要配置MybatisPlus的分頁插件

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @MapperScan("com.darren.mp.mapper") //設置mapper接口的掃描包
public class MybatisPlusConfig { @Bean //配置分頁插件
    public PaginationInterceptor paginationInterceptor(){ return new PaginationInterceptor(); } }

編寫 分頁查詢測試用例

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.darren.mp.mapper.UserMapper; import com.darren.mp.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; @SpringBootTest @RunWith(SpringRunner.class) public class UserMapperTest { @Autowired private UserMapper userMapper; /** * 查詢操做 * 六、根據 entity 條件,查詢所有記錄(並翻頁) * * page 分頁查詢條件(能夠爲 RowBounds.DEFAULT) * queryWrapper 實體對象封裝操做類(能夠爲 null) * IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); */ @Test public void testSelectPage() { Page<User> page = new Page<>(1, 2); //current爲當前頁,size爲每頁顯示條數
 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); //設置查詢條件
        queryWrapper.like("email", "qq.com"); IPage<User> iPage = userMapper.selectPage(page, queryWrapper); System.out.println("數據總條數: " + iPage.getTotal()); System.out.println("每頁顯示條數:"+iPage.getSize()); System.out.println("數據總頁數: " + iPage.getPages()); System.out.println("當前頁數: " + iPage.getCurrent()); List<User> records = iPage.getRecords(); for (User record : records) { System.out.println(record); } } }

 測試結果

相關文章
相關標籤/搜索