为什么使用?
就我个人使用mybatis的感觉,在做一些数据库操作的使用需要写一堆的判断,冗长的sql语句。我觉得一个程序员不应该这种重复的语句上花费太多的时间。
当然之前面试过程中,也被人问过mybatis自动生成sql。那时接触java不久,也不知道这类东西。结果被面试的人嗤之以鼻的笑了一下。这也促使我花了点时间了解一下。
优缺点
优点
省去了po。mapper,sql.xml这些文件的创建,编写。就是快。
缺点
功能比较单一,复杂业务逻辑下,还是要手动写。
使用方法
maven依赖
文件路径:{项目路径}/pom.xml
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<configurationFile>src/main/resources/mybatis-generator/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
</dependencies>
</plugin>
maven配置详解
- configurationFile
- verbose
- overwrite
XML配置
文件路径:{项目路径}/src/main/resources/mybatis-generator/generatorConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--mybatis的代码生成器相关配置-->
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<properties resource="jdbc.properties"/>
<context id="myContext" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<commentGenerator>
<property name="suppressDate" value="false"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<jdbcConnection driverClass="${spring.datasource.driverClassName}"
connectionURL="${spring.datasource.url}"
userId="${spring.datasource.username}"
password="${spring.datasource.password}">
<!--高版本的 mysql-connector-java 需要设置 nullCatalogMeansCurrent=true-->
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<javaModelGenerator targetPackage="com.sz.blog.entity"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<sqlMapGenerator targetPackage="mapping"
targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<javaClientGenerator targetPackage="com.sz.blog.mapper"
targetProject="src/main/java" type="XMLMAPPER">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<table tableName="blog_user" domainObjectName="User"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false">
<!--<columnRenamingRule searchString="^D_"
replaceString=""/>-->
</table>
</context>
</generatorConfiguration>
xml配置详解
- properties
引入配置文件 ,resource="{文件名称}",url="{文件路径}",由于就在当前路径下,所以没有设置过url参数,不确定url具体效果,一般情况配置文件也都是放在一起的。所以没在过多研究url这个参数
另外,resource的值我从yml配置文件去除,无法使用。所以单独建了一个jdbc.properties的配置文件。
<properties resource="jdbc.properties"/>
- context
一个数据库一个context,并且context的字元素必须按照顺序给出。如果没按照顺序写入,系统会报错按照错误提示你也会乖乖按照顺序重新排列。
- property*,
- plugin*,
- commentGenerator?,
- jdbcConnection,
- javaTypeResolver?,
- javaModelGenerator,
- sqlMapGenerator?,
- javaClientGenerator?,
- table+
如果执行过程中报错,将上述子元素都列出来了。那就乖乖根据这个顺序和你系统中的顺序一一对照一下。
- commentGenerator
suppressAllComments:true=不生成注释,false=生成注释。
suppressDate:true=不包含时间戳,false=包含时间戳
(由于我没有生成注释,即便我这里是false也不生效)
<commentGenerator>
<!-- 是否不生成注释 -->
<property name="suppressAllComments" value="true"/>
<!-- 不希望生成的注视中包含时间戳 -->
<property name="suppressDate" value="false"/>
</commentGenerator>
- jdbcConnection
这里主要数据库连接配置,上面在properties标签中引用配置文件,主要是在这里使用配置。参数按照字面不做过多讲解。
nullCatalogMeansCurrent:我查了些资料说,在高版本mysql中,如果值为false(默认值)的情况下可能会出现串库的情况。
从mysql-connector-java 5.x 到 6.x,nullCatalogMeansCurrent属性由原来的默认true改为了false。
true 使用指定的数据库进行查询。优先取当前传入的数据库名,其次取当前链接的数据库名。
false 代表遍历当前链接下的所有数据库进行查询
<jdbcConnection driverClass="${spring.datasource.driverClassName}"
connectionURL="${spring.datasource.url}"
userId="${spring.datasource.username}"
password="${spring.datasource.password}">
<!--高版本的 mysql-connector-java 需要设置 nullCatalogMeansCurrent=true-->
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
- javaTypeResolver
javaTypeResolver是配置JDBC与java的类型转换规则,或者你也可以不用配置,使用它默认的转换规则。就算配置也只能配置bigDecimal类型和时间类型的转换。
<javaTypeResolver>
<!--是否使用 bigDecimal,默认false。
false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer
true,把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal-->
<property name="forceBigDecimals" value="true"/>
<!--默认false
false,将所有 JDBC 的时间类型解析为 java.util.Date
true,将 JDBC 的时间类型按如下规则解析
DATE -> java.time.LocalDate
TIME -> java.time.LocalTime
TIMESTAMP -> java.time.LocalDateTime
TIME_WITH_TIMEZONE -> java.time.OffsetTime
TIMESTAMP_WITH_TIMEZONE -> java.time.OffsetDateTime
-->
<property name="useJSR310Types" value="true"/>
</javaTypeResolver>
- javaModelGenerator
配置po生成的包路径和项目路径,如下
<javaModelGenerator targetPackage="com.sz.blog.entity"
targetProject="src/main/java">
<!-- 是否让schema作为包的后缀,默认为false -->
<property name="enableSubPackages" value="true"/>
<!-- 是否针对string类型的字段在set方法中进行修剪,默认false -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
- sqlMapGenerator
配置生成Mapper.xml文件的生成路径。
<sqlMapGenerator targetPackage="mapping"
targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
- javaClientGenerator
配置 XxxMapper.java 文件的生成目录
type参数配置
XMLMAPPER 会将接口的实现放在 mapper.xml中,也推荐这样配置。
ANNOTATEDMAPPER 接口的实现通过注解写在接口上面
<javaClientGenerator targetPackage="com.sz.blog.mapper"
targetProject="src/main/java" type="XMLMAPPER">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
- table
一个表配置一个table,如果想生成多个表,需要配置多个table。
schema为数据库名,oracle需要配置,mysql不需要配置。
tableName为对应的数据库表名
domainObjectName 是要生成的实体类名(可以不指定).不配置时,它会按照帕斯卡命名法将表名转换成类名
enableXXXByExample 默认为 true, 为 true 会生成一个对应Example帮助类,帮助你进行条件查询,不想要可以设为false.(默认为true,但只有在targetRuntime="MyBatis3"时才生效)
<table schema="" tableName="blog_user" domainObjectName="User"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false">
<!--<columnRenamingRule searchString="^D_"
replaceString=""/>-->
</table>
数据库配置文件(jdbc.properties)
文件路径:{项目路径}/src/main/resources/jdbc.properties
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/blog?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver