前言

很多人喜爱应用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

@Datapublic 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

@Configurationpublic 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

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

UserController.java

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

测试应用Mybatis Plus

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

@Autowiredprivate 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、创建者和创立工夫主动填充

获取用户列表

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

完满!~~~~