1.MyBatis-Plus简介5
官网:https://baomidou.com/
MyBatis-Plus(以下简称MP)是MyBatis的增强工具,在MyBatis的基础上只做增强而不做改变,为简化开发、提高效率而诞生。
1.2主要特点5无侵入:只做增强不做改变,引入不会影响现有工程,如丝般光滑
强大的CRUD操作:内置通用Mapper、通用Service,单表大部分CRUD操作只能通过少量配置实现,条件结构更强,满足各种使用需求
支持Lambda形式调用:通过Lambda表达式,方便编写各种查询条件,无需担心字段错误
支持主键自动生成:支持多达4种主键策略(包括分布式唯一ID生成器)-Sequence),可自由配置,完美解决关键问题
内置代码生成器:Mapper可以通过代码或Maven插件快速生成、Model、Service、Controller层代码,支持模板引擎,有更多的自定义配置等着你使用
内置分页插件:基于MyBatis物理分页,开发者不需要关心具体操作。配置插件后,写分页相当于普通List查询
支持多种数据库的分页插件:支持MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer等各种数据库
1.3依赖5<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version></dependency>
2.MyBatis-Plus入门6前面介绍了MyBatisis-Plus,以角色管理为例,解释MyBatis-Plus的使用
2.1准备创建数据库6创建数据库
CREATE DATABASE `guigu-oa` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;use `guigu-oa`;
创建表
CREATE TABLE `sys_role` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 角色id, `role_name` varchar(20) NOT NULL DEFAULT '' COMMENT 角色名称, `role_code` varchar(20) DEFAULT NULL COMMENT 角色编码, `description` varchar(255) DEFAULT NULL COMMENT '描述', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创造时间, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, `is_deleted` tinyint(3) NOT NULL DEFAULT '0' COMMENT 删除标记(0:不可用 1:可用)', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='角色';
2.2配置文件6Mybatis-Plus日志配置MySQL数据库的相关配置
aplication在service-oaresorces目录中.ymlspring: application: name: service-oa profiles: active: dev
aplication在service-oaresorces目录中-dev.ymlserver: port: 8800mybatistis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 查看日志spring: datasource: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/guigu-oa?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8 username: root password: lzl
2.3启动类6添加SpringBoot启动类`@MapperScan`注:扫描Mapper文件夹:
service-oa模块Serviceauthaplicationpackage com.atguigu.auth;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;//启动类 6@SpringBootApplication@MapperScan("com.atguigu.auth.mapper()//表示可以找到maper动态创建的对象public class ServiceAuthApplication { public static void main(String[] args) { SpringApplication.run(ServiceAuthApplication.class, args); }}
2.4实体类6已介绍,实体类说明:
详细的实体类注解文件:https://baomidou.com/pages/223848/
@TableName:标记表名,标记实体类对应的表
@TableId:主键注解,type=IdType.AUTO(自增数据库ID)
@TableField:字段注释(非主键)
@TableLogic:逻辑删除7
modelcom代码.atguigu.model.systemSysRolepackage com.atguigu.model.system;import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.annotation.TableName;import com.atguigu.model.base.BaseEntity;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;import lombok.Data;@Data //生成get set方法 6@ApiModel(description = "角色")@TableName("sys_role()//指定哪个表对应public class SysRole extends BaseEntity {private static final long serialVersionUID = 1L;//@NotBlank(message = "角色名称不能为空")@ApiModelProperty(value = "角色名")@TableField("role_name") //表示根表中哪个字段对应private String roleName;@ApiModelProperty(value = "角色编码")@TableField("role_code")private String roleCode;@ApiModelProperty(value = "描述")@TableField("description")private String description;}
BaseEntitypackage com.atguigu.model.base;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.annotation.TableId;import com.baomidou.mybatisplus.annotation.TableLogic;import lombok.Data;import java.io.Serializable;import java.util.Date;import java.util.HashMap;import java.util.Map;@Datapublic class BaseEntity implements Serializable { @TableId(type = IdType.AUTO) //IdType.AUTO主要自动增长 6 private Long id; @TableField("create_time") private Date createTime; @TableField("update_time") private Date updateTime; @TableLogic @TableField("is_deleted") private Integer isDeleted; @TableField(exist = false) ///表示表中没有相应的字段 6 private Map<String,Object> param = new HashMap<>();}
2.5在service-oa模块的持久层接口SysroleMaper中添加Mapper类6package com.atguigu.auth.mapper;import com.atguigu.model.system.SysRole;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import org.springframework.stereotype.Repository;///持久层接口 6@Repository ///交给spring管理 6public interface SysRoleMapper extends BaseMapper<SysRole> {}
2.6测试6在service-oa模块中testestmpdemo1package com.atguigu.auth;import com.atguigu.auth.mapper.SysRoleMapper;import com.atguigu.model.system.SysRole;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import java.util.List;//测试mybatistis-plus 6@SpringBootTestpublic class Testmpdemo { //注入 @Autowired private SysRoleMapper mapper; }
手动向数据库添加数据,便于测试
查询所有记录6查询所有记录,TestMpDemo1
///查询所有记录 6 @Test public void getAll() { List<SysRole> list = mapper.selectList(null); System.out.println(list); }
成功没问题
添加操作7Testmpdemo1添加操作7
//添加操作 7 @Test public void add() { SysRole sysRole = new SysRole(); sysRole.setRoleName(角色管理员1); sysRole.setRoleCode(role1); sysRole.setDescription(角色管理员1); int rows = mapper.insert(sysRole); System.out.println(rows); System.out.println(sysRole.getId()); }
修改操作7Testmpdemo1修改操作7
///修改操作 7 @Test public void update() { //根据ID查询 SysRole role = mapper.selectById(11); //设置修改值 role.setRoleName(atguigu角色管理员); ///调用方法实现最终修改 int rows = mapper.updateById(role); System.out.println(rows); }
删除操作7Testmpdemo1删除操作7
单个删除///删除操作 7 @Test public void deleteId() { int rows = mapper.deleteById(11); }
我们执行逻辑删除,标志位的成功删除真的变成了1
批量删除///批量删除 7 @Test public void testDeleteBatchIds() { ///删除id是1 和 2 int result = mapper.deleteBatchIds(Arrays.asList(1, 2)); System.out.println(result); }
3.MyBatis-Plus条件构造器8Wrapper:条件结构抽象,顶级父类
AbstractWrapper:用于查询条件封装,生成sqlwhere条件
QueryWrapper:Entity对象的封装操作不是lambda语法
UpdateWrapper:Update条件包装用于Entity对象更新操作
AbstractLambdaWrapper:Lambda语法采用Wraper统一处理分析Lambda获取column。
LambdaQueryWrapper:查看名称也可以理解为查询Wraperr,用于Lambda语法
LambdaUpdateWrapper:Wrapper更新Lambda封装
注:参考下列条件结构器的方法`column`均表示数据库字段
service-oa模块的test
TestMpDemo1QueryWrapper//条件查询 8 @Test public void testQuery1(){ //创建QueryWraper对象,调用封装条件的方法 QueryWrapper<SysRole> wrapper = new QueryWrapper<>(); wrapper.eq("role_name", “总经理”); ////调用mp实现查询操作 List<SysRole> list = mapper.selectList(wrapper); System.out.println(list); }
LambdaQueryWrapper//条件查询 8 @Test public void testQuery2() { //LambdaQueryWrapper,调用封装条件的方法 LambdaQueryWrapper<SysRole> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SysRole::getRoleName,“总经理”); ////调用mp实现查询操作 List<SysRole> list = mapper.selectList(wrapper); System.out.println(list); }
4.MyBatis-Plus封装service层94.1添加service接口9.1service-oa模块
SysRoleService业务层接口package com.atguigu.auth.service;import com.atguigu.model.system.SysRole;import com.baomidou.mybatisplus.extension.service.IService;///业务层接口 9public interface SysRoleService extends IService<SysRole> {}
SysroleserviceImple实现业务层接口package com.atguigu.auth.service.impl;import com.atguigu.auth.mapper.SysRoleMapper;import com.atguigu.auth.service.SysRoleService;import com.atguigu.model.system.SysRole;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import org.springframework.stereotype.Service;////业务层接口实现类实现 9@Service ///给spring管理 9public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements SysRoleService {}
4.2测试9service-oa模块test目录
Testmpdemo2package com.atguigu.auth;import com.atguigu.auth.service.SysRoleService;import com.atguigu.model.system.SysRole;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTestpublic class Testmpdemo2 { //注入 @Autowired private SysRoleService service; ///查询所有记录 9 @Test public void getAll() { List<SysRole> list = service.list(); System.out.println(list); }}