锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. Spring Boot框架集成Mybatis-plus

Spring Boot框架集成Mybatis-plus

0
  • JAVA
  • 发布于 2024-08-14
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

国产的开源框架,基于 mybatis,相当于对 mybatis 进行了二次的封装,是 2019 年开源中国里面排行第一的框架,它的核心功能就是简化 mybatis 开发,提高效率。

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

快速上手步骤

1、创建数据库、数据表

2、创建 SpringBoot 项目

3、导入依赖

<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.2</version>
</dependency>
 
 
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
 
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
 
<!-- Druid依赖 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.8</version>
</dependency>

如果是 springboot3,则替换一下依赖

<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-spring-boot3-starter -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
    <version>3.5.6</version>
</dependency>

注意:导入 mybatis-plus 的依赖就不需要导入 mybatis 依赖了,它自己已经做了集成,目前还没有接入 spring 的官方孵化器。         

  1. 编写配置(要注意层级关系)
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/shop_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
    username: root
    password: root
    druid:
      initial-size: 20
      min-idle: 20
      max-active: 100
      max-wait: 10000
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 30000
      validation-query: SELECT 1 FROM DUAL
      test-while-idle: true
      test-on-borrow: true
      test-on-return: false

5、创建对应的 entity、mapper

@Repository
public interface UserMapper extends BaseMapper<User> {
 
}

使用通用 mapper

在对应的 mapper 上面继承基本的接口 BaseMapper,至此所有的 CRUD 操作已经编写完成了。

6、在主启动类上添加配置

@MapperScan("cn.hxzy.mapper")

7、编写测试代码

继承了 BaseMapper,所有的方法全部来自父类,当然我们也可以扩展编写自己的方法。

提一下这个 Wrapper,它是条件构造器,可以在里面添加很多查询条件。

二、配置 yml

现在所有的 sql 是不可见的,我们希望看到 sql 的执行过程,所以配置日志,配置映射 xml 位置,配置别名

