MyBatis-Plus 02- 深入學習

在這裏插入圖片描述

公司從 MyBatis 升級爲MyBatis-Plus,所以開始學習,在這裏留下學習總結,也希望能帶給讀者一些幫助,同時文章中有什麼不對的地方歡迎指出。
HERE 直達 MyBatis-Plus 官網
HERE 直達 MyBatis-Plus 01- 整合SpringBoot

在開始之前需要補充下,如果是跟着 MyBatis-Plus 01- 整合SpringBoot (超詳細) 這篇博客進來的,有兩個地方需要做修改:

1.將數據庫User表的ID字段改爲varchar(32)類型。
2.將實體類User表中的ID字段改爲String,並且使用註解 @TableId(type = IdType.UUID) 設置ID生成策略爲UUID。

如圖。
在這裏插入圖片描述

一、CRUD接口

這裏只列舉了比較常用的一些mapper層通用CRUD的方法,查看更多 進入官網 CRUD接口

這裏是表結構及測試數據

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主鍵ID',
  `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名',
  `age` int(11) NULL DEFAULT NULL COMMENT '年齡',
  `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '郵箱',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `user` VALUES ('1', 'Jone', 35, '[email protected]');
INSERT INTO `user` VALUES ('2', 'Jack', 20, '[email protected]');
INSERT INTO `user` VALUES ('3', 'Tom', 28, '[email protected]');
INSERT INTO `user` VALUES ('4', 'Sandy', 21, '[email protected]');
INSERT INTO `user` VALUES ('5', 'Billie', 24, '[email protected]');
INSERT INTO `user` VALUES ('6', '國服安琪拉', 18, '[email protected]');
INSERT INTO `user` VALUES ('7', '哪吒', 9, '[email protected]');
INSERT INTO `user` VALUES ('8', '盲僧', 30, '[email protected]');
INSERT INTO `user` VALUES ('9', '小喬', 29, '[email protected]');
INSERT INTO `user` VALUES ('10', '小悟空', 35, '[email protected]');

UserService

package com.demo.kathy.domain.service;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.demo.kathy.domain.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;
import com.demo.kathy.dto.request.GetUserReq;

import java.util.List;
import java.util.Map;

/**
 * <p>
 *  服務類
 * </p>
 *
 * @author kathy
 * @since 2020-05-20
 */
public interface UserService extends IService<User> {

    /**
     * 添加單個用戶
     * @param user 用戶對象
     * @return
     */
    int insertUser(User user);

    /**
     * 刪除(根據ID 批量刪除)
     * @param idList 主鍵ID列表(不能爲 null 以及 empty)
     * @return
     */
    int deleteUserByBatchIds(List<String> idList);

    /**
     * 根據id刪除單條記錄
     * @param id 主鍵ID
     * @return
     */
    int deleteUserById(String id);

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

    /**
     * 根據id更新
     * @param user
     * @return
     */
    int updateUserById(User user);

    /**
     * 根據 ID 查詢
     * @param id
     * @return
     */
    User selectUserById(String id);

    /**
     * 查詢(根據ID 批量查詢)
     * @param idList
     * @return
     */
    List<User> selectUserByBatchIds(List<String> idList);

    /**
     * 查詢(根據 columnMap 條件)
     * @param columnMap
     * @return
     */
    List<User> selectUserByMap(Map<String, Object> columnMap);
}

UserServiceImpl

package com.demo.kathy.domain.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.demo.kathy.domain.entity.User;
import com.demo.kathy.domain.mapper.UserMapper;
import com.demo.kathy.domain.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 服務實現類
 * </p>
 *
 * @author kathy
 * @since 2020-05-20
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Override
    public int insertUser(User user) {
        return baseMapper.insert(user);
    }

    @Override
    public int deleteUserByBatchIds(List<String> idList) {
        return baseMapper.deleteBatchIds(idList);
    }

    @Override
    public int deleteUserById(String id) {
        return baseMapper.deleteById(id);
    }

    @Override
    public int deleteUserByMap(Map<String, Object> columnMap) {
        return baseMapper.deleteByMap(columnMap);
    }

    @Override
    public int updateUserById(User user) {
        return baseMapper.updateById(user);
    }

    @Override
    public User selectUserById(String id) {
        return baseMapper.selectById(id);
    }

    @Override
    public List<User> selectUserByBatchIds(List<String> idList) {
        return baseMapper.selectBatchIds(idList);
    }

    @Override
    public List<User> selectUserByMap(Map<String, Object> columnMap) {
        return baseMapper.selectByMap(columnMap);
    }
}

UserController

package com.demo.kathy.controller;


