简单精干之 MyBatis-Plus

官网地址:https://baomidou.com/

以下缺少相关依赖的,比如 commons.lang 等包,则自行导入。

1、依赖

	<!--    mybatis-plus        -->
	<dependency>
		<groupId>com.baomidou</groupId>
		<artifactId>mybatis-plus-boot-starter</artifactId>
		<version>${mybatis-plus.version}</version>
	</dependency>
	<!--    实体类工具       -->
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
	</dependency>

注:自行选择版本。相应的数据库等依赖自行添加,数据库以 mysql 8.0x 为例。

2、配置文件

2.1 application.properties

server.servlet.context-path=/model/
server.tomcat.uri-encoding=UTF-8
spring.application.name=model
# 使用开发环境配置‘dev’,如生产环境,则改为 ‘prod’
spring.profiles.active=prod
# 数据库连接池
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://${datasource.host}:${datasource.port}/model?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai
spring.datasource.initialization-mode=always
# 针对bean被重复定义,重复则覆盖
spring.main.allow-bean-definition-overriding=true
# 将所有数字转为 String 类型返回,避免前端处理数据不正确
spring.jackson.generator.write-numbers-as-strings=true
# 和数据库字段进行印射,最终成为驼峰命名
mybatis-plus.configuration.map-underscore-to-camel-case=true
# Jackson 设置时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8

2.2 application-prod.properties

# 服务器端口
server.port=20000
# 服务地址
server.host=localhost
# 数据库地址、账号密码
datasource.host=localhost
datasource.port=3306
spring.datasource.username=root
spring.datasource.password=123456

3、实体类

3.1 po(对应数据库表)

package com.pky.model.commons.domain.po;

import java.io.Serializable;
import lombok.Data;

/**
 * 用户基本信息表(user_info)实体
 * @author pky
 */
@Data
public class UserInfo implements Serializable {
    /**
     * 用户ID
     * (mybatis_plus 提供的主键生成策略(ASSIGN_ID/雪花算法主键;AUTO/自增主键;ASSIGN_UUID/排除中划线的UUID主键))
     */
    @TableId(type = IdType.ASSIGN_ID)
    private String userId;
    /**
     * 用户名
     */
    private String userName;
    /**
     * 密码
     */
    private String password;
    /**
     * 邮箱
     */
    private String email;
    /**
     * 手机号
     */
    private String phone;
    /**
     * 创建时间
     */
    private String created;
    /**
     * 修改时间
     */
    private String updated;

    private static final long serialVersionUID = 1894561L;
}

3.2 vo (接收前端参数实体)

package com.pky.model.commons.domain.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import java.util.Date;

/**
 * 保存用户信息【接收】实体
 * @author pky
 */
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class UserSaveVo {

    /**
     * 用户ID
     */
    private String userId;
    /**
     * 用户名
     */
    @NotBlank(message = "用户名不可为空")
    private String userName;
    /**
     * 联系电话
     */
    @Email
    private String email;
    /**
     * 手机号
     */
    private String phone;

}

4、Mapper

package com.pky.model.commons.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.pky.model.commons.domain.table.UserInfo;

/**
 * 用户基本信息表(user_info)Mapper
 * @author pky
 */
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}

5、Service

5.1 接口

  包括模糊搜索、分页、排序等接口。待完善

package com.pky.model.commons.services.po;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.pky.model.commons.domain.po.UserInfo;
import com.pky.model.commons.domain.vo.UserSaveVo;

import java.util.List;


/**
 * 用户基本信息表(user_info)业务接口
 * @author pky
 */
public interface UserInfoService extends IService<UserInfo> {

    /**
     * 通过用户名获取用户列表
     * @param userName 用户名
     * @return 用户列表
     */
    List<UserInfo> getByUserName(String userName);
    
    /**
     * 通过email获取用户信息
     * @param email 邮箱(唯一)
     * @return 用户信息
     */
    UserInfo getByEmail(String email);
    
    /**
     * 保存用户信息
     * @param userSaveVo 保存用户信息【接收】实体
     * @return 保存后的用户信息
     * @throws Exception 除了自定义的 ServiceException 外,其他都为代码错误
     */
    UserInfo save(UserSaveVo userSaveVo) throws Exception;

    /**
     * 条件分页搜索排序用户信息
     * @param keyword 关键字(用户名、手机号),为空表示全部
     * @param sortType 排序类型:1/创建时间升序排序; 2/创建时间降序排序,为空则不指定排序
     * @param pageNum 当前页
     * @param pageSize 每页条数
     * @return 分页后的用户信息
     */
    IPage<UserInfo> getPageByConditional(String keyword, Integer sortType, int pageNum, int pageSize);

}

5.2 实现类

  包括模糊搜索、分页、排序等实现。待完善

