关于mysql:springboot-vue前后端分离后台管理系统二-集成mybatisplus

44次阅读

共计 7994 个字符,预计需要花费 20 分钟才能阅读完成。

前言

很多人喜爱应用 JPA 的快捷开发,集体喜爱 mybatis 能够本人写 sql。而 mybaits plus 能够很好的联合两者的有点,有根底的 CRUD 接口,还能够自定义 mapper 写 sql, 比拟灵便。get it !

筹备工作

既然要引入 mybatis plus,那么久须要引入数据库相干依赖,还有一些工具包。这边还应用了 lombok 缩小代码量,这个看状况引入,毕竟不便是不便,侵入性强一些,须要装置插件。而后结尾先弄个 mybatis plus 代码生成器, 毕竟本人手动建文件还是很累的。。。

引入 maven 依赖

残缺的的 pom.xml

<dependencies>
    <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--mysql 驱动 -->
    <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>8.0.22</version>
    </dependency>
    <!--druid 数据源 -->
    <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid-spring-boot-starter</artifactId>
     <version>1.2.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.apache.velocity</groupId>
     <artifactId>velocity-engine-core</artifactId>
     <version>2.2</version>
    </dependency>
    <!-- mybatis-plus 完结 -->
    <!-- 以下是工具包 -->
    <dependency>
     <groupId>cn.hutool</groupId>
     <artifactId>hutool-all</artifactId>
     <version>5.5.7</version>
    </dependency>
    <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>fastjson</artifactId>
     <version>1.2.75</version>
    </dependency>
    <!-- lombok -->
    <dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <version>1.18.12</version>
     <scope>provided</scope>
    </dependency>
</dependencies>

新建 user 表