# mybatis-plus配置
mybatis-plus:
  configuration:
    map-underscore-to-camel-case: false
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #日志配置
  type-aliases-package: cn.hxzy.entity
  mapper-locations: classpath:/mapper/*Mapper.xml

配置 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="cn.hxzy.mybatisplus.mapper.UserMapper">
​
</mapper>
三、CRUD 操作

mapper 接口的常用

@Autowired
private UserMapper userMapper;
 
@Test
void getUser1() {
    //查询单个对象
    User user = userMapper.selectById(2L);
    System.out.println(user);
}
 
@Test
void getUser2(){
    //查询单个对象
    QueryWrapper<User> queryWrapper=new QueryWrapper<>();
    queryWrapper.eq("id",1L);
    User user = userMapper.selectOne(queryWrapper);
    System.out.println(user);
}
 
@Test
void getList(){
    //条件构造器  where id=1  queryWrapper.eq("id",1);
    //QueryWrapper<User> queryWrapper=new QueryWrapper<>();
    //查询集合数据
    List<User> userList = userMapper.selectList(null);
    for (User user : userList) {
        System.out.println(user);
    }
}
 
@Test
void insert(){
    //新增操作
    int num = userMapper.insert(new User(6L, "张三", 22, "87747@qq.com"));
    if(num>0){
        System.out.println("新增数据成功");
    }
}
 
@Test
void update1(){
    //1、修改第1种
    User user = new User(6L, "张三丰", 122, "87747@qq.com");
    int num = userMapper.updateById(user);
    if(num>0){
        System.out.println("修改数据成功");
    }
 
}
 
@Test
void update2(){
    //2、修改第2种
    User user = new User(6L, "张三丰", 122, "87747@qq.com");
    UpdateWrapper<User> updateWrapper=new UpdateWrapper<>();
    updateWrapper.eq("id",6L); //条件where语句
    updateWrapper.set("name","张无忌"); //set设值
    int num = userMapper.update(updateWrapper);
    if(num>0){
        System.out.println("修改数据成功");
    }
}
 
@Test
void update3(){
    //3、修改第3种
    User user = new User(6L, "李四", 32, "87747@qq.com");
    UpdateWrapper<User> updateWrapper=new UpdateWrapper<>();
    updateWrapper.eq("id",6L); //条件where语句
    int num = userMapper.update(user,updateWrapper);
    if(num>0){
        System.out.println("修改数据成功");
    }
}
 
@Test
void delete1(){
    //删除1
    int num = userMapper.deleteById(6L);
    if(num>0){
        System.out.println("删除成功");
    }
}
 
@Test
void delete2(){
    //删除2
    QueryWrapper<User> queryWrapper=new QueryWrapper<>();
    queryWrapper.eq("id",5L);
    int num = userMapper.delete(queryWrapper);
    if(num>0){
        System.out.println("删除成功");
    }
}
 
@Test
void delete3(){
    //删除3
    User user = new User();
    user.setId(6L);
    int num = userMapper.deleteById(user);
    if(num>0){
        System.out.println("删除成功");
    }
}
四、常用注解

@TableName 用来映射数据库的表名,如果表名与实体类名不一致,在实体类上添加

//表明:此字段不属于表的列
@TableField(exist=false)
@TableField(value="列的字段名")

@TableField 用来映射字段,用法同上

@TableId(type = IdType.ASSIGN_ID)
private Long userId;

@TableId 设置注解映射

AUTO(0), 
NONE(1),
INPUT(2),
ASSIGN_ID(3),
ASSIGN_UUID(4);
​
​
private final int key;
​
private IdType(int key) {
    this.key = key;
}
​
public int getKey() {
    return this.key;
}

查看这个枚举类型 IdType:

@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;

主键生成策略:

值描述
AUTO数据库自增
NONEMP 自己设置注解,采用雪花算法实现 实体类使用 String,数据库使用 bigint
INPUT需要开发者手动赋值 【】住院号:062415 000001 000002 062415 99999999
ASSIGN_IDMP 分配 ID, 可以使用 Long,Integer, String 花算法实现
ASSIGN_UUID分配 UUID,主键类型必须是 String

分布式系统唯一 ID 生成策略之雪花算法

SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且 ID 引入了时间戳,基本上保持自增的。

在 @TableField 主键 的属性里设置 exit=false ,表示不是数据库字段,就不会映射了,一般用于 DTO,VO 等

select=false 表示就不去查询

五、使用 fill 完成字段自动填充

@TableField 的属性,表示自动填充,将对象存入数据库的时候,由 mybatis-plus 自动给某些字段赋值,create_time,update_time 等

步骤:

1、数据库必须先添加字段, 然后实体类加注解

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        //metaObject 元数据
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
​
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

2、创建自动填充的处理器

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

3、测试

略

注意:

1、实体的属性如果为整数类型,就使用 Integer 类型,因为在使用自动填充的时候,int 类型会有一个默认值 0。

2、在使用自动填充的时候,修改语句不能使用条件构造器为参数的方法,因为此方法限定了要改动的列,所以会让自动填充失效。

package cn.hxzy.config;
 
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class MybatisplusConfig {
    /**
     * 新版
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mp = new MybatisPlusInterceptor();
        mp.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mp;
    }
}
六、逻辑删除

1、在数据库上扩展列 deleted

2、实体类上扩展属性

@Test
public void test(){
    User user = userMapper.selectById(5L);
    user.setAge(169);
    //模拟一个捷足先登的第三方
    user.setVersion(user.getVersion()+1);
    userMapper.updateById(user);
}

3、配置文件上添加

Map<String,Object> maps=new HashMap<String,Object>();
maps.put("age",24);
maps.put("name","Billie");
===
wrapper.allEq(maps);

注意:

logic-delete-value: 1 # 逻辑已删除值 (默认为 1) logic-not-delete-value: 0 # 逻辑未删除值 (默认为 0)

这两行配置可以省略,是默认值,可以自由定义删除状态的值

七、乐观锁插件

乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题。

悲观锁:悲观锁在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。

乐观锁:是一种基于冲突检测的方法,检测到冲突时操作就会失败。在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。

解决事务之间的丢失更新

实现步骤:

1、数据库上扩展 version 的字段 ,设置默认值为 1

2、实体类上添加 version 属性 ,添加 @Version 注解

3、配置乐观锁插件

//in 条件的子查询
QueryWrapper<User> wrapper = new QueryWrapper<User>();
wrapper.inSql("id", "10");
wrapper.inSql(true, "id", "4");
User user = userMapper.selectOne(wrapper);
List<User> list = userMapper.selectList(wrapper);
list.forEach(System.out::print);
​

4、测试乐观锁是否生效

package cn.hxzy.config;
 
import com.baomidou.mybatisplus.annotation.DbType;
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 mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}
八、条件构造器

条件构造器方法:

@Test
public void testPage(){
    QueryWrapper<User> wrapper = new QueryWrapper<User>();
    wrapper.like("name","张");
    //Page的构造方法,参数1代表页码,参数2代表每页显示多少条记录
    Page<User> page=new Page<>(2,3);
    
    userMapper.selectPage(page,wrapper);
    
    List<User> records = page.getRecords(); //得到记录集合
    long total = page.getTotal();  //获取总记录数
    System.out.println("总记录数:"+total);
    records.forEach(System.out::println);
}

1.eq:等于

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <groupId>com.example</groupId>
    <artifactId>generator</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    
    <name>generator</name>
    <description>代码生成器</description>
    
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
 
        <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>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
 
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
 
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.1</version>
        </dependency>
 
 
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity</artifactId>
            <version>1.7</version>
        </dependency>
 
        <!--swagger2 核心依赖-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
 
        <!-- swagger-ui为项目提供api展示及测试的界面-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
 
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>
 
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        
    </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
 
</project>

2.gt:大于 ge: 大于等于

package cn.hxzy;
 
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.annotation.IdType;
import java.util.Collections;
import java.util.function.Consumer;
 
public class AutoGenerator {
 
    public static void main(String[] args) {
        runCodeGenerator();
    }
 
 
    /**
     * 快速生成
     */
    private static void runCodeGenerator() {
        FastAutoGenerator.create(getDataSourceConfig())
                .globalConfig(getGlobalConfig())
                .packageConfig(getPackageConfig())
                .strategyConfig(getStrategyConfig())
                /**
                 * 默认的是Velocity引擎模板。也可使用其他的。注意引入模板引擎依赖
                 */
                .execute();
 
    }
 
    /**
     * 数据库配置(DataSourceConfig)
     * @return
     */
    private static DataSourceConfig.Builder getDataSourceConfig() {
        /**
         * TODO 数据库配置
         */
        String url = "jdbc:mysql://localhost:3306/shop_db?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT";
        String username = "root";
        String password = "root";
        DataSourceConfig.Builder builder = new DataSourceConfig.Builder(url, username, password);
        return builder;
    }
 
    /**
     * 全局配置(GlobalConfig)
     * @return
     */
    private static Consumer<GlobalConfig.Builder> getGlobalConfig() {
        Consumer<GlobalConfig.Builder> consumer = new Consumer<GlobalConfig.Builder>() {
            @Override
            public void accept(GlobalConfig.Builder builder) {
                builder.fileOverride() // 覆盖已生成文件
                        // 开启 swagger 模式
                        .enableSwagger()
                        // TODO 设置作者
                        .author("mengshujun")
                        // TODO 指定输出目录
                        .outputDir("F:\\springbootCode\\springboot-mp-01\\dd\\src\\main\\java")
                        .build();
            }
        };
        return consumer;
    }
 
    /**
     * 包配置(PackageConfig)
     */
    private static Consumer<PackageConfig.Builder> getPackageConfig() {
        Consumer<PackageConfig.Builder> consumer = new Consumer<PackageConfig.Builder>() {
            @Override
            public void accept(PackageConfig.Builder builder) {
                builder
                        // TODO 设置父包名
                        .parent("cn.hxzy")
                        // TODO 设置父包模块名
                       .moduleName("erp")
                        // TODO 设置mapperXml生成路径
                        .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D:\\xxx\\mapper"))
                        // 设置 Entity 包名
                        .entity("domain")
                        // 设置 Service 包名
                        .service("service")
                        // 设置 Service Impl 包名
                        .serviceImpl("service.impl")
                        // 设置 Controller 包名
                        .controller("controller")
                        .build();
            }
        };
        return consumer;
    }
 
    /**
     * 策略配置(StrategyConfig)
     * @return
     */
    private static Consumer<StrategyConfig.Builder> getStrategyConfig(){
        Consumer<StrategyConfig.Builder> consumer = new Consumer<StrategyConfig.Builder>() {
            @Override
            public void accept(StrategyConfig.Builder builder) {
 
                /**
                 * 策略配置
                 */
                builder .addTablePrefix("sys_") // TODO 设置过滤表前缀
                        // TODO 设置需要生成的表
                        .addInclude("sys_user")
                        .addInclude("goods")
                        .addInclude("order_db")
                        .build();
 
                /**
                 * Entity 策略配置
                 */
                builder.entityBuilder()
                        // 开启 lombok 模型
                        .enableLombok()
                        // 全局主键类型
                        .idType(IdType.AUTO)
                        // TODO 格式化文件名称
                        .formatFileName("%s")
                        .build();
 
                /**
                 * Mapper 策略配置
                 */
                builder.mapperBuilder()
                        // 启用 BaseResultMap 生成
                        .enableBaseResultMap()
                        // 启用 BaseColumnList
                        .enableBaseColumnList()
                        .build();
 
                /**
                 * Service 策略配置
                 */
                builder.serviceBuilder()
                        .formatServiceFileName("%sService")
                        .formatServiceImplFileName("%sServiceImpl")
                        .build();
 
                /**
                 * Controller 策略配置
                 */
                builder.controllerBuilder()
                        // 开启生成@RestController 控制器
                        .enableRestStyle()
                        // 转换文件名称
                        .formatFileName("%sController")
                        .build();
            }
        };
        return consumer;
    }
 
 
}

