一、Mybatis-Plus简介
(一) 什么是Mybatis-Plus
MybatisPlus是一个 MyBatis (opens new window)的增强工具,在 MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。愿景是成为 MyBatis最好的搭档,就像魂斗罗中的 1P、2P,基友搭配,效率翻倍。
(二) Mybatis-Plus的优势
无侵入:
只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。
损耗小:
启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作。
强大的 CRUD 操作:
内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求。
支持 Lambda 形式调用:
通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错。
支持主键自动生成:
支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
支持 ActiveRecord 模式:
支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作。
支持自定义全局通用操作:
支持全局通用方法注入( Write once, use anywhere )。
内置代码生成器:
采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用。
内置分页插件:
基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询。
分页插件支持多种数据库:
支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库。
内置性能分析插件:
可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询。
内置全局拦截插件:
提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作。
(三)MybaisPlus的框架结构
二、SpringBoot整合Mybatis-Plus入门案例
(一) 创建SpringBoot工程添加依赖
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.7</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
(二) 创建数据库表employee
(三)构建数据模型Employee
此处省略了get、set方法以及toSytring方法
package com.jn.entity;
public class Employee {
@TableField(value = "empId")
private Long empId;
@TableField(value = "name")
private String name;
@TableField(value = "empGender")
private String empGender;
@TableField(value = "email")
private String email;
@TableField(value = "age")
private Integer age;
}
(四)配置application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///mybatisdatabase200
username: root
password: 123456
logging:
level:
com:
jn:
mybatisplus:
dao: debug
(五) 编写Spring Boot 启动类
package com.jn;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.jn.dao")
public class MybatisPlus01Application {
public static void main(String[] args) {
SpringApplication.run(MybatisPlus01Application.class, args);
}
}
(六) 编写mapper接口
package com.jn.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jn.entity.Employee;
public interface EmployeeMapper extends BaseMapper<Employee> {
}
(七)启动服务测试结果
@RunWith(SpringRunner.class)
@SpringBootTest
class MybatisPlus01ApplicationTests {
@Autowired
private EmployeeMapper employeeMapper;
@Test
public void selectAll() {
employeeMapper.selectList(null).forEach(System.out::println);
}
}
三、Lombok插件
(一)lombok插件简介
lombok是一个插件,用途是使用注解给你类里面的字段,自动的加上属性,构造器,ToString方法,Equals方法等等,比较方便的一点是,你在更改字段的时候,lombok会立即发生改变以保持和你代码的一致性。
(二)常用的 lombok 注解介绍
@Getter 加在类上,可以自动生成参数的getter方法。
@Setter 加在类上,可以自动生成参数的setter方法
@ToString 加在类上,调用toString()方法,可以输出实体类中所有属性的值
@RequiredArgsConstructor会生成一个包含常量,和标识了NotNull的变量的构造方法。生成的构造方法是私有的private。这个我用的很少。
@EqualsAndHashCode
1.它会生成equals和hashCode方法
2.默认使用非静态的属性
3.可以通过exclude参数排除不需要生成的属性
4.可以通过of参数来指定需要生成的属性
5.它默认不调用父类的方法,只使用本类定义的属性进行操作,可以使用callSuper=true来解决,会在@Data中进行讲解。
@Data这个是非常常用的注解,这个注解其实是五个注解的合体:
@NoArgsConstructor生成一个无参数的构造方法。
@AllArgsConstructor生成一个包含所有变量的构造方法。
@Value这个注解要和Spring的@Value注解区分,Spring的是从配置文件读取内容,这个注解是在类中的所有字段默认全部声明为private final类型,只会生成Getter方法,不会生成Setter方法,很少用。
@Cleanup主要用于关闭资源使用。
(三)idea安装lombok插件
首先我们需要安装IntelliJ IDEA中的lombok插件,打开IntelliJ IDEA后点击菜单栏中的File-->Settings,或者使用快捷键Ctrl+Alt+S进入到设置页面
我们点击设置中的Plugins进行插件的安装,在右侧选择Browse repositories...,然后在搜索页面输入lombok变可以查询到下方的Lombok Plugin,鼠标点击Lombok Plugin可在右侧看到Install按钮,点击该按钮便可安装。安装完成之后重启idear即可。
(四)lombok插件的使用
1.去除Employee类中的setter和getter方法
package com.jn.entity;
import com.baomidou.mybatisplus.annotation.TableField;
public class Employee {
@TableField(value = "empId")
private Long empId;
@TableField(value = "name")
private String name;
@TableField(value = "empGender")
private String empGender;
@TableField(value = "email")
private String email;
@TableField(value = "age")
private Integer age;
}
2.在Employee类上添加lombok注解
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
@Data // 自动生成getter、setter、toString、equals、hashCode等方法
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
@TableField(value = "empId")
private Long empId;
@TableField(value = "name")
private String name;
@TableField(value = "empGender")
private String empGender;
@TableField(value = "email")
private String email;
@TableField(value = "age")
private Integer age;
}
四、Mybatis-Plus通用CRUD
(一)BaseMapper接口方法介绍
baseMaper中提供了CRUD方法,具体方法如下:
插入一条记录
int insert(T entity);
根据 entity 条件,删除记录
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
根据 ID 删除
int deleteById(Serializable id);
根据 columnMap 条件,删除记录
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
根据 whereEntity 条件,更新记录
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
根据 ID 修改
int updateById(@Param(Constants.ENTITY) T entity);
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
查询(根据 columnMap 条件)
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
根据 Wrapper 条件,查询全部记录
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
根据 entity 条件,查询全部记录(并翻页)
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
根据 Wrapper 条件,查询全部记录(并翻页)
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
根据 Wrapper 条件,查询总记录数
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
(二)环境搭建
1.创建数据库表employee
2.构建实体类并使用lombok注解
@Data // 自动生成getter、setter、toString、equals、hashCode等方法
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
@TableField(value = "empId")
private Long empId;
@TableField(value = "name")
private String name;
@TableField(value = "empGender")
private String empGender;
@TableField(value = "email")
private String email;
@TableField(value = "age")
private Integer age;
}
(三)insert方法
// 测试插入
@Test
public void insert() {
Employee employee = new Employee();
employee.setName("任我行");
employee.setEmail("[email protected]");
employee.setEmpGender("男");
employee.setAge(18);
employeeMapper.insert(employee);
}
(四)@TableId注解
属性 | 类型 | 必须指定 | 默认值 | 描述 |
value | String | 否 | "" | 主键字段名 |
type | Enum | 否 | IdType.NONE | 主键类型 |
注意:上述代码封装实体类已经和数据库里面的字段名称保持一致,主键也已经设置,所以就不用在实体封装类里面加入此注解了。
IdType
值 | 描述 |
AUTO | 数据库ID自增 |
NONE | 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) |
INPUT | insert前自行set主键值 |
ASSIGN_ID | 分配ID(主键类型为Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法) |
ASSIGN_UUID | 分配UUID,主键类型为String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认default方法) |
(五)@TableName
当表的跟实体类不一致的时候,要使用@TableName注解进行映射
(六)@TableField注解
描述:字段注解(非主键)
属性 | 类型 | 默认值 | 描述 | |
value | String | 否 | "" | 数据库字段名 |
el | String | 否 | "" | 映射为原生 #{ ... } 逻辑,相当于写在 xml 里的 #{ ... } 部分 |
exist | boolean | 否 | true | 是否为数据库表字段 |
condition | String | 否 | "" | 字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 |
update | String | 否 | "" | 字段 update set 部分注入, 例如:update="%s+1":表示更新时会set version=version+1(该属性优先级高于 el 属性) |
insertStrategy | Enum | N | DEFAULT | 举例:NOTNULL: `insert into tablea(column) values (#{columnProperty})` |
updateStrategy | Enum | N | DEFAULT | 举例:IGNORED: update table_a set column=#{columnProperty} |
whereStrategy | Enum | N | DEFAULT | 举例:NOT_EMPTY: where <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if> |
fill | Enum | 否 | FieldFill.DEFAULT | 字段自动填充策略 |
select | boolean | 否 | true | 是否进行 select 查询 |
keepGlobalFormat | boolean | 否 | false | 是否保持使用全局的 format 进行处理 |
jdbcType | JdbcType | 否 | JdbcType.UNDEFINED | JDBC类型 (该默认值不代表会按照该值生效) |
typeHandler | Class<? extends TypeHandler> | 否 | UnknownTypeHandler.class | 类型处理器 (该默认值不代表会按照该值生效) |
numericScale | String | 否 | "" | 指定小数点后保留的位数 |
(七)插入数据获取主键值
mysql-plus会自获取自增主键,把数据库的empId设置为自增。测试获取自增主键。
测试:
//插入数据获取主键值
@Test
public void insertGetId() {
Employee employee = new Employee();
employee.setName("风清扬");
employee.setEmail("[email protected]");
employee.setEmpGender("男");
employee.setAge(88);
employeeMapper.insert(employee);
System.out.println(employee.getEmpId());
}
(八)更新数据的通用方法
1.updateById方法
根据id进行记录更新,如果对象属性未传值,则不会更新该字段,保持数据库表原来字段值。
//更新数据的测试
@Test
public void updateById() {
Employee employee = new Employee();
employee.setEmpId(11L);
employee.setName("小林子");
employee.setEmail("[email protected]");
employee.setEmpGender("不男不女");
employeeMapper.updateById(employee);
}
2.updateAllColumnById方法
根据id进行记录更新,无论对象属性传不传值,每列都进行更新,为赋值的字段被更新为null
测试结果:直接报错,MybatisPlus由2.3升级到3.4 UpdateAllColumnById() 以及 deleteAll() 没法使用。
(九)查询数据的通用方法
1.selectById方法
根据id查询指定记录
//根据id查询
@Test
public void selectById() {
Employee employee = employeeMapper.selectById(11L);
System.out.println(employee);
}
2.selectBatchIds方法
批量查询指多个id的记录集合
//批量查询多个id
@Test
public void selectBatchIds() {
employeeMapper.selectBatchIds(Arrays.asList(1, 2, 3)).forEach(System.out::println);
}
3.selectByMap方法
根据Map集合中传入的条件进行查询,每个条件都是and关系。
//根据Map查询
@Test
public void selectByMap() {
HashMap<String, Object> map = new HashMap<>();
map.put("age", "18");
employeeMapper.selectByMap(map).forEach(System.out::println);
}
(十)删除数据方法
1.deleteById方法
根据id删除记录
//根据id删除
@Test
public void deleteById() {
employeeMapper.deleteById(11L);
}
2.deleteByMap方法
根据Map中的条件进行删除,map中的条件在sql语句中是and关系。
//Map删除
@Test
public void deleteByMap() {
HashMap<String, Object> map = new HashMap<>();
map.put("empGender", "男");
employeeMapper.deleteByMap(map);
}
3.deleteBatchIds方法
根据传入List集合中的id进行批量删除
//批量删除
@Test
public void deleteBatchIds() {
employeeMapper.deleteBatchIds(Arrays.asList(2,4));
}
五、Mybatis-Plus条件构造器
(一)条件构造器介绍
在mybatis-plus中提了构造条件的类Wrapper,它可以根据自己的意图定义我们需要的条件。Wrapper是一个抽象类,一般情况下我们用它的子类QueryWrapper来实现自定义条件查询.
(二)selectOne方法
先向数据库里面表里面插入数据
INSERT INTO employee (name, age, empGender, email) VALUES
('吴邪', 26, '男', '[email protected]'),
('张起灵', 700, '男', '[email protected]'),
('王胖子', 28, '男', '[email protected]'),
('吴三省', 45, '男', '[email protected]'),
('解连环', 42, '男', '[email protected]'),
('陈文锦', 40, '女', '[email protected]'),
('霍仙姑', 80, '女', '[email protected]'),
('潘子', 35, '男', '[email protected]'),
('阿宁', 25, '女', '[email protected]'),
('黑眼镜', 300, '男', '[email protected]'),
('云彩', 18, '女', '[email protected]'),
('老痒', 26, '男', '[email protected]'),
('陈皮阿四', 80, '男', '[email protected]'),
('二月红', 900, '男', '[email protected]'),
('齐羽', 500, '男', '[email protected]'),
('解雨臣', 26, '男', '[email protected]'),
('霍秀秀', 22, '女', '[email protected]'),
('苏万', 18, '男', '[email protected]'),
('李簇', 18, '男', '[email protected]'),
('杨好', 18, '男', '[email protected]'),
('塌肩膀', 200, '男', '[email protected]'),
('蓝袍藏人', 1000, '男', '[email protected]'),
('汪藏海', 2000, '男', '[email protected]'),
('蛇沼鬼母', 1500, '女', '[email protected]'),
('禁婆', 500, '女', '[email protected]'),
('海猴子', 30, '男', '[email protected]'),
('血尸', 20, '男', '[email protected]'),
('烛九阴', 500, '男', '[email protected]'),
('鸡冠蛇', 50, '男', '[email protected]'),
('尸蹩王', 100, '男', '[email protected]');
INSERT INTO employee (name, age, empGender, email) VALUES
('张海客', 600, '男', '[email protected]'),
('张海杏', 550, '女', '[email protected]'),
('张海盐', 400, '男', '[email protected]');
再进行测试
//selectOne
@Test
public void selectOne() {
QueryWrapper<Employee> wrapper = new QueryWrapper<>();
wrapper.eq("empGender", "男");
wrapper.eq("name", "吴邪");
Employee employee = employeeMapper.selectOne(wrapper);
System.out.println(employee);
}
(三).selectList方法
//selectList方法,查询姓名中里面有"张"的且年龄大于100的人员
@Test
public void selectList() {
QueryWrapper<Employee> wrapper = new QueryWrapper<>();
wrapper.like("name", "张").ge("age", 100);
employeeMapper.selectList(wrapper).forEach(System.out::println);
}
//查询性别为男或者姓刘,按年龄的升序排序
@Test
public void selectList2() {
QueryWrapper<Employee> wrapper = new QueryWrapper<>();
wrapper.eq("empGender", "男").or().like("name", "刘").orderByAsc("age");
employeeMapper.selectList(wrapper).forEach(System.out::println);
}
//查询姓张并且(年龄大于100或者邮箱不为null)
@Test
public void selectList3() {
QueryWrapper<Employee> wrapper = new QueryWrapper<>();
wrapper.like("name", "张").and(i -> i.gt("age", 100).or().isNotNull("email"));
employeeMapper.selectList(wrapper).forEach(System.out::println);
}
(四).selectPage方法
1、配置分页类
selectPage用于分页,在mybatis-plus中分页有两种一种是罗辑分页或叫内存分页,另一种是物理分页,内存分页就是把数据全部查询出来放到内容中,返回你想要的一部分数据,当数据量非常庞大时这种方法就行不通了,因为太耗内容,所以一般采用物理分页,需要springboot中加入物理分页配置:
@Configuration
public class MybatisPlusPageConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加
// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
return interceptor;
}
}
2、编写测试方法
//测试分页
@Test
public void selectPage() {
QueryWrapper<Employee> wrapper = new QueryWrapper<>();
wrapper.ge("age", 18);
Page<Employee> page = new Page<>(1, 5);
Page<Employee> employeePage = employeeMapper.selectPage(page, wrapper);
System.out.println("当前页:" + employeePage.getCurrent());
System.out.println("每页记录数:" + employeePage.getSize());
System.out.println("总页数:" + employeePage.getPages());
System.out.println("总记录数:" + employeePage.getTotal());
List<Employee> records = employeePage.getRecords();
records.forEach(System.out::println);
}
3、查看测试结果
(五)update方法
//根据姓名和年龄修改记录
@Test
public void update() {
QueryWrapper<Employee> updateWrapper = new QueryWrapper<>();
updateWrapper.eq("name", "哈哈哈").eq("age", 200);
Employee employee = new Employee();
employee.setName("张启山");
employee.setEmail("[email protected]");
employee.setAge(22);
employee.setEmpGender("男");
int result =employeeMapper.update(employee, updateWrapper);
System.out.println(result);
}
(六).delete方法
//根据姓名和年龄删除记录
@Test
public void delete() {
QueryWrapper<Employee> deleteWrapper = new QueryWrapper<>();
deleteWrapper.eq("name", "张海盐").eq("age", 400);
int result = employeeMapper.delete(deleteWrapper);
System.out.println(result);
}
六、Mybatis-Plus的Service封装
(一)通用service简介
Mybatis-Plus除了通用的Mapper还有通用的Servcie层,这也减少了相对应的代码工作量,把通用的接口提取到公共。其实按照MP的这种思想,可以自己也实现一些通用的Controller。
(二).通用service常用方法介绍
此接口类里卖有很多可用的方法
(三)通用service的案例
1.构建maven工程添加依赖
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.7</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
2.实体类创建
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee implements Serializable {
@TableId(value = "empId", type = IdType.AUTO)
private Integer empId;
@TableField(value = "name")
private String name;
@TableField(value = "empGender")
private String empGender;
@TableField(value = "email")
private String email;
@TableField(value = "age")
private Integer age;
}
3.实体类的Mapper接口
@Mapper
public interface EmployeeMapper extends BaseMapper<Employee> {
}
4.配置文件编写
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///mybatisdatabase200
username: root
password: 123456
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
5.构建service接口
public interface EmployeeService extends IService<Employee> {
}
6.构建service实现类
@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {
}
7.通用servcie测试
7.1save
@RunWith(SpringRunner.class)
@SpringBootTest
class MybatisPlus02ApplicationTests {
@Autowired
private EmployeeService employeeService;
//测试Save
@Test
void testSave() {
Employee employee = new Employee();
employee.setName("小医仙");
employee.setEmpGender("女");
employee.setEmail("[email protected]");
employee.setAge(18);
boolean save = employeeService.save(employee);
System.out.println(save);
}
}
7.2SaveOrUpdate
//测试SaveOrUpdate
@Test
void testSaveOrUpdate() {
Employee employee = new Employee();
employee.setEmpId(53);
employee.setName("古熏儿");
employee.setEmpGender("女");
employee.setEmail("古熏儿@163.com");
employee.setAge(18);
boolean save = employeeService.saveOrUpdate(employee);
System.out.println(save);
}
7.3GetOne
//测试getOne
@Test
void testGetOne() {
QueryWrapper<Employee> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "吴邪");
Employee employee = employeeService.getOne(queryWrapper);
System.out.println(employee);
}
七、Mybatis-Plus新代码生成器
(一)代码生成器介绍
代码生成器顾名思义就是为我们生成一些代码,省去了我们一些时间。AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率,MyBatis-Plus从3.0.3 之后移除了代码生成器与模板引擎的默认依赖,需要手动添加相关依赖,才能实现代码生成器功能。
(二)构建maven工程引入相关依赖
<!--generator-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.9</version>
</dependency>
<!--freemarker-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.7</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--ApiModel-->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.20</version>
</dependency>
(三)编写新生成器代码
在测试类下面编写代码生成器
@SpringBootTest
class MybatisPlus03ApplicationTests {
//编写代码生成器
@Test
public void testCodeGenerator() {
//全局配置
FastAutoGenerator.create("jdbc:mysql:///mybatisdatabase200", "root", "123456")
.globalConfig(builder -> {
builder.author("baomidou") // 设置作者
.enableSwagger() // 开启 swagger 模式
.outputDir("C:\\Users\\20665\\IdeaProjects\\frame\\MybatisPlus03\\src\\main\\java"); // 指定输出目录
})
.dataSourceConfig(builder ->
builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
int typeCode = metaInfo.getJdbcType().TYPE_CODE;
if (typeCode == Types.SMALLINT) {
// 自定义类型转换
return DbColumnType.INTEGER;
}
return typeRegistry.getColumnType(metaInfo);
})
)
.packageConfig(builder ->
builder.parent("com.jn.generator") // 设置父包名
.pathInfo(Collections.singletonMap(OutputFile.xml, "C:\\Users\\20665\\IdeaProjects\\frame\\MybatisPlus03\\src\\main\\resources\\mapper")) // 设置mapperXml生成路径
)
.strategyConfig(builder ->
builder.addInclude("employee") // 设置需要生成的表名
.addTablePrefix() // 设置过滤表前缀
)
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
}
(四)执行生成器代码完成测试
1、在主启动类上用@MapperScan扫描mapper接口
@SpringBootApplication
@MapperScan("com.jn.generator.mapper")
public class MybatisPlus03Application {
public static void main(String[] args) {
SpringApplication.run(MybatisPlus03Application.class, args);
}
}
2、在生成的contorller中编写查询方法
@Controller
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private IEmployeeService employeeService;
//测试新代码生成器
@RequestMapping("/emp")
public List<Employee> testCodeGenerator() {
List<Employee> list = employeeService.list();
return list;
}
}
(五)出现错误
Unknown column 'emp_gender' in 'field list'
(六)解决错误
在生成的实体类里面加入TableField注解,然后再进行测试
@TableId(value = "empId", type = IdType.AUTO)
private Integer empId;
@TableField(value = "name")
private String name;
@TableField(value = "empGender")
private String empGender;
@TableField(value = "email")
private String email;
@TableField(value = "age")
private Integer age;
(七)双错啦
然后在网上一直找解决的方法,第一种情况是SpringBoot的启动程序目录下面没有Controller控制层,这不是扯蛋,老子已经是自动生成的了 ,如图:
第二种情况就是要在启动类上加入@SpringBootApplication(scanBasePackages="controller"),这是来搞笑的吧
(八)找到错误
发现自动生成的Controller控制层类使用的是@Controller注解,后面在测试的过程中也没有加入@RequestBody来转换Json字符串,改成这样就行了:直接使用@RestController
@RestController
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private IEmployeeService employeeService;
//测试新代码生成器
@RequestMapping("/emp")
public List<Employee> testCodeGenerator() {
List<Employee> list = employeeService.list();
return list;
}
}
(九)终极测试
启动SpringBoot在浏览器访问 localhost:8080/employee/emp