为什么我们需要代码生成器?
还记得我刚刚入行的时候,那会儿,感觉根据数据库字段创建model,生成getter,setter方法,mapper,xml的crud代码和SQL的编写,这些一搞就是一天,感觉真的好有成就感~~~
现在呢? 确实是不想做这种重复性的工作,这也许就是成长.
代码生成器在网上有很多很多了, 但是有一些代码生成器适合于你的公司,但是不一定适合你平时自己悄摸学习提升.
下面就和大家介绍两种非常普遍的和一种升级版的代码生成器的集成方式
先把我用的数据表赠送给有需要的人~~~
表
CREATE TABLE `lol_hero` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键自增',
`nick_name` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '外号',
`name` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '英雄名字',
`age` int DEFAULT NULL COMMENT '英雄年龄',
`sex` enum('-1','0','1') COLLATE utf8_bin NOT NULL DEFAULT '-1' COMMENT '-1未知 0 男 1女',
`occupation` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '职业',
`famous` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '口头禅',
`create_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT INTO `lol_hero` VALUES (1, '德玛西亚之力', '盖伦', 18, '0', '战士', 'dedededede', '2020-05-13 16:07:31');
INSERT INTO `lol_hero` VALUES (2, '黑暗之女', '安妮', 6, '1', '法师', '提伯斯', '2020-05-13 16:08:12');
INSERT INTO `lol_hero` VALUES (3, ' 狂战士', '奥拉夫', 40, '0', '战士', NULL, '2020-05-13 16:16:03');
INSERT INTO `lol_hero` VALUES (4, '正义巨像', '加里奥', 80, '-1', '法坦', NULL, '2020-05-13 16:16:40');
INSERT INTO `lol_hero` VALUES (5, '卡牌大师', '崔斯特', 31, '0', '法师', NULL, '2020-05-13 16:17:09');
INSERT INTO `lol_hero` VALUES (6, '德邦总管', '赵信', 28, '0', '战士', '一点寒芒先到,随后枪出如龙', '2020-05-13 16:18:08');
INSERT INTO `lol_hero` VALUES (7, '无畏战车', '厄加特', 43, '0', '坦克/战士', 'emmmm', '2020-05-13 16:19:40');
第一种方式,其实是我们最常用的代码生成方式
在集成该代码生成器的时候,我们需要以下三部分:
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jdbcartifactId>
dependency>
<dependency>
<groupId>com.zaxxergroupId>
<artifactId>HikariCPartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.18version>
dependency>
<dependency>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-coreartifactId>
<version>1.3.7version>
dependency>
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>2.1.0version>
dependency>
<dependency>
<groupId>tk.mybatisgroupId>
<artifactId>mapper-spring-boot-starterartifactId>
<version>2.1.5version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
<exclusions>
<exclusion>
<groupId>org.junit.vintagegroupId>
<artifactId>junit-vintage-engineartifactId>
exclusion>
exclusions>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
<plugin>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-maven-pluginartifactId>
<version>1.4.0version>
<configuration>
<configurationFile>src/main/resources/generator/generatorConfig.xmlconfigurationFile>
<overwrite>trueoverwrite>
<verbose>trueverbose>
configuration>
<dependencies>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.18version>
dependency>
<dependency>
<groupId>tk.mybatisgroupId>
<artifactId>mapperartifactId>
<version>4.0.4version>
dependency>
dependencies>
plugin>
plugins>
build>
server:
port: 80
spring:
application:
name: diginto
#数据库
datasource:
type: com.zaxxer.hikari.HikariDataSource
username: root
password: paasword
url: jdbc:mysql://localhost:3306/diginto?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 200
max-lifetime: 60000
mybatis:
mapper-locations: classpath:/mapper/*.xml
type-aliases-package: com.taurus.diginto.crud.model
记得账号密码数据库,以及包地址改成自己的
<generatorConfiguration>
<context id="default" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true" />
<property name="suppressAllComments" value="true" />
commentGenerator>
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/ajyl_medical_model?serverTimezone=UTC"
userId="root"
password="123456">
jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
javaTypeResolver>
<javaModelGenerator targetPackage="com.ajyl.modules.asset.entity"
targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
<property name="constructorBased" value="true" />
<property name="trimStrings" value="true" />
<property name="immutable" value="false" />
javaModelGenerator>
<sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resource">
<property name="enableSubPackages" value="false" />
sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.ajyl.modules.asset.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
javaClientGenerator>
<table tableName="asset_product_feedback" domainObjectName="AssetProductFeedback"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false">
<generatedKey column="id" sqlStatement="Mysql" identity="true"/>
table>
context>
generatorConfiguration>
这个generatorConfig.xml算是注释详尽的很了,所以不要手敲啊,因为没有提示,注定会敲错,直接粘过来,根据注释看一遍就好了
注意:有一些地方需要修改成自己项目的包地址,哪里需要改成自己的项目包地址注释上都已经标出
IDEA最右侧的Maven工具栏, Plugins -> mybatis-generator -> mybatis-generator:generate(双击它)
如果一切都很顺利, 会在你对应的包下生成,实体类,一个没有加类注解的Mapper以及对应的xml文件
最后请大家通过这个mapper测一下你配置的数据库是否OK;
前题必备:首先请确认你的IDEA已经装好插件:Free Mybatis plugin
点点点其实就很简单了,上面我们说IDEA最右侧的Maven工具栏, 很多人都在使用这个Maven工具栏,但是对与其相邻的Database却视而不见;
这里和大家说一下这个工具栏有啥神奇之处
如果你没用过这个工具栏,点开它其实是空白一片的,当你点开+
按钮,光标指向Data Source的时候就会不由得惊呼,卧槽,真叼,集成了N多数据库,向我这种只使用MySQL的足矣~~~
连接数据库的方式和Navicat一样一样的
代码生成
我们选中lol_hero这个表,右键之
点击OK, lol_hero
表生成的domain,mapper,以及SQL文件就会在对应的包下产生
最后请大家通过这个mapper测一下你配置的数据库是否OK;
不知不觉,如果你觉得看这些最基础的CRUD很烦了,说明你老了~~~
此时相见不如不见,但是该咋整呢? 这个时候我们就可以借助 tk.mapper这个jar包来搞它!
注意事项:
(1) 引入tk依赖包(发现一不小心已经在上面给出了,这里就不重复)
(2) 写写写的generatorConfig.xml需要多一些配置(我建议是直接复制然后整个文件覆盖)
<generatorConfiguration>
<classPathEntry
location="D:\job\mvn\repository\mysql\mysql-connector-java\8.0.20\mysql-connector-java-8.0.20.jar"/>
<context id="MysqlTables" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<property name="autoDelimitKeywords" value="true"/>
<property name="javaFileEncoding" value="utf-8"/>
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
<property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
plugin>
<commentGenerator>
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
commentGenerator>
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/diginto?serverTimezone=GMT%2B8"
userId="root"
password="Xukai1234!@#$"/>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
javaTypeResolver>
<javaModelGenerator targetPackage="com.taurus.diginto.crud.model" targetProject="src/main/java">
<property name="enableSubPackages" value="false"/>
<property name="trimStrings" value="true"/>
javaModelGenerator>
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources/mapper">
<property name="enableSubPackages" value="false"/>
sqlMapGenerator>
<javaClientGenerator targetPackage="com.taurus.diginto.crud.mapper" targetProject="src/main/java"
type="XMLMAPPER">
<property name="enableSubPackages" value="false"/>
javaClientGenerator>
<table tableName="lol_hero" enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false">
<generatedKey column="id" sqlStatement="Mysql" identity="true"/>
table>
context>
generatorConfiguration>
和上面的写写写,这里就多了一些插件,比如:集成了lombok,这里给注释掉了,lombok使用起来很方便,但是有些架构师也不建议使用它,这里以后再说吧.
其它的不用变,包记得引用,数据库以及mybatis的配置记得配,生成代码的方式也是一样的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sSxvvyBQ-1589871837812)(C:\Users\ThinkPad\AppData\Roaming\Typora\typora-user-images\1589868609112.png)]
但是生成的mapper和xml你就会发现什么都木有了,xml文件里面只有一个resultMap存在,那我们测试的时候该怎么用呢? 此时我们就需要借助tk.mapper了
代码
@Test
void testMapper(){
LolHero lolHero = lolHeroMapper.selectByPrimaryKey(1);
System.out.println(lolHero.toString());
}
上溯这个
selectByPrimaryKey
就会发现它是tk.mapper
的一个接口我们生成的这个
LolHeroMapper
其集成了一个Mapper类,这个类其实就是tk包中的类,具体tk.mapper的东西我们也另说
import com.taurus.diginto.crud.model.LolHero;
import tk.mybatis.mapper.common.Mapper;
public interface LolHeroMapper extends Mapper<LolHero> {
}
最后请大家通过这个mapper测一下你配置的数据库是否OK;