赞
踩
MyBatis-Plus(简称 MP)是一个基于 MyBatis 的增强工具,它对 Mybatis 的基础功能进行了增强,但未做任何改变。使得我们可以可以在 Mybatis 开发的项目上直接进行升级为 Mybatis-plus,正如它对自己的定位,它能够帮助我们进一步简化开发过程,提高开发效率。
Mybatis-Plus 其实可以看作是对 Mybatis 的再一次封装,升级之后,对于单表的 CRUD 操作,调用 Mybatis-Plus 所提供的 API 就能够轻松实现,此外还提供了各种查询方式、分页等行为。最最重要的,开发人员还不用去编写 XML,这就大大降低了开发难度
一、引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.3.3.RELEASE</version> </dependency> <!--mybatis-plus依赖--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-annotation</artifactId> <version>3.3.2</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.2</version> </dependency> <!--mybatis分页--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.12</version> </dependency> <!--mysql依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.9</version> </dependency> <!--线程池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <!--工具类--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.5</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.21</version> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> </dependency>
二、application.yml文件配置
#服务端口号 server: port: 9022 #mybatis配置 mybatis-plus: mapper-locations: classpath:/mapper/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl call-setters-on-nulls: true #数据库配置 spring: datasource: driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/supply_goods?useUnicode=true&characterEncoding=utf8 username: root password: 123456
三、数据库表sql
CREATE TABLE `user` (
`id` bigint(18) NOT NULL AUTO_INCREMENT COMMENT 'id',
`username` varchar(255) DEFAULT NULL COMMENT '用户名',
`password` varchar(255) DEFAULT NULL COMMENT '密码',
`sex` tinyint(1) DEFAULT NULL COMMENT '性别:0男、1女',
`dept` varchar(255) DEFAULT NULL COMMENT '部门',
`created` datetime DEFAULT NULL COMMENT '创建时间',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建人',
`modify_by` bigint(20) DEFAULT NULL COMMENT '更新人',
`last_update_time` datetime DEFAULT NULL COMMENT '更新时间',
`del_flag` tinyint(1) DEFAULT '0' COMMENT '是否删除:0未删除 1已删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
四、实体类
sql在线生成s实体类:https://java.bejson.com/generator/
package com.supplier.domain; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.io.Serializable; import java.util.Date; /** * @description user * @author zz * @date 2022-11-23 */ @TableName("user") @Data public class User implements Serializable { /** * id */ @TableId(type = IdType.AUTO) private Integer id; /** * 用户名 */ private String username; /** * 密码 */ private String password; /** * 性别:0男、1女 */ private Integer sex; /** * 部门 */ private String dept; /** * 创建人 */ @TableField(value = "create_by", fill = FieldFill.INSERT) private String createBy; /** * 修改人 */ @TableField(value = "modify_by", fill = FieldFill.UPDATE) private String modifyBy; /** * 创建时间 */ @TableField(value = "created", fill = FieldFill.INSERT) private Date created; /** * 最后更新时间 */ @TableField(value = "last_update_time", fill = FieldFill.INSERT_UPDATE) private Date lastUpdateTime; /** * 是否删除1.删除 0.未删除 */ private Boolean delFlag; /**表示该属性不为数据库表字段,但又是必须使用的。*/ @TableField(exist = false) private String exit; }
返回实体类
package com.supplier.model; import com.supplier.constant.SysConstant; import lombok.Data; import java.io.Serializable; /** * @author zz * @createTime 2021-10-24 18:28 * @description 公共返回对象值 */ @Data public class R<T> implements Serializable { private static final long serialVersionUID = 1L; /** * 状态码 */ private int code; /** * 消息 */ private String msg; /** * 数据 */ private T data; public static <T> R<T> ok() { return restResult(null, SysConstant.SUCCESS_CODE, SysConstant.SUCCESS_MSG); } public static <T> R<T> ok(T data) { return restResult(data, SysConstant.SUCCESS_CODE, SysConstant.SUCCESS_MSG); } public static <T> R<T> ok(T data, String msg) { return restResult(data, SysConstant.SUCCESS_CODE, msg); } public static <T> R<T> fail() { return restResult(null, SysConstant.FAIL_CODE, SysConstant.FAIL_MSG); } public static <T> R<T> fail(String msg) { return restResult(null, SysConstant.FAIL_CODE, msg); } public static <T> R<T> fail(T data) { return restResult(data, SysConstant.FAIL_CODE, SysConstant.FAIL_MSG); } public static <T> R<T> fail(T data, String msg) { return restResult(data, SysConstant.FAIL_CODE, msg); } public static <T> R<T> fail(int code, String msg) { return restResult(null, code, msg); } private static <T> R<T> restResult(T data, int code, String msg) { R<T> apiResult = new R<>(); apiResult.setCode(code); apiResult.setData(data); apiResult.setMsg(msg); return apiResult; } }
package com.supplier.constant; /** * @author zz * @date 2022/10/31 11:26 */ public interface SysConstant { /** * 请求成功 */ String SUCCESS_MSG = "请求成功!"; int SUCCESS_CODE = 200; /** * 请求失败 */ String FAIL_MSG = "请求失败!"; int FAIL_CODE = 500; }
分页实体类
package com.supplier.model; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; import java.util.List; /** * @author zz * @date 2022-11-02 10:01 */ @Data @NoArgsConstructor public class PageModel<T> implements Serializable { /** * 页码 */ public int pageNum; /** * 每页显示条数 */ public int pageSize; /** * 总记录 */ public long total; /** * 数据 */ public List list; /** * 全参构造 */ public PageModel(int pageNum, int pageSize, long total, List list) { this.pageNum = pageNum; this.pageSize = pageSize; this.total = total; this.list = list; } }
五、配置类
mybatis-plus分页配置(也可以直接引入mybatis分页插件)
package com.supplier.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator; import com.baomidou.mybatisplus.extension.incrementer.H2KeyGenerator; import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor; 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; /** * @author zz * @description mybatis-plus */ @Configuration @MapperScan("com.supplier.mapper") public class MybatisPlusConfig { /** * 分页插件 */ @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); paginationInterceptor.setDbType(DbType.MYSQL); return paginationInterceptor; } /** * 乐观锁 */ @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } @Bean public IKeyGenerator iKeyGenerator() { return new H2KeyGenerator(); } }
插入、更新时设置字段默认值,更新时必须使用一下方式才生效
package com.supplier.config; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.util.Date; /** * @author zz * @createTime 2022-11-02 10:01 * @description 插入或更新 */ @Slf4j @Component public class AutoFillHandler implements MetaObjectHandler { /** * 插入 */ @Override public void insertFill(MetaObject metaObject) { String userId = "1234"; this.strictInsertFill(metaObject, "createBy", String.class, userId); this.strictInsertFill(metaObject, "created", Date.class, new Date()); this.strictInsertFill(metaObject, "lastUpdateTime", Date.class, new Date()); } /** * 更新 */ @Override public void updateFill(MetaObject metaObject) { String userId = "22"; this.strictUpdateFill(metaObject, "modifyBy", String.class, userId); this.strictUpdateFill(metaObject, "lastUpdateTime", Date.class, new Date()); } }
六、业务逻辑处理(Service接口类)
package com.supplier.service; import com.baomidou.mybatisplus.extension.service.IService; import com.supplier.domain.User; import com.supplier.model.PageModel; /** * @author zz * @date 2022/11/23 14:34 */ public interface UserService extends IService<User> { /**新增用户 * @param user 对象 */ void add(User user); /**更新用户 * @param user 对象 */ void modify(User user); /**用户详情 * @param id id * @return 结果 */ User detail(Integer id); /**用户列表 * @param pageNum 页码 * @param pageSize 条数 * @return 结果 */ PageModel lists(Integer pageNum,Integer pageSize); /**删除用户 * @param id id */ void delete(Integer id); }
实现类
package com.supplier.service.impl; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.supplier.domain.User; import com.supplier.mapper.UserMapper; import com.supplier.model.PageModel; import com.supplier.service.UserService; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import java.util.List; /** * @author zz * @date 2022/11/23 14:34 */ @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Override public void add(User user) { this.baseMapper.insert(user); } @Override public void modify(User user) { //当重新new对象时,会调用自动填充更新时间和更新人的数据 User userNews = new User(); BeanUtil.copyProperties(user,userNews); UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>(); userUpdateWrapper.eq("id",user.getId()); this.baseMapper.update(user,userUpdateWrapper); } @Override public User detail(Integer id) { //需要筛选条件时 return this.baseMapper.selectOne(new QueryWrapper<User>().eq("id",id).last("limit 1")); } public PageModel listsTwo(Integer pageNum,Integer pageSize) { //第一种分页,使用mybatis插件 PageHelper.startPage(pageNum,pageSize); Page<User> list = this.baseMapper.lists(); return new PageModel(pageNum,pageSize,list.getTotal(),list.getResult()); } @Override public PageModel lists(Integer pageNum,Integer pageSize){ //第二种分页,mybatis-plus分页 com.baomidou.mybatisplus.extension.plugins.pagination.Page<User> userPage = new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(pageNum,pageSize); com.baomidou.mybatisplus.extension.plugins.pagination.Page<User> list = this.baseMapper.selectPage(userPage, null); return new PageModel(pageNum,pageSize,list.getTotal(),list.getRecords()); } public List<User> selectInfo(String username, Integer sex) { QueryWrapper<User> queryWrapper = new QueryWrapper(); //使用eq表示查询值为必填,select表示查询字段 queryWrapper.like(StringUtils.isNoneBlank(username),"username",username).eq("sex",sex).select("id","username"); //无查询条件 return this.baseMapper.selectList(queryWrapper); } @Override public void delete(Integer id) { this.baseMapper.deleteById(id); } }
七、数据访问层(dao接口类)
package com.supplier.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.github.pagehelper.Page; import com.supplier.domain.User; import org.apache.ibatis.annotations.Mapper; /** * @author zz * @date 2022/11/23 14:35 */ @Mapper public interface UserMapper extends BaseMapper<User> { Page<User> lists(); }
mapper文件
<?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.supplier.mapper.UserMapper">
<select id="lists" resultType="com.supplier.domain.User">
select * from `user`
</select>
</mapper>
八、控制层(controller)
package com.supplier.controller; import com.supplier.domain.User; import com.supplier.model.R; import com.supplier.service.UserService; import org.springframework.web.bind.annotation.*; /** * @author zz * @date 2022/11/23 14:34 */ @RestController @RequestMapping("/user") public class UserController { private final UserService userService; public UserController(UserService userService) { this.userService = userService; } /** * 新增用户 */ @PostMapping public R add(@RequestBody User user){ userService.add(user); return R.ok(); } /** * 更新用户 */ @PutMapping public R modify(@RequestBody User user){ userService.modify(user); return R.ok(); } /** * 用户详情 */ @GetMapping("/{id}") public R detail(@PathVariable Integer id){ return R.ok(userService.detail(id)); } /** * 用户列表 */ @GetMapping public R list(@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "10")Integer pageSize){ return R.ok(userService.lists(pageNum,pageSize)); } /** * 更新用户 */ @DeleteMapping public R delete(Integer id){ userService.delete(id); return R.ok(); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。