CREATE TABLE `user` (`id` varchar(32) NOT NULL,
  `username` varchar(32) NOT NULL COMMENT '用户名',
  `password` varchar(64) NOT NULL COMMENT '明码',
  `sex` char(1) DEFAULT NULL COMMENT '性别 0 女 | 1 男',
  `locked` char(1) DEFAULT NULL COMMENT '是否锁住 0 否 | 1 是',
  `create_time` datetime DEFAULT NULL COMMENT '创立工夫',
  `create_by` varchar(32) DEFAULT NULL COMMENT '创建者',
  `update_time` datetime DEFAULT NULL COMMENT '更新工夫',
  `update_by` varchar(32) DEFAULT NULL COMMENT '更新者',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

配置代码生成器

新建一个 CodeGenerator.java

public class CodeGenerator {public static void create() throws FileNotFoundException {String projectPath = System.getProperty("user.dir");
         // 1、申明代码生成器
         AutoGenerator generator = new AutoGenerator();
         // 2、全局信息配置
         GlobalConfig globalConfig = new GlobalConfig();
         globalConfig
                        // 输入目录
         .setOutputDir(projectPath + "/src/main/java")
                        // 是否笼罩原有文件 默认 false
         .setFileOverride(true)
                        // 是否关上输入目录 默认 true
         .setOpen(false)
                        // 作者
         .setAuthor("ify")
                        // 设置实体类名称
         .setEntityName("%s")
                        // 设置 mapper 命名形式
         .setMapperName("%sDao")
                        // Mapper xml 命名形式
         .setXmlName("%sDao")
                        //service 命名形式
         .setServiceName("%sService")
                        //service impl 命名形式
         .setServiceImplName("%sServiceImpl")
                        //controller 命名形式
         .setControllerName("%sController")
                        // Mapper xml 生成根底 查问列 能够不设置
         .setBaseColumnList(true)
                        //Mapper xml 生成根底返回 map 能够不设置
         .setBaseResultMap(true);
         // 3、数据源配置
         DataSourceConfig dataSourceConfig = new DataSourceConfig();
         // 设置数据库类型和数据源
         dataSourceConfig.setDbType(DbType.MYSQL)
                        .setDriverName("com.mysql.cj.jdbc.Driver")
                        .setUrl("jdbc:mysql://localhost:3306/sample-admin?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=GMT%2B8")
                        .setUsername("root")
                        .setPassword("123456");
         // 4、策略配置
         StrategyConfig strategyConfig = new StrategyConfig();
         strategyConfig
                        // 数据库表映射实体 下划线转大写,驼峰命名形式
         .setNaming(NamingStrategy.underline_to_camel)
                        // 数据库字段映射实体属性 下划线转大写,驼峰命名形式
         .setColumnNaming(NamingStrategy.underline_to_camel)
                        // 生成 @RestController 控制器
         .setRestControllerStyle(true)
                        // 设置 controller 继承的父类
         .setSuperControllerClass(BaseController.class)
                        // entity 继承的父类
         .setSuperEntityClass(BaseEntity.class)
                        // entity 继承类的字段
         .setSuperEntityColumns("id", "create_by", "create_time", "update_by", "update_time")
                        // 是否生成 lombok 模式
         .setEntityLombokModel(true)
                        // 要生成的表名
         .setInclude("user");
         // 设置表前缀,生成的实体名称不蕴含前缀
        //        if (StrUtil.isNotEmpty() {//            strategyConfig.setTablePrefix();
        //        }
         // 5、生成代码包信息配置
         PackageConfig packageConfig = new PackageConfig();
         packageConfig
                        // 设置生成的包名的父类名称
         .setParent("com.ify.sampleAdmin.web")
                        .setController("controller")
                        .setEntity("entity")
                        .setMapper("dao")
                        .setService("service")
                        .setServiceImpl("service.impl");
         //xml 自定义输入到 java 文件夹下,所以上面自定义输入门路
         //                .setXml(mapper");
         // 6、自定义要注入到模板的属性
         InjectionConfig injectionConfig = new InjectionConfig() {
                    // 必须实现的办法, 内容能够放空
         @Override
         public void initMap() {//                Map<String, Object> map = new HashMap<>(4);
        //                map.put("moduleName", "");
        //                map.put("description", "");
        //                this.setMap(map);
         }
                };
         List<FileOutConfig> fileOutConfigList = new ArrayList<>();
         FileOutConfig fileOutConfig = new FileOutConfig("/templates/mapper.xml.vm") {
                    @Override
         public String outputFile(TableInfo tableInfo) {return projectPath + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Dao" + StringPool.DOT_XML;
         }
                };
         fileOutConfigList.add(fileOutConfig);
         injectionConfig.setFileOutConfigList(fileOutConfigList);
         // 7 自定义模板~~~~
         TemplateConfig templateConfig = new TemplateConfig();
         // xml 自定义输入门路,所以设置为 null
         templateConfig.setXml(null);
         // 8、整合配置
         generator.setGlobalConfig(globalConfig)
                        .setDataSource(dataSourceConfig)
                        .setStrategy(strategyConfig)
                        .setPackageInfo(packageConfig)
                        .setTemplate(templateConfig)
                        .setCfg(injectionConfig);
         //9、执行
         generator.execute();}
    public static void main(String[] args) throws FileNotFoundException {create();
    }
}

公共字段提取到 BaseEntity.java

@Data
public class BaseEntity {
    /**
     * id 生成策略为 UUID
     */ @TableId(type = IdType.ASSIGN_UUID)
    private String id;
     /**
     * 创建者 填充策略为插入主动填充
     */
     @TableField(fill = FieldFill.INSERT)
    private String createBy;
     /**
     * 创立工夫 填充策略为插入主动填充
     */
     @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
     /**
     * 更新者 填充策略为更新主动填充
     */
     @TableField(fill = FieldFill.UPDATE)
    private String updateBy;
     /**
     * 更新工夫 填充策略为更新主动填充
     */
     @TableField(fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;
}

而后新建一个主动填充策略类 MpMetaObjectHandler.java

public class MpMetaObjectHandler implements MetaObjectHandler {
    /**
     * 插入时的填充策略
     * @param metaObject
     */
     @Override
     public void insertFill(MetaObject metaObject) {// 起始版本 3.3.0( 举荐应用)
     this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
     this.strictInsertFill(metaObject, "createBy", String.class, "ify");
     }
        /**
     * 更新时的填充策略
     * @param metaObject
     */
     @Override
     public void updateFill(MetaObject metaObject) {// 起始版本 3.3.0( 举荐)
     this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
     this.strictUpdateFill(metaObject, "updateBy", String.class, "ify");
     }
}

新建一个 mybatis plus 的配置类注入填充策略 Bean

@Configuration
public class MybatisPlusConfig {
    /**
     * 相当于顶部的:@MapperScan("com.ify.sample.module.*.dao")
     * {@code @MapperScan("com.ify.sample.module.*.dao")}
     * 这里能够扩大,比方应用配置文件来配置扫描 Mapper 的门路
     */
     @Bean
     public MapperScannerConfigurer mapperScannerConfigurer() {MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer();
     scannerConfigurer.setBasePackage("com.ify.sampleAdmin.web.dao");
     return scannerConfigurer;
     }
     
    /**
     * 新的分页插件, 一弛缓二缓遵循 mybatis 的规定, 须要设置 MybatisConfiguration#useDeprecatedExecutor = false 防止缓存呈现问题 (该属性会在旧插件移除后一起移除)
     */ @Bean
     public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
     interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
     return interceptor;
     }
     
    /**
     * 公共字段主动填充策略
     *
     * @return
     */
     @Bean
     public MpMetaObjectHandler mpMetaObjectHandler() {return new MpMetaObjectHandler();
     }
}

生成代码

User.java

@Data
@EqualsAndHashCode(callSuper = true)
@TableName("user")
public class User extends BaseEntity {
    private static final long serialVersionUID = 1L;
     /**
     * 用户名
     */
     private String username;
     /**
     * 明码
     */
     private String password;
     /**
     * 性别 0 女 | 1 男
     */
     private String sex;
     /**
     * 是否锁住 0 否 | 1 是
     */
     private String locked;
}

UserDao.java

public interface UserDao extends BaseMapper<User> {}

UserService.java

public interface UserService extends IService<User> {}

UserServiceImpl.java

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

UserController.java

@RestController
@RequestMapping("/user")
public class UserController extends BaseController {}

测试应用 Mybatis Plus

插入一条 admin 用户, 不便测试间接用 get 申请,

@Autowired
private UserService userService;

@GetMapping("users")
public void users() {User user = new User();
    user.setUsername("admin");
    user.setPassword("123456");
    user.setLocked("0");
    user.setSex("1");
    this.userService.save(user);
}

操作胜利,id、创建者和创立工夫主动填充

获取用户列表

@Autowired
private UserService userService;

@GetMapping("users")
public String users() {List<User> userList = this.userService.list();
    return JSONObject.toJSONString(userList);
}

完满!~~~~

正文完
 0