MyBatis Generator几种生成方式中的最方便的一种
背景
众所周知,Mybatis是目前orm框架中最流行和最受欢迎的一款。使用的人多了,其不方便的地方也就暴露出来了,比如说针对业务中每一个需要用到的表都要新建对应的 dao,entity,Mapper及xml文件 这对于我们开发人员来说是很多没有意义的重复劳动,这个时候 MyBatis Generator 就应运而生了。
简介
MyBatis Generator (MBG) 是一个Mybatis的代码生成器 MyBatis 和 iBATIS. 他可以生成Mybatis各个版本的代码,和iBATIS 2.2.0版本以后的代码。 他可以内省数据库的表(或多个表)然后生成可以用来访问(多个)表的基础对象。 这样和数据库表进行交互时不需要创建对象和配置文件。 MBG的解决了对数据库操作有最大影响的一些简单的CRUD(插入,查询,更新,删除)操作。 对于联合查询和存储过程手我们仍然需要手写SQL和对象。
运行方式
MyBatis Generator (MBG) 可以通过以下方式运行:
- 从 命令提示符 使用 XML 配置文件
- 作为 Ant 任务 使用 XML 配置文件
- 作为 Maven Plugin
- 从另一个 Java 程序 使用 XML 配置文件
通过Maven运行 MyBatis Generator
1.指定maven项目pom中引入插件
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<!--建议使用最新版本-->
<version>1.3.7</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
<configuration>
<!-- 指定MBG配置文件位置-->
<configurationFile>${project.basedir}/src/main/resources/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<!-- 是否覆盖上次生成的文件-->
<overwrite>true</overwrite>
</configuration>
</plugin>
注意: 这里直接在插件运行过程中动态引入了mysql数据库对应的驱动。如果不希望在这里引入的话,需要在MBG配置文件中指定本地已存在的对应数据库驱动文件的位置
2.项目resources目录下引入MBG配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--可多个 最主要用法是指定特定数据库的jdbc驱动jar包的位置 插件中如果依赖的话无需配置 也可引入其他需要的jar包 比如打包好的通用集成实体类-->
<!--<classPathEntry location="xxx/xxx/mysql-connector-java-5.1.6-bin.jar"/>-->
<!--context:生成一组对象的环境
id:必选,上下文id,用于在生成错误时提示
targetRuntime:
1,MyBatis3:默认的值,生成基于MyBatis3.x以上版本的内容,包括XXXBySample;
2,MyBatis3Simple:类似MyBatis3,只是不生成XXXBySample;
introspectedColumnImpl:类全限定名,用于扩展MBG -->
<context id="mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<!-- 生成的Java文件的编码 -->
<property name="javaFileEncoding" value="UTF-8"/>
<property name="mergeable" value="false"/>
<!-- <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="com.kc.mybatis.mapper.BaseMapper" />
</plugin>-->
<!-- 格式化java代码 -->
<property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
<!-- 格式化XML代码 -->
<property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
<!-- 创建class时,是否关闭自动生成的默认注释及时间戳 -->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
</commentGenerator>
<!--jdbc的数据库连接 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3307/kc?useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true"
userId="root"
password="123456"/>
<!-- 非必需,类型处理器,在数据库类型和java类型之间的转换控制-->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- Model模型生成器,用来生成含有主键key的类,记录类 以及查询Example类
targetPackage 指定生成的model生成所在的包名
targetProject 指定在该项目下所在的路径
-->
<javaModelGenerator targetPackage="com.kc.demo.webmagic.model" targetProject="src/main/java">
<!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
<property name="enableSubPackages" value="false"/>
<!-- 是否对model添加包含所有字段的构造函数 -->
<property name="constructorBased" value="true"/>
<!-- 是否对类CHAR类型的列的数据进行trim操作 -->
<property name="trimStrings" value="true"/>
<!-- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 -->
<property name="immutable" value="false"/>
<!-- 设置一个根对象,所有生成的java对象会继承这个类-->
<property name="rootClass" value="com.kc.demo.webmagic.model.RecordEntity"/>
</javaModelGenerator>
<!--mapper接口对应的xml文件生成配置 -->
<sqlMapGenerator targetPackage="com.kc.demo.webmagic.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- 生成Mapper接口,如果没有配置该元素,那么默认不会生成Mapper接口
type:选择怎么生成mapper接口(在MyBatis3/MyBatis3Simple下):
1,ANNOTATEDMAPPER:会生成使用Mapper接口+Annotation的方式创建(SQL生成在annotation中),不会生成对应的XML;
2,MIXEDMAPPER:使用混合配置,会生成Mapper接口,并适当添加合适的Annotation,但是XML会生成在XML中;
3,XMLMAPPER:会生成Mapper接口,接口完全依赖XML;
注意,如果context是MyBatis3Simple:只支持ANNOTATEDMAPPER和XMLMAPPER
-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.kc.demo.webmagic.mapper"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!--指定目标表名 可以配置多个
可选属性:
1,schema:数据库的schema;
2,catalog:数据库的catalog 如果不指定的话 同样的表名存在多个库中的情况下 connectionURL必须要加上参数;
3,alias:为数据表设置的别名,如果设置了alias,那么生成的所有的SELECT SQL语句中,列名会变成:alias_actualColumnName
4,domainObjectName:生成的domain类的名字,如果不设置,直接使用表名作为domain类的名字;可以设置为somepck.domainName,那么会自动把domainName类再放到somepck包里面;
5,enableInsert(默认true):指定是否生成insert语句;
6,enableSelectByPrimaryKey(默认true):指定是否生成按照主键查询对象的语句(就是getById或get);
7,enableSelectByExample(默认true):MyBatis3Simple为false,指定是否生成动态查询语句;
8,enableUpdateByPrimaryKey(默认true):指定是否生成按照主键修改对象的语句(即update);
9,enableDeleteByPrimaryKey(默认true):指定是否生成按照主键删除对象的语句(即delete);
10,enableDeleteByExample(默认true):MyBatis3Simple为false,指定是否生成动态删除语句;
11,enableCountByExample(默认true):MyBatis3Simple为false,指定是否生成动态查询总条数语句(用于分页的总条数查询);
12,enableUpdateByExample(默认true):MyBatis3Simple为false,指定是否生成动态修改语句(只修改对象中不为空的属性);
13,modelType:参考context元素的defaultModelType,相当于覆盖;
14,delimitIdentifiers:参考tableName的解释,注意,默认的delimitIdentifiers是双引号,如果类似MYSQL这样的数据库,使用的是`(反引号,那么还需要设置context的beginningDelimiter和endingDelimiter属性)
15,delimitAllColumns:设置是否所有生成的SQL中的列名都使用标识符引起来。默认为false,delimitIdentifiers参考context的属性
注意,table里面很多参数都是对javaModelGenerator,context等元素的默认属性的一个复写;
-->
<table tableName="proxy_ip" domainObjectName="ProxyIp"
enableInsert="false" enableSelectByPrimaryKey="false"
enableUpdateByPrimaryKey="false" enableDeleteByPrimaryKey="false">
<!-- 与实体类配置的rootClass同理 -->
<property name="rootClass" value="com.kc.demo.webmagic.model.RecordEntity"/>
<!--配置生成的实体类及xml想要忽略的字段-->
<!--<ignoreColumn column="created_by"/>
<ignoreColumn column="created_time"/>
<ignoreColumn column="last_modified_by"/>
<ignoreColumn column="last_modified_time"/>-->
</table>
</context>
</generatorConfiguration>
这里配置文件的名称要与plugin configurationFile配置中的名称保持一致,否则执行生成命令时是找不到配置的
注意: jdbcConnection
标签的 connectionURL
属性值 在多个数据库中存在相同名称的表的情况下 要加上nullCatalogMeansCurrent=true
参数 否则xml文件中生成的resultmap会有重复
3.执行generate命令
-
项目根目录下执行 mvn mybatis-generator:generate 命令
-
idea中执行插件命令
mapper接口继承通用maper
对于使用通用mapper的小伙伴 如果想一劳永逸的话可以直接在生成mapper接口文件时继承你想继承的通用mapper类 只需要再插件中增加通用mapper的依赖
然后把MBG配置文件中 plugin 标签的那段代码打开即可 value 值是你想要继承的通用mapper的类的全路径