springboot3.2.7
版本适配信息:jdk21 mysql8 springboot-3.5.7 mybatis-plus3.5.7
pom.xml文件添加mysql驱动依赖、mybatis-plus依赖、代码生成器依赖。内容如下
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter-test</artifactId>
<version>3.5.7</version>
</dependency>
<!-- mybatis-plus代码生成器 start -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.7</version>
</dependency>
<!-- MyBatis-Plus 从 3.0.3 之后移除了代码生成器与模板引擎的默认依赖,需要手动添加相关依赖-->
<!-- 截止2024-07相关模版可选最新版本-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.33</version>
</dependency>
<!-- 生成的代码自带 @Get @Set-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<!-- mybatis-plus代码生成器 end -->
application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/event?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: root
代码生成器
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.nio.file.Paths;
public class CodeGenerator {
public static void main(String[] args) {
FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/event?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true",
"root", "root")
.globalConfig(builder -> builder
.author("Baomidou")
.outputDir(Paths.get(System.getProperty("user.dir")) + "/src/main/java")
.commentDate("yyyy-MM-dd")
)
.packageConfig(builder -> builder
.parent("com.example.springboot3")
.entity("entity")
.mapper("mapper")
.service("service")
.serviceImpl("service.impl")
.xml("mapper.xml")
)
.strategyConfig(builder -> builder
.entityBuilder()
.enableLombok()
)
.templateEngine(new FreemarkerTemplateEngine())
.execute();
}
}
执行main函数即可生成代码。
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.springboot3.mapper") //扫包
public class SpringBoot3Application {
public static void main(String[] args) {
SpringApplication.run(SpringBoot3Application.class, args);
}
}
springboot2.x
MyBatis-Plus的定位
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
1.3 特性
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑;
损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作。
版本适配信息:jdk8 mysql8 springboot-2.5.6 mybatis-plus3.4.1
略:
mybatis-plus3.4.1配置如下
pom.xml配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<version>1.18.4</version>
</dependency>
<!-- mybatis plus 代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
application.yml
server:
port: 8080
servlet:
context-path: /
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/hxzy?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: root
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
serialization:
write-dates-as-timestamps: false
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
auto-mapping-behavior: full
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath*:mapper/**/*Mapper.xml
global-config:
# 逻辑删除配置
db-config:
# 删除前
logic-not-delete-value: 1
# 删除后
logic-delete-value: 0
mybatisplus分页插件MybatisPlusConfig
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mpInterceptor() {
//1.定义Mp拦截器
MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
//2.添加分页的拦截器
mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mpInterceptor;
}
}
添加扫描mapper注解
package com.cloud.mybatisplus_demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
@MapperScan("com.cloud.mybatisplus_demo.mapper") //扫包
public class MybatisplusDemoApplication {
@GetMapping("/")
public String welcome(){
return "hello world";
}
public static void main(String[] args) {
SpringApplication.run(MybatisplusDemoApplication.class, args);
}
}
在resources目录下新建mapper文件夹,新建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.cloud.mybatisplus_demo.mapper.UserMapper">
<!-- 查找用户信息 -->
<select id="findAllUser" resultType="com.cloud.mybatisplus_demo.bean.SysUser">
select * from sys_user
</select>
</mapper>
SysUser.java
package com.cloud.mybatisplus_demo.bean;
import lombok.Data;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.util.Date;
import java.io.Serializable;
/**
* @Author zhaox
* @Date 22/4/1
*/
@Data
@TableName("sys_user")
public class SysUser implements Serializable {
private static final long serialVersionUID = 1L;
// @TableId(value = "id", type = IdType.ID_WORKER)
/**
* 雪花算法 生成数字类型的全局唯一id
* 用途:分布式架构里 分库分表;类似uuid
* 条件1:IdType.ID_WORKER
* 条件2:主键参数必须为 long
* @TableId(value = "id", type = IdType.ID_WORKER)
*
*
*/
/**
* 主键自增
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String username;
private String password;
/**
* 头像
*/
private String icon;
/**
* 邮箱
*/
private String email;
/**
* 昵称
*/
@TableField("nick_name")
private String nickName;
/**
* 备注信息
*/
private String note;
}
UserMapper.java
package com.cloud.mybatisplus_demo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cloud.mybatisplus_demo.bean.SysUser;
import java.util.List;
public interface UserMapper extends BaseMapper<SysUser> {
public List<SysUser> findAllUser();
}
定义接口IServices
package com.cloud.mybatisplus_demo.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cloud.mybatisplus_demo.bean.SysUser;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public interface IUserService extends IService<SysUser> {
List<SysUser> findAllUser();
}
UserServiceImpl
package com.cloud.mybatisplus_demo.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cloud.mybatisplus_demo.bean.SysUser;
import com.cloud.mybatisplus_demo.mapper.UserMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, SysUser> implements IUserService {
@Resource
private UserMapper userMapper;
@Override
public List<SysUser> findAllUser() {
return userMapper.findAllUser();
}
}
在Controller类新增restfull接口 测试
@Resource
private IUserService userService;@GetMapping("/getUser")
public SysUser getUser(){
return userService.getById(2);
}
UserController.java
package com.cloud.mybatisplus_demo.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cloud.mybatisplus_demo.bean.SysUser;
import com.cloud.mybatisplus_demo.service.IUserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* @Author zhaox
* @Date 22/4/1
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private IUserService userService;
@GetMapping("/getUser")
public SysUser getUser(){
return userService.getById(2);
}
/**
* 分页例子
* @return
*/
@GetMapping("/list")
public Object getList(){
QueryWrapper qw = new QueryWrapper<>(null);
Page ps = new Page<SysUser>(1, 5);
IPage<SysUser> u = userService.page(ps,qw);
return u;
}
@GetMapping("/findAllUser")
public List<SysUser> findAllUser(){
return userService.findAllUser();
}
}
postMan测试上面是mybatisplus测试成功,
mybatis各个版本的配置方式略有差异
mybatis3.2版本配置如下
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.2.0</version>
</dependency>
/**
* 配置分页插件
*
*/
@Configuration
public class MybatisPlusConfig {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
代码生成器
pom.xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
mybatisplus自动生成代码GeneratorCodeConfig.java
package com.cloud.mybatisplus_demo.gen;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
public class gen {
// 创建一个 代码自动生成器对象
public static void main(String[] args) {
AutoGenerator mpg = new AutoGenerator();
//1. 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");//获取当前的文件路径
gc.setOutputDir(projectPath + "/src/main/java"); //设置输出文件路径
gc.setAuthor("xt"); //设置作者注解
gc.setOpen(false); //是否打开资源管理器
gc.setFileOverride(false); //是否覆盖原来生成的
gc.setServiceName("%sService"); //去service的I前缀
gc.setIdType(IdType.ID_WORKER); //设置全局的ID生成策略。
gc.setDateType(DateType.ONLY_DATE); //设置全局的时间类型
gc.setSwagger2(false); //设置是否开启swagger
mpg.setGlobalConfig(gc);
//2. 设置数据源,自动生成代码会根据该配置查找数据表
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/hxzy?useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai");
dsc.setUsername("root");
dsc.setPassword("root");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
//3. 包的配置
PackageConfig pc = new PackageConfig();
// pc.setModuleName("mybatis"); //设置模块,也就是跟路径下,是否创建一个模块的文件夹,多用于多数据源和库的情况
pc.setParent("com.kuang.mybatis_plus"); //设置跟路径
pc.setEntity("pojo"); //设置实体类的包名
pc.setMapper("mapper"); //设置mapper的包名 xml文件也会在该路径下
pc.setService("service"); //设置service的包名
pc.setController("controller"); //设置controller的包名
mpg.setPackageInfo(pc);
//4. 策略配置
StrategyConfig sc = new StrategyConfig();
sc.setInclude("sys_user"); //设置要映射生成的表名,可以是多个
//设置数据库表的前缀名称,模块名 = 数据库表名 - 前缀名 例如: User = tb_user - tb_
sc.setTablePrefix("tb_");
sc.setNaming(NamingStrategy.underline_to_camel); //设置名称为下划线转大写的驼峰写法
sc.setColumnNaming(NamingStrategy.underline_to_camel); //设置字段的也是驼峰写法
sc.setEntityLombokModel(true); //自动设置lombok注解
sc.setLogicDeleteFieldName("is_delete"); //设置逻辑删除字段名
sc.setVersionFieldName("version"); //设置乐观锁机制
// 设置自动填充字段,例如更新时间、创建时间
/* TableFill createTime = new TableFill("create_time", FieldFill.INSERT);
TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);
ArrayList<TableFill> list = new ArrayList<>();
list.add(createTime);
list.add(updateTime);
sc.setTableFillList(list);*/
sc.setRestControllerStyle(true); //是否开启restful风格的controller
sc.setControllerMappingHyphenStyle(true); //是否开启下划线的URL
mpg.setStrategy(sc);
mpg.execute(); //执行生成
}
}
可以进入源码来看看还有什么生成策略
- NONE: 不设置id生成策略
- INPUT:用户手工输入id
- ASSIGN_ID:雪花算法生成id(可兼容数值型与字符串型)
- ASSIGN_UUID:以UUID生成算法作为id生成策略
- 其他的几个策略均已过时,都将被ASSIGN_ID和ASSIGN_UUID代替掉。
拓展:
分布式ID是什么?
- 当数据量足够大的时候,一台数据库服务器存储不下,这个时候就需要多台数据库服务器进行存储
- 比如订单表就有可能被存储在不同的服务器上
- 如果用数据库表的自增主键,因为在两台服务器上所以会出现冲突
- 这个时候就需要一个全局唯一ID,这个ID就是分布式ID。