公司從 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 >#{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乾貨,給你意想不到的收穫。