前言
很多人喜爱应用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);}
完满!~~~~