3.lt 小于 le:小于等于

4.ne:不等于

5.like: 模糊查询 likeLeft: 百分号在左边 likeRight: 百分号在右边

public interface UserService extends IService<User> {
}
  1. 排序
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

7.map 封装条件

list();
list(queryWrapper);
getById(id);

8.in

removeById(id);
remove(条件构造器);

9.inSql

save(实体类);
saveOrUpdate(实体类);//实体类上如果有ID值,则是修改操作,如果ID为空,则是新增操作
saveBatch(集合);//批量新增

10.updateWrapper

updateById(实体类);//根据实体类的ID值进行修改
update(条件构造器);
九、分页查询操作
  1. 配置

mybatisplus 内置了分页插件,配置拦截器组件

package cn.hxzy.config;
 
import com.baomidou.mybatisplus.annotation.DbType;
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 mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}
  1. 测试
@Test
public void testPage(){
    QueryWrapper<User> wrapper = new QueryWrapper<User>();
    wrapper.like("name","张");
    //Page的构造方法,参数1代表页码,参数2代表每页显示多少条记录
    Page<User> page=new Page<>(2,3);
    
    userMapper.selectPage(page,wrapper);
    
    List<User> records = page.getRecords(); //得到记录集合
    long total = page.getTotal();  //获取总记录数
    System.out.println("总记录数:"+total);
    records.forEach(System.out::println);
}
十、代码生成器

