06_Mybatis-Plus_代碼生成器
MP與MGB對(duì)比
- MP提供了大量的自定義設(shè)置,生成的代碼完全能夠滿(mǎn)足各類(lèi)型的需求。
- MP的代碼生成器 和Mybatis MGB(逆向工程)代碼生成器
- MP的代碼生成器都是基于java代碼來(lái)生成。
- MBG基于xml文件進(jìn)行代碼生成。
- Mybatis的代碼生成器可以生成:實(shí)體類(lèi)、Mapper接口、Mapper映射文件。
- MP的代碼生成器可生成:實(shí)體類(lèi)(可以選擇是否支持AR)、Mapper接口、Mapper映射文件、Service層、Controller層。
表及字段命名策略選擇
在MP中,我們建議數(shù)據(jù)庫(kù)表名和字段名采用駝峰命名方式,如果采用下劃線(xiàn)命名方式,則要開(kāi)啟下劃線(xiàn)開(kāi)關(guān),如果表名字段名命名方式不一致,請(qǐng)注解指定,建議最好保持一致。
這么做的原因是為了避免在對(duì)應(yīng)實(shí)體類(lèi)時(shí)產(chǎn)生的性能損耗,這樣字段不用做映射就能直接和實(shí)體類(lèi)對(duì)應(yīng)。當(dāng)然如果項(xiàng)目里不用考慮這點(diǎn)性能損耗,那么可以采用下劃線(xiàn),只需要在生成代碼時(shí)配置dbColumnUnderline屬性即可。
代碼生成器依賴(lài)
模板引擎
MP的代碼生成器默認(rèn)使用的是Apache的Velocity模板,當(dāng)然也可以更換為別的模板技術(shù),例如freemarker。此處不做過(guò)多的介紹。
加入Apache Velocity依賴(lài)
<!-- Apache Velocity模板引擎 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
加入slf4j,查看日志輸出信息
<!-- slf4j 日志輸出 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.7</version>
</dependency>
全局配置
相關(guān)代碼:
//1.全局配置
GlobalConfig config = new GlobalConfig();
config.setActiveRecord(true)//是否支持AR模式
.setAuthor("weidu.xie")//設(shè)置作者
.setOutputDir("E:\\Java文件\\mp04\\src\\main\\java")//生成路徑
.setFileOverride(true)//文件覆蓋
.setIdType(IdType.AUTO) //主鍵策略
.setServiceName("%sService")//設(shè)置生成的service接口的名字的首字母是否為I 如IEmployeeService
.setBaseResultMap(true)//生成基本的結(jié)果集
.setBaseColumnList(true);//生成基本的列的集合 SQL片段供使用
數(shù)據(jù)源配置
相關(guān)代碼:
//2.數(shù)據(jù)源配置
DataSourceConfig dsConfig = new DataSourceConfig();
dsConfig.setDbType(DbType.MYSQL)//設(shè)置數(shù)據(jù)庫(kù)類(lèi)型 MYSQL ORACLE等
.setDriverName("com.mysql.jdbc.Driver")
.setUrl("jdbc:mysql://localhost:3306/mp-test")
.setUsername("root")
.setPassword("root");
策略配置
相關(guān)代碼:
//3.策略配置
StrategyConfig stConfig = new StrategyConfig();
stConfig.setCapitalMode(true)//全局大寫(xiě)命名
.setDbColumnUnderline(true)//指定表名 字段名是否使用下劃線(xiàn)
.setNaming(NamingStrategy.underline_to_camel)//數(shù)據(jù)庫(kù)表映射到實(shí)體的命名策略
.setTablePrefix("tbl_")//表名前綴
.setInclude("tbl_employee");//生成的表 可變參數(shù)
包名策略配置
相關(guān)代碼:
//4.包名策略配置
PackageConfig pkConfig = new PackageConfig();
pkConfig.setParent("top.tomxwd.mp")//設(shè)置父包,后面就不用寫(xiě)這段包名
.setMapper("mapper")
.setService("service")
.setController("controller")
.setEntity("beans")
.setXml("mapper");
整合配置
相關(guān)代碼:
//5.整合配置
AutoGenerator ag = new AutoGenerator();
ag.setGlobalConfig(config)
.setDataSource(dsConfig)
.setStrategy(stConfig)
.setPackageInfo(pkConfig);
執(zhí)行
相關(guān)代碼:
//6.執(zhí)行
ag.execute();
日志相關(guān):
DEBUG 06-09 16:13:53,301 ================================================================= (ClassMap.java:91)
DEBUG 06-09 16:13:53,305 模板:/templates/entity.java.vm; 文件:E:\Java文件\mp04\src\main\java\top\tomxwd\mp\beans\Employee.java (VelocityTemplateEngine.java:72)
DEBUG 06-09 16:13:53,308 ResourceManager: found /templates/mapper.java.vm with loader org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader (ResourceManagerImpl.java:439)
DEBUG 06-09 16:13:53,312 模板:/templates/mapper.java.vm; 文件:E:\Java文件\mp04\src\main\java\top\tomxwd\mp\mapper\EmployeeMapper.java (VelocityTemplateEngine.java:72)
DEBUG 06-09 16:13:53,317 ResourceManager: found /templates/mapper.xml.vm with loader org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader (ResourceManagerImpl.java:439)
DEBUG 06-09 16:13:53,320 模板:/templates/mapper.xml.vm; 文件:E:\Java文件\mp04\src\main\java\top\tomxwd\mp\mapper\EmployeeMapper.xml (VelocityTemplateEngine.java:72)
DEBUG 06-09 16:13:53,321 ResourceManager: found /templates/service.java.vm with loader org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader (ResourceManagerImpl.java:439)
DEBUG 06-09 16:13:53,324 模板:/templates/service.java.vm; 文件:E:\Java文件\mp04\src\main\java\top\tomxwd\mp\service\EmployeeService.java (VelocityTemplateEngine.java:72)
DEBUG 06-09 16:13:53,326 ResourceManager: found /templates/serviceImpl.java.vm with loader org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader (ResourceManagerImpl.java:439)
DEBUG 06-09 16:13:53,327 模板:/templates/serviceImpl.java.vm; 文件:E:\Java文件\mp04\src\main\java\top\tomxwd\mp\service\impl\EmployeeServiceImpl.java (VelocityTemplateEngine.java:72)
DEBUG 06-09 16:13:53,329 ResourceManager: found /templates/controller.java.vm with loader org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader (ResourceManagerImpl.java:439)
DEBUG 06-09 16:13:53,330 模板:/templates/controller.java.vm; 文件:E:\Java文件\mp04\src\main\java\top\tomxwd\mp\controller\EmployeeController.java (VelocityTemplateEngine.java:72)
DEBUG 06-09 16:13:53,396 ==========================文件生成完成!?。?========================= (AutoGenerator.java:100)
注意:此時(shí)可能報(bào)錯(cuò),因?yàn)閜om中沒(méi)有關(guān)于spring-webmvc相關(guān)的依賴(lài)。
加入依賴(lài):
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
在XxxServiceImpl中,不用再注入mapper了。
原因:
- 因?yàn)槠淅^承了ServiceImpl,在ServiceImpl中已經(jīng)完成了對(duì)Mapper對(duì)象的注入,直接在XxxServiceImpl中進(jìn)行使用。
- 在ServiceImpl中也幫我們提供了CRUD方法,基本的一些CRUD的方法在Service中不需要自己定義了。
總結(jié):
比MGB好用。
總的生成代碼
/**
* 代碼生成 實(shí)例代碼
* @throws Exception
*/
@Test
public void testGenerator() throws Exception {
//1.全局配置
GlobalConfig config = new GlobalConfig();
config.setActiveRecord(true)//是否支持AR模式
.setAuthor("weidu.xie")//設(shè)置作者
.setOutputDir("E:\\Java文件\\mp04\\src\\main\\java")//生成路徑
.setFileOverride(true)//文件覆蓋
.setIdType(IdType.AUTO) //主鍵策略
.setServiceName("%sService")//設(shè)置生成的service接口的名字的首字母是否為I 如IEmployeeService
.setBaseResultMap(true)//生成基本的結(jié)果集
.setBaseColumnList(true);//生成基本的列的集合 SQL片段供使用
//2.數(shù)據(jù)源配置
DataSourceConfig dsConfig = new DataSourceConfig();
dsConfig.setDbType(DbType.MYSQL)//設(shè)置數(shù)據(jù)庫(kù)類(lèi)型 MYSQL ORACLE等
.setDriverName("com.mysql.jdbc.Driver")
.setUrl("jdbc:mysql://localhost:3306/mp-test")
.setUsername("root")
.setPassword("root");
//3.策略配置
StrategyConfig stConfig = new StrategyConfig();
stConfig.setCapitalMode(true)//全局大寫(xiě)命名
.setDbColumnUnderline(true)//指定表名 字段名是否使用下劃線(xiàn)
.setNaming(NamingStrategy.underline_to_camel)//數(shù)據(jù)庫(kù)表映射到實(shí)體的命名策略
.setTablePrefix("tbl_")//表名前綴
.setInclude("tbl_employee");//生成的表 可變參數(shù)
//4.包名策略配置
PackageConfig pkConfig = new PackageConfig();
pkConfig.setParent("top.tomxwd.mp")//設(shè)置父包,后面就不用寫(xiě)這段包名
.setMapper("mapper")
.setService("service")
.setController("controller")
.setEntity("beans")
.setXml("mapper");
//5.整合配置
AutoGenerator ag = new AutoGenerator();
ag.setGlobalConfig(config)
.setDataSource(dsConfig)
.setStrategy(stConfig)
.setPackageInfo(pkConfig);
//6.執(zhí)行
ag.execute();
}