不少人喜歡使用JPA的快捷開發,我的喜歡mybatis能夠本身寫sql。而mybaits plus能夠很好的結合二者的有點,有基礎的CRUD接口,還能夠自定義mapper寫sql,比較靈活。get it !java
既然要引入mybatis plus,那麼久須要引入數據庫相關依賴,還有一些工具包。這邊還使用了lombok減小代碼量,這個看狀況引入,畢竟方即是方便,侵入性強一些,須要安裝插件。而後開頭先弄個mybatis plus代碼生成器,畢竟本身手動建文件仍是很累的。。。mysql
完整的的pom.xmlweb
<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>
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.javaspring
public class CodeGenerator { public static void create() throws FileNotFoundException { String projectPath = System.getProperty("user.dir"); // 一、聲明代碼生成器 AutoGenerator generator = new AutoGenerator(); // 二、全局信息配置 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); // 三、數據源配置 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"); // 四、策略配置 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(); // } // 五、生成代碼包信息配置 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"); // 六、自定義要注入到模板的屬性 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); // 八、整合配置 generator.setGlobalConfig(globalConfig) .setDataSource(dataSourceConfig) .setStrategy(strategyConfig) .setPackageInfo(packageConfig) .setTemplate(templateConfig) .setCfg(injectionConfig); //九、執行 generator.execute(); } public static void main(String[] args) throws FileNotFoundException { create(); } }
公共字段提取到BaseEntity.javasql
@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的配置類注入填充策略Beanapache
@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.javajson
@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.javasegmentfault
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 { }
插入一條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); }
完美!~~~~