package com.pky.model.commons.services.po.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pky.model.commons.domain.po.UserInfo;
import com.pky.model.commons.domain.vo.UserSaveVo;
import com.pky.model.commons.mapper.UserInfoMapper;
import com.pky.model.commons.services.po.UserInfoService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * 用户基本信息表(user_info)业务逻辑,为了解耦,只操作本表,不涉及其他表逻辑,若需要联合其他表,则需要在上一层 Service 中添加【响应】的业务逻辑来整合。
 * @author pky
 */
@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements UserInfoService {
    /**
     * 通过用户名获取用户列表
     * @param userName 用户名
     * @return 用户列表
     */
    @Override
    public List<UserInfo> getByUserName(String userName) {
        return lambdaQuery().eq(UserInfo::getUserName, userName).list();
    }
    
    /**
     * 通过email获取用户信息
     * @param email 邮箱(唯一)
     * @return 用户信息
     */
    @Override
    public UserInfo getByEmail(String email) {
        return lambdaQuery().eq(UserInfo::getEmail, email).one();
    }
    
    /**
     * 保存用户信息
     * @param userSaveVo 保存用户信息【接收】实体
     * @return 保存后的用户信息
     * @throws Exception 除了自定义的 ServiceException 外,其他都为代码错误
     */
    @Override
    public UserInfo save(UserSaveVo userSaveVo) throws Exception {
        // 拷贝用户基本信息
        UserInfo userInfo = new UserInfo();
        BeanUtils.copyProperties(userSaveVo, userInfo);
        // 新增
        if(userSaveVo.getUserId() == null) {
            // 数据库表中的新增时间已默认当前时间,因此无需再设置
            save(userInfo);
        }
        // 修改
        else {
            // 获取用户信息
            UserInfo user = getById(userSaveVo.getUserId());
            if(user == null) {
                // TODO 抛异常,全局捕获(用户信息不存在)
            }
            userInfo.setUpdated(new Date());
            updateById(userInfo);
        }
        return userInfo;
    }

    /**
     * 条件分页搜索排序用户信息
     * @param keyword 关键字(用户名、手机号),为空表示全部
     * @param sortType 排序类型:1/创建时间升序排序; 2/创建时间降序排序,为空则默认按用户ID升序排序
     * @param pageNum 当前页
     * @param pageSize 每页条数
     * @return 分页后的用户信息
     */
    @Override
    public IPage<UserInfo> getPageByConditional(String keyword, Integer sortType, int pageNum, int pageSize) {
        IPage<UserInfo> pageInfo = new Page<>(pageNum, pageSize);
        return lambdaQuery()
                .func(condition -> {
                    if(StringUtils.isNotBlank(keyword)) {
                        condition.like(UserInfo::getUserName, keyword).or().like(UserInfo::getPhone, keyword);
                    }
                })
                .func(condition -> {
                    if(sortType == null) {
                        condition.orderByAsc(UserInfo::getUserId);
                    }
                    else if(sortType == 1) {
                        condition.orderByAsc(UserInfo::getCreated);
                    }
                    else {
                        condition.orderByDesc(UserInfo::getCreated);
                    }
                })
                .page(pageInfo);
    }
}

6、配置类

package com.pky.model.commons.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * mybatis-plus 配置类
 * @author pky
 */
@Configuration
@MapperScan("com.pky.model..*.mapper*")
public class MybatisPlusConfig {

    /**
     * mybatis-plus 配置
     * @return MybatisPlus拦截器
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 分页配置
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

7、Controller

package com.pky.model.commons.controller.user;

import com.pky.model.commons.domain.table.UserInfo;
import com.pky.model.commons.service.table.UserInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * 用户信息控制器
 * @author pky
 */
@RestController
@RequestMapping(value = "api/commons/user/info")
public class UserInfoController {

    private final UserInfoService userInfoService;
    @Autowired
    UserInfoController(UserInfoService userInfoService) {
        this.userInfoService = userInfoService;
    }

    /**
     * 通过用户名获取用户信息
     * @param userName 用户名
     * @return 用户列表
     */
    @GetMapping(value = "")
    public List<UserInfo> getByUserName(String userName) {
        return userInfoService.getByUserName(userName);
    }
}

8、测试

  浏览器输入对应 API 地址,如下通过用户名获取用户信息的 Json 结果:

[
    {
        "userId": "8964598465900",
        "userName": "pky",
        "email": "pkyShare@qq.com",
        "phone": "13500000000",
        "created": "2022-01-03 09:00:00",
        "updated": null
    },
    {
        "userId": "8964598465984",
        "userName": "pky",
        "email": "pkyShare2@qq.com",
        "phone": "13600000000",
        "created": "2022-01-04 13:52:07",
        "updated": null
    }
]

注:以上返回格式未处理,可自行定义返回结构。为 null 不返回的后续处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值