让代码来写代码,让代码来生成一个项目结构。

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、ServiceImpl、Controller 等各个模块的代码,极大的提升了开发效率。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <groupId>com.example</groupId>
    <artifactId>generator</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    
    <name>generator</name>
    <description>代码生成器</description>
    
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
 
        <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>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
 
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
 
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.1</version>
        </dependency>
 
 
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity</artifactId>
            <version>1.7</version>
        </dependency>
 
        <!--swagger2 核心依赖-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
 
        <!-- swagger-ui为项目提供api展示及测试的界面-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
 
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>
 
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        
    </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
 
</project>

MyBatis-Plus 没有直接提供基于 Spring Boot 3 的代码生成器,使用的还是 Spring Boot2 的版本。
生成器代码:

package cn.hxzy;
 
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.annotation.IdType;
import java.util.Collections;
import java.util.function.Consumer;
 
public class AutoGenerator {
 
    public static void main(String[] args) {
        runCodeGenerator();
    }
 
 
    /**
     * 快速生成
     */
    private static void runCodeGenerator() {
        FastAutoGenerator.create(getDataSourceConfig())
                .globalConfig(getGlobalConfig())
                .packageConfig(getPackageConfig())
                .strategyConfig(getStrategyConfig())
                /**
                 * 默认的是Velocity引擎模板。也可使用其他的。注意引入模板引擎依赖
                 */
                .execute();
 
    }
 