import com.demo.kathy.domain.entity.User;
import com.demo.kathy.domain.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author kathy
 * @since 2020-05-20
 */
@RestController
@RequestMapping("/user")
public class UserController{

    @Autowired
    private UserService userService;

    @GetMapping("/insertUser")
    public int insertUser() {
        return userService.insertUser(new User("國服安琪拉",18,"[email protected]"));
    }

    @GetMapping("/deleteUserByBatchIds")
    public int deleteUserByBatchIds() {
        //批量刪除ID 爲1和2的用戶
        return userService.deleteUserByBatchIds(Stream.of("1", "2").collect(Collectors.toList()));
    }

    @GetMapping("/deleteUserById")
    public int deleteUserById() {
        //刪除ID爲3的用戶
        return userService.deleteUserById("3");
    }

    @GetMapping("/deleteUserByMap")
    public int deleteUserByMap() {
        //刪除姓名爲 "Sandy"的用戶
        Map<String, Object> columnMap=new HashMap<>();
        columnMap.put("name","Sandy");
        return userService.deleteUserByMap(columnMap);
    }

    @GetMapping("/updateUserById")
    public int updateUserById() {
        //根據id修改用戶信息
        return userService.updateUserById(new User("5","update-Billie",20,"[email protected]"));
    }

    @GetMapping("/selectUserById")
    public User selectUserById() {
        //查詢ID爲5的用戶
        return userService.selectUserById("5");
    }

    @GetMapping("/selectUserByBatchIds")
    public List<User> selectUserByBatchIds() {
        //查詢ID爲1和2的用戶返回List
        return userService.selectUserByBatchIds(Stream.of("1", "2").collect(Collectors.toList()));
    }

    @GetMapping("/selectUserByMap")
    public List<User> selectUserByMap() {
        Map<String, Object> columnMap=new HashMap<>();
        //查詢姓名爲"安琪拉"並且年齡爲18歲的用戶
        columnMap.put("name","安琪拉");
        columnMap.put("age",18);
        return userService.selectUserByMap(columnMap);
    }
}

二、條件構造器

在第一節中調用了一些通用的比較基礎的CRUD方法,但是在實際開發中因爲業務的複雜性,一些簡單的操作是無法滿足產品需求的,不過不要慌,MyBatis-Plus爲我們提供了強大的條件構造器,用於處理sql條件拼接、排序等等。
這裏進入官網 -條件構造器

條件構造器這裏需要注意的是
在這裏插入圖片描述在這裏插入圖片描述

UserService

  /**
   * 使用條件構造器查詢用戶列表
   * @param columnMap
   * @return
   */
 List<User> selectUserByCon(Map<String,Object> columnMap);

UserServiceImpl

	@Override
    public List<User> selectUserByCon(Map<String,Object> columnMap){
        //將查詢入參轉換爲對象
        User queryUser=BeanUtil.mapToBean(columnMap,User.class,true);
        //創建條件構造器
        QueryWrapper<User> userQueryWrapper=new QueryWrapper<>();

        //1.查詢姓名=xxx
        /*userQueryWrapper.lambda().eq(ObjectUtils.isNotEmpty(queryUser.getName()),User::getName,queryUser.getName());*/
        //2.查詢姓名=xxx 或者 郵箱包含xxx
        /*userQueryWrapper.lambda().eq(ObjectUtils.isNotEmpty(queryUser.getName()),User::getName,queryUser.getName())
                .or()
                .like(User::getEmail,queryUser.getEmail());*/
        //3.查詢年齡不等於<>xxx 並且在18-30之間的
        //userQueryWrapper.lambda().ne(ObjectUtils.isNotNull(queryUser.getAge()),User::getAge,queryUser.getAge())
                //大於
                /*.gt(ObjectUtils.isNotNull(queryUser.getAge()),User::getAge,queryUser.getAge())
                //小於
                .lt(ObjectUtils.isNotNull(queryUser.getAge()),User::getAge,queryUser.getAge())
                //大於等於
                .ge(ObjectUtils.isNotNull(queryUser.getAge()),User::getAge,queryUser.getAge())
                //小於等於
                .le(ObjectUtils.isNotNull(queryUser.getAge()),User::getAge,queryUser.getAge())*/
                //.between(ObjectUtils.isNotNull(queryUser.getAge()),User::getAge,18,30);

        //4.查詢姓名包含xxx 並且 年齡大於xx
        /*userQueryWrapper.lambda().like(ObjectUtils.isNotEmpty(queryUser.getName()),User::getName,queryUser.getName()).
                gt(ObjectUtils.isNotNull(queryUser.getAge()),User::getAge,queryUser.getAge());*/

        //5.查詢(姓名包含xxx並且年齡大於等於xx的)或者 (郵箱包含xxx的)
        /*userQueryWrapper.lambda().like(ObjectUtils.isNotEmpty(queryUser.getName()),User::getName,queryUser.getName()).
                ge(ObjectUtils.isNotNull(queryUser.getAge()),User::getAge,queryUser.getAge())
                .or()
                .like(ObjectUtils.isNotEmpty(queryUser.getEmail()),User::getEmail,queryUser.getEmail());*/

        //6.查詢(姓名包含xxx並且年齡小於等於xx的)或者 (郵箱包含xxx並且id=1的)
        userQueryWrapper.lambda().like(ObjectUtils.isNotEmpty(queryUser.getName()),User::getName,queryUser.getName()).
                le(ObjectUtils.isNotNull(queryUser.getAge()),User::getAge,queryUser.getAge())
                .or()
                .like(ObjectUtils.isNotEmpty(queryUser.getEmail()),User::getEmail,queryUser.getEmail())
                .eq(ObjectUtils.isNotEmpty(queryUser.getId()),User::getId,queryUser.getId());

         //根據id升序排序
        userQueryWrapper.lambda().orderByAsc(User::getId);
        //先根據id降序排序,再根據年齡降序排列
        userQueryWrapper.orderByDesc("id","age");
        return baseMapper.selectList(userQueryWrapper);
    }

