springboot + vue前後端分離後臺管理系統(二) -- 整合Mybatis Plus
阿新 • • 發佈:2021-01-22
前言
很多人喜歡使用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);
}
完美!~~~~