    /**
     * 数据库配置(DataSourceConfig)
     * @return
     */
    private static DataSourceConfig.Builder getDataSourceConfig() {
        /**
         * TODO 数据库配置
         */
        String url = "jdbc:mysql://localhost:3306/shop_db?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT";
        String username = "root";
        String password = "root";
        DataSourceConfig.Builder builder = new DataSourceConfig.Builder(url, username, password);
        return builder;
    }
 
    /**
     * 全局配置(GlobalConfig)
     * @return
     */
    private static Consumer<GlobalConfig.Builder> getGlobalConfig() {
        Consumer<GlobalConfig.Builder> consumer = new Consumer<GlobalConfig.Builder>() {
            @Override
            public void accept(GlobalConfig.Builder builder) {
                builder.fileOverride() // 覆盖已生成文件
                        // 开启 swagger 模式
                        .enableSwagger()
                        // TODO 设置作者
                        .author("mengshujun")
                        // TODO 指定输出目录
                        .outputDir("F:\\springbootCode\\springboot-mp-01\\dd\\src\\main\\java")
                        .build();
            }
        };
        return consumer;
    }
 
    /**
     * 包配置(PackageConfig)
     */
    private static Consumer<PackageConfig.Builder> getPackageConfig() {
        Consumer<PackageConfig.Builder> consumer = new Consumer<PackageConfig.Builder>() {
            @Override
            public void accept(PackageConfig.Builder builder) {
                builder
                        // TODO 设置父包名
                        .parent("cn.hxzy")
                        // TODO 设置父包模块名
                       .moduleName("erp")
                        // TODO 设置mapperXml生成路径
                        .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D:\\xxx\\mapper"))
                        // 设置 Entity 包名
                        .entity("domain")
                        // 设置 Service 包名
                        .service("service")
                        // 设置 Service Impl 包名
                        .serviceImpl("service.impl")
                        // 设置 Controller 包名
                        .controller("controller")
                        .build();
            }
        };
        return consumer;
    }
 
    /**
     * 策略配置(StrategyConfig)
     * @return
     */
    private static Consumer<StrategyConfig.Builder> getStrategyConfig(){
        Consumer<StrategyConfig.Builder> consumer = new Consumer<StrategyConfig.Builder>() {
            @Override
            public void accept(StrategyConfig.Builder builder) {
 
                /**
                 * 策略配置
                 */
                builder .addTablePrefix("sys_") // TODO 设置过滤表前缀
                        // TODO 设置需要生成的表
                        .addInclude("sys_user")
                        .addInclude("goods")
                        .addInclude("order_db")
                        .build();
 
                /**
                 * Entity 策略配置
                 */
                builder.entityBuilder()
                        // 开启 lombok 模型
                        .enableLombok()
                        // 全局主键类型
                        .idType(IdType.AUTO)
                        // TODO 格式化文件名称
                        .formatFileName("%s")
                        .build();
 
                /**
                 * Mapper 策略配置
                 */
                builder.mapperBuilder()
                        // 启用 BaseResultMap 生成
                        .enableBaseResultMap()
                        // 启用 BaseColumnList
                        .enableBaseColumnList()
                        .build();
 
                /**
                 * Service 策略配置
                 */
                builder.serviceBuilder()
                        .formatServiceFileName("%sService")
                        .formatServiceImplFileName("%sServiceImpl")
                        .build();
 
                /**
                 * Controller 策略配置
                 */
                builder.controllerBuilder()
                        // 开启生成@RestController 控制器
                        .enableRestStyle()
                        // 转换文件名称
                        .formatFileName("%sController")
                        .build();
            }
        };
        return consumer;
    }
 
 
}
十一、通用 Service

通用 servcie 接口

public interface UserService extends IService<User> {
}

实现类

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

查询

list();
list(queryWrapper);
getById(id);

删除

removeById(id);
remove(条件构造器);

新增

save(实体类);
saveOrUpdate(实体类);//实体类上如果有ID值,则是修改操作,如果ID为空,则是新增操作
saveBatch(集合);//批量新增

修改

updateById(实体类);//根据实体类的ID值进行修改
update(条件构造器);
标签: #JAVA 991 #软件开发 1171
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.