1 意义
能够根据数据库表快速生成相应的实体类pojo以及mybatis的mapper接口和xml文件(可选),并且可以对单表进行相对复杂的增删改查操作,省去了添加该类方法的时间,可以把更多精力关注于其他业务逻辑,目前springboot完美兼容通用mapper,有相应的启动依赖
2 使用
2.1 相关配置
2.1.1 Pom文件添加依赖
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
<!-- mybatis generator 自动生成代码插件 -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<configurationFile>
${basedir}/src/main/resources/generator/generatorConfig.xml
</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.oracle/ojdbc6 -->
<dependency>
<groupId>com.Oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3.0</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.0.0</version>
</dependency>
</dependencies>
</plugin>
2.1.2 generatorConfig.xml配置及详解
相关网址:https://www.cnblogs.com/maanshancss/p/6027999.html
我的配置如下:
<?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>
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<!-- 自动识别数据库关键字,默认false,如果设置为true,根据SqlReservedWords中定义的关键字列表;
一般保留默认值,遇到数据库关键字(Java关键字),使用columnOverride覆盖
-->
<property name="autoDelimitKeywords" value="false"/>
<!-- 生成的Java文件的编码 -->
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 格式化java代码 -->
<property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
<!-- 格式化XML代码 -->
<property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
<property name="caseSensitive" value="true"/>
</plugin>
<!-- 生成 JavaBean 对象重写 toString方法 -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
<!-- 生成 JavaBean 对象继承 Serializable 类 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<!-- 生成 JavaBean 对象重写 equals 和 hashCode 方法 -->
<!-- <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" /> -->
<jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@192.168.xx.xxx:1521:prod"
userId="newprod"
password="bfdds06fd">
</jdbcConnection>
<javaTypeResolver>
<!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
<!--
Oracle 使用number的情况下
如果精度>0或者长度>18,就会使用java.math.BigDecimal
如果精度=0并且10<=长度<=18,就会使用java.lang.Long
如果精度=0并且5<=长度<=9,就会使用java.lang.Integer
如果精度=0并且长度<5,就会使用java.lang.Short
-->
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<javaModelGenerator targetPackage="com.xxx.entity"
targetProject="src/main/java"/>
<sqlMapGenerator targetPackage="com.xxx.mapper"
targetProject="src/main/resources"/>
<javaClientGenerator targetPackage="com.xxx.mapper"
targetProject="src/main/java"
type="XMLMAPPER"/>
<table tableName="PRODUCT_INFO">
<generatedKey column="id"
sqlStatement="select {1}_SEQ.nextval from dual"
identity="false" type="pre"/>
</table>
</context>
</generatorConfiguration>
2.2 运行
2.2.1 INTELLIJ IDEA环境下
点击Edit Configurations 进入然后点击左上角绿色的+,再选择maven,在command line命令行输入 mybatis-generator:generate 命令,然后执行
2.2.2 ECLIPSE环境下
ECLIPSE环境下在项目上点击鼠标右键,然后在RUN AS或者DEBUG AS里面选择红色的mave build…,在goal一栏输入mybatis-generator:generate,然后执行
2.2.3 生成的代码
Mapper接口
实体类
2.3 在项目中使用
- 在启动类上加上mapperScan注解,注解的值basePackages指向mapper接口所在的包
- 在service中直接注入需要用到的mapper接口即可
- 增删改查操作
查询
增加
删除
修改
复杂条件增删改查 比如 BETWEEN,大于,小于,排序,去重,分组等操作需要用到Example对象
或者
这样来使用,下面的代码的意思是查询产品中价格大于1000的产品
3 问题
3.1 假如数据库方言是oracle的话存在类型转换问题
代码生成工具生成的实体类pojo数字相关的属性,是根据数据库中number的长度以及精度来控制的
如果精度>0或者长度>18,就会使用java.math.BigDecimal
如果精度=0并且10<=长度<=18,就会使用java.lang.Long
如果精度=0并且5<=长度<=9,就会使用java.lang.Integer
如果精度=0并且长度<5,就会使用java.lang.Short
目前咱们数据库中的id的长度都为22,生成的pojo中的主键以及外键的类型都是BigDecimal,这一点需要解决。
3.2 解决办法(两种)
3.2.1 这个办法需要对每个id进行类型定义,有点麻烦,个人不推荐
3.2.2 重写编写类型转换器,继承JavaTypeResolve接口,重写里面的calculateJavaType方法
@Override
public FullyQualifiedJavaType calculateJavaType(IntrospectedColumn introspectedColumn) {
FullyQualifiedJavaType answer;
JdbcTypeInformation jdbcTypeInformation = typeMap.get(introspectedColumn.getJdbcType());
if (jdbcTypeInformation == null) {
switch (introspectedColumn.getJdbcType()) {
case Types.DECIMAL:
case Types.NUMERIC:
if (introspectedColumn.getScale() > 0
|| introspectedColumn.getLength() > 24
|| forceBigDecimals) {
answer = new FullyQualifiedJavaType(BigDecimal.class.getName());
} else if (introspectedColumn.getLength() > 10) {
answer = new FullyQualifiedJavaType(Long.class.getName());
} else if (introspectedColumn.getLength() > 4) {
answer = new FullyQualifiedJavaType(Integer.class.getName());
} else if (introspectedColumn.getLength() == 1) {
answer = new FullyQualifiedJavaType(Boolean.class.getName());
} else {
answer = new FullyQualifiedJavaType(Short.class.getName());
}
break;
default:
answer = null;
break;
}
} else {
answer = jdbcTypeInformation.getFullyQualifiedJavaType();
}
return answer;
}