UserController

	@GetMapping("/selectUserByCon")
    public List<User> selectUserByCon(){
        Map<String, Object> columnMap=new HashMap<>();
        columnMap.put("name","小");
        columnMap.put("age",35);

        columnMap.put("email","test");
        columnMap.put("id","1");
        userService.selectUserByCon(columnMap).forEach(System.out::println);
        return userService.selectUserByCon(columnMap);
    }

其他條件參數說明

在這裏插入圖片描述
在這裏插入圖片描述

圖片來自: 程序員不棄
https://blog.csdn.net/kye055947/article/details/83692476

三、分頁插件

這裏需要導入分頁插件,並且需要注入分頁攔截器,如果是從MyBatis-Plus系列-01 進入的,那我們之前已經配置過了,無需再配置。

<!--mybatis puls分頁插件-->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.10</version>
</dependency>
@EnableTransactionManagement
@Configuration
@MapperScan("com.demo.kathy.domain.mapper")
public class MybatisConfiguration {

    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }
}

UserMapper.java

public interface UserMapper extends BaseMapper<User> {

    IPage<User> selectUserByPage(@Param("page") Page<User> page, @Param("queryUser") User queryUser);
}

這裏需要注意的是:分頁返回的對象與傳入的對象是同一個

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.kathy.domain.mapper.UserMapper">

    <select id="selectUserByPage" resultType="com.demo.kathy.domain.entity.User">
        SELECT
        id,
        `name`,
        age,
        email
        FROM
        `user`
        <where>
            <if test="queryUser.name!=null and queryUser.name!=''">
                AND `name` LIKE CONCAT('%',#{queryUser.name},'%')
            </if>
            <if test="queryUser.age!=null">
                AND age &gt;#{queryUser.age}
            </if>
        </where>
    </select>
</mapper>

UserService.java

    /**
     * 分頁條件查詢
     * @param page
     * @param user
     * @return
     */
    IPage<User> selectUserByPage(Page<User> page, User user);

UserServiceImpl.java

    /**
     * 分頁條件查詢
     * @param page
     * @param user
     * @return
     */
    @Override
    public IPage<User> selectUserByPage(Page<User> page, User user) {
       //方式1:自己手寫條件並注入然後讓MyBatisPlus幫助我們分頁
       //return userMapper.selectUserByPage(page,user);

        //方式2:使用條件構造器進行條件注入並分頁,與方式一同等效果
        QueryWrapper<User> queryWrapper = new QueryWrapper();
        queryWrapper.lambda().like(ObjectUtils.isNotEmpty(user.getName()),User::getName,user.getName())
                .gt(ObjectUtils.isNotEmpty(user.getAge()),User::getAge,user.getAge());
        return baseMapper.selectPage(page,queryWrapper);
    }

UserController

	@GetMapping("/selectUserByPage")
    public IPage<User> selectUserByPage(){
        User queryUser=new User();
        queryUser.setName("安琪拉");
        queryUser.setAge(18);
        return userService.selectUserByPage(new Page<User>(1,5),queryUser);
    }

關注微信公衆號【程序媛琬淇】,專注分享Java乾貨,給你意想不到的收穫。
在這裏插入圖片描述

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