Springboot集成MyBatis-Plus并通过MyBatis-Plus-Generator生成代码

MyBatis-Plus是我们在开发时经常用到的一个框架,经常需要在开发Springboot项目时进行配置,正确使用,确实能给我们减少很多工作量,让我们不用再一个一个的根据数据库一个一个建实体类了。这里记录一下

MyBatis-Plus集成

  1. 将下面MyBatis的依赖

            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.3.1</version>
            </dependency>
    

    替换为

    		<dependency>
    			<groupId>com.baomidou</groupId>
    			<artifactId>mybatis-plus-boot-starter</artifactId>
    			<version>3.4.3.1</version>
    		</dependency>
    

    原来没有使用Mybatis的直接新增就可以

  2. 数据源的配置同MyBatis,但yml文件中增加下面配置,

    mybatis-plus:
      mapper-locations: classpath:mapper/*.xml
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      global-config:
        banner: true
        enableSqlRunner: true
        type-aliases-package: com.zwl.entity
    
  3. 做完上面的其实就已经配置好了,没有什么问题了。如果需要测试的话,就需要新建Service等,强烈建议,跟进下面的步骤,自动生成相关Service和Entity

MyBatis-Plus-Generator自动生成代码

  1. 增加下面依赖
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-generator</artifactId>
			<version>3.5.3.1</version>
		</dependency>
		<dependency>
 		<groupId>org.apache.velocity</groupId>
 		<artifactId>velocity-engine-core</artifactId>
 		<version>2.0</version>
 	</dependency>
  1. 跟进自己的情况,修改下面代码,运行,即可自动生成Service、Dao等相关文件

    package com.breed.livestock.generator;
    
    
    import com.baomidou.mybatisplus.annotation.FieldFill;
    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.generator.FastAutoGenerator;
    import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
    import com.baomidou.mybatisplus.generator.config.OutputFile;
    import com.baomidou.mybatisplus.generator.config.TemplateType;
    import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
    import com.baomidou.mybatisplus.generator.config.converts.PostgreSqlTypeConvert;
    import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
    import com.baomidou.mybatisplus.generator.config.querys.PostgreSqlQuery;
    import com.baomidou.mybatisplus.generator.config.rules.DateType;
    import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
    import com.baomidou.mybatisplus.generator.fill.Column;
    import com.baomidou.mybatisplus.generator.fill.Property;
    import com.baomidou.mybatisplus.generator.keywords.MySqlKeyWordsHandler;
    import com.baomidou.mybatisplus.generator.keywords.PostgreSqlKeyWordsHandler;
    
    import java.util.Collections;
    
    // 代码自动生成器
    public class Generator {
        // 数据库连接字段配置
        private static final String JDBC_URL = "jdbc:postgresql://localhost:5432/test2?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSl=true";
        private static final String JDBC_USER_NAME = "postgres";
        private static final String JDBC_PASSWORD = "postgres";
    
        // 包名和模块名
        private static final String PACKAGE_NAME = "com.breed.livestock";
        private static final String MODULE_NAME = "livestock";
    
        // 表名,多个表使用英文逗号分割
        private static final String[] TBL_NAMES = {"sys_department","sys_role","sys_user"};
    
        // 表名的前缀,从表生成代码时会去掉前缀
        private static final String TABLE_PREFIX = "";
    
    
        public static void main(String[] args) {
    
            //获取当前工程路径(这里无需修改)
            String projectPath = System.getProperty("user.dir");
    
    
            /**
             * 1.数据库配置(设置数据源)
             配置数据库连接以及需要使用的字段
             这里配置的是PG数据库,如果是MySQL需要修改
             */
            DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig.Builder(JDBC_URL, JDBC_USER_NAME,
                    JDBC_PASSWORD)
                    .dbQuery(new PostgreSqlQuery())
                    .typeConvert(new PostgreSqlTypeConvert())
                    .keyWordsHandler(new PostgreSqlKeyWordsHandler());
    
    
            FastAutoGenerator fastAutoGenerator = FastAutoGenerator.create(dataSourceConfigBuilder);
    
    
            /**
             * 2.全局配置
             */
            fastAutoGenerator.globalConfig(
                    globalConfigBuilder -> globalConfigBuilder
                            .fileOverride()     // 覆盖已生成文件
                            .disableOpenDir()   // 不打开生成文件目录
                            .outputDir(projectPath + "/src/main/java") // 指定输出目录,注意斜杠的表示
                            .author("hanbo") // 设置注释的作者
                            .commentDate("yyyy-MM-dd HH:mm:ss") // 设置注释的日期格式
                            .dateType(DateType.TIME_PACK)   // 使用java8新的时间类型
    //                        .enableSwagger()    // 开启swagger文档
            );
    
            /**
             日期类型 DateType
             DateType.ONLY_DATE 使用 java.util.date包下的 Date
             DateType.SQL_PACK 使用 java.sql包下的 Date
             DateType.TIME_PACK   因为会使用 java.time.LocalDateTime jdk1.8以上才支持  (推荐使用)
             */
    
    
            /**
             * 3.包配置
             */
            fastAutoGenerator.packageConfig(
                    packageConfigBuilder -> packageConfigBuilder
                            .parent(PACKAGE_NAME)   // 设置父包名
                            // .moduleName(MODULE_NAME) // 设置父包模块名
                            .entity("entity") // 设置MVC下各个模块的包名
                            .mapper("mapper")
                            .service("service")
                            .serviceImpl("service.impl")
                            .controller("controller")
                            .xml( "\\src\\main\\resources\\mapper") // 设置XML资源文件的目录
                            .pathInfo(Collections.singletonMap(OutputFile.xml, projectPath + "\\src\\main\\resources\\mapper"))// 设置XML资源文件的目录
    
            );
    
    
    
            /**
             * 4.策略配置
             */
            fastAutoGenerator.strategyConfig(
                    strategyConfigBuilder -> strategyConfigBuilder
                            .enableCapitalMode()    // 开启大写命名
                            .enableSkipView()   // 开启跳过视图
                            .disableSqlFilter() // 禁用sql过滤
                            .addInclude(TBL_NAMES)  // 设置需要生成的表名
                            .addTablePrefix(TABLE_PREFIX)   // 设置过滤表前缀
            );
    
    
            /**
             * 4.1 Entity策略配置
             */
            fastAutoGenerator.strategyConfig(
                    strategyConfigBuilder -> strategyConfigBuilder.entityBuilder()
                            .enableTableFieldAnnotation()   // 生成实体时生成字段的注解,包括@TableId注解等---
                            .naming(NamingStrategy.underline_to_camel)  // 数据库表和字段映射到实体的命名策略,为下划线转驼峰
                            .columnNaming(NamingStrategy.underline_to_camel)
                            .idType(IdType.AUTO)    // 全局主键类型为AUTO(自增)
                            .enableLombok() // 支持lombok开启注解
                            .logicDeleteColumnName("deleted")   // 逻辑删除字段名(数据库)
                            .logicDeletePropertyName("deleted") // 逻辑删除属性名(实体)
                            .addTableFills(new Column("create_time", FieldFill.INSERT)) // 自动填充配置  create_time  update_time 两种方式
                            .addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE))
                            .versionColumnName("version")   // 开启乐观锁
                            .disableSerialVersionUID()  // 禁用生成 serialVersionUID,默认值:true
                            .enableChainModel() // 开启实体类链式编程
                            .formatFileName("%sEntity") // 实体名称格式化为XXXEntity   formatFileName("%sEntity")
                    .enableTableFieldAnnotation()
                    .enableFileOverride()
    
            );
    
            /**
             * 4.2 Controller策略配置
             */
            fastAutoGenerator.strategyConfig(
                    strategyConfigBuilder -> strategyConfigBuilder.controllerBuilder()
                            .enableRestStyle()  // 开启生成@RestController控制器
                            .enableHyphenStyle()    // 开启驼峰转连字符 localhost:8080/hello_id_2
            );
    
            /**
             * 4.3 Service策略配置
             格式化service接口和实现类的文件名称,去掉默认的ServiceName前面的I ----
             */
            fastAutoGenerator.strategyConfig(
                    strategyConfigBuilder -> strategyConfigBuilder.serviceBuilder()
                            .formatServiceFileName("I%sService")
                            .formatServiceImplFileName("%sServiceImpl"));
    
            /**
             * 4.4 Mapper策略配置
             格式化 mapper文件名,格式化xml实现类文件名称
             */
            fastAutoGenerator.strategyConfig(
                    strategyConfigBuilder -> strategyConfigBuilder.mapperBuilder()
                            .enableMapperAnnotation()   // 开启 @Mapper 注解
                            .formatMapperFileName("%sMapper")
                            .formatXmlFileName("%sMapper"));
    
            /** 5.生成代码
             *
             */
            // fastAutoGenerator.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
            fastAutoGenerator.execute();
    
        }
    }
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Mybatis-Plus 是 Mybatis 的增强工具,提供了一些常用的 CRUD 操作的实现,其中包括了 `insertOnDuplicateKeyUpdate` 方法。 `insertOnDuplicateKeyUpdate` 方法可以在向数据库插入数据时,如果出现重复的唯一索引或主键冲突时,执行更新操作,而不是插入操作。这个方法是通过在 SQL 语句中使用 MySQL 的 `ON DUPLICATE KEY UPDATE` 语句来实现的。 使用 Mybatis-Plus 的 `insertOnDuplicateKeyUpdate` 方法,需要在实体类中标注唯一索引或主键的注解,并且在执行插入操作时,传入一个 `UpdateWrapper` 对象,用于指定更新的字段和条件。 示例代码如下: ```java @Data public class User { @TableId(type = IdType.AUTO) private Long id; @TableField(value = "user_name", fill = FieldFill.INSERT_UPDATE) private String userName; @TableField(value = "password", fill = FieldFill.INSERT_UPDATE) private String password; @TableField(value = "age", fill = FieldFill.INSERT_UPDATE) private Integer age; @TableField(value = "email", fill = FieldFill.INSERT_UPDATE) private String email; @TableField(value = "create_time", fill = FieldFill.INSERT) private Date createTime; @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) private Date updateTime; @TableField(value = "version", fill = FieldFill.INSERT) private Integer version; @TableLogic @TableField(value = "deleted", fill = FieldFill.INSERT) private Integer deleted; @Version @TableField(value = "opt_lock", fill = FieldFill.INSERT) private Integer optLock; @TableIndex(value="idx_user_name", unique = true) private String name; } ``` ```java User user = new User(); user.setName("test"); user.setAge(18); user.setEmail("test@mp.com"); user.setPassword("test123"); // 构建 UpdateWrapper 对象 UpdateWrapper<User> updateWrapper = new UpdateWrapper<>(); updateWrapper.lambda().eq(User::getName, user.getName()); // 调用 insertOnDuplicateKeyUpdate 方法插入或更新数据 int rows = userMapper.insertOnDuplicateKeyUpdate(user, updateWrapper); ``` 在执行插入操作时,如果存在重复的唯一索引或主键冲突,就会执行更新操作,否则就会插入新的数据。这样就可以避免出现重复的数据,保证数据的唯一性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GIS开发者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值