什么是MyBatis Generator
MyBatis Generator俗称逆向工程,是来有效帮助开发人员,减少劳动力,根据数据库表结构,自动为我们生成model,mapper,mapper.xml,非常的方便。
为什么我们要使用MyBatis Generator
在数据库表很多的时候,开发人员要一个个的去建实体类,Mapper,以及Mapper对应的xml文件,非常的麻烦,有的时候不仔细,还会出错,所以在表很多的时候推荐使用MyBatis Generator 来逆向帮我们生成这些文件,开发者无需关心它们是怎么实现的,专注业务逻辑的实现上。从而提高代码的健壮性和维护性。
MyBatis Generator的官方文档
http://www.mybatis.org/generator/configreference/xmlconfig.html
如何使用MyBatis Generator
1.首先在pom.xml中加MyBatis Generator入依赖
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
2.首先我们在resource中创建一个generatorConfig.xml的配置文件,项目结构如下
generatorConfig.xml的内容如下:
<?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="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--这个是mysql的配置-->
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/ee_xueche" userId="root"
password="root">
</jdbcConnection>
<!--这个是oracle的配置-->
<!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:ee_xueche"
userId="root"
password="root">
</jdbcConnection> -->
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL和NUMERIC类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成PO类的位置,重要!! -->
<javaModelGenerator targetPackage="com.eexueche.po"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置,重要!! -->
<sqlMapGenerator targetPackage="/"
targetProject="src/main/resources/mybatis/mapper">
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置,重要!! -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.eexueche.mapper"
targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据库表,要生成哪些表,就写哪些表,要和数据库中对应,不能写错! -->
<table tableName="emp"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false">
</table>
<table tableName="manger"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false">
</table>
</context>
</generatorConfiguration>
这个就是帮我们自动生成实体类,接口mapper已经mapper.xml的配置
这里需要注意的是targetProject是src/main/java 很多网上说的windows是用的.\src, mac系统用的是./src 但是这里实测用src/main/java作为targetProject的路径是不会有问题的。
mapper映射文件生成的位置需要注意的是targetPackage是在resource下,所已这里的targetPackage是 “/”,而targetProject就是
src/main/resources/mybatis/mapper。
mapper接口文件生成的位置也是在src/main/java下,如果希望mapper映射文件xml和接口文件在同一个位置,只需要将mapper映射的targetProject改成src/main/java。
3.使用工具帮我们生成最终的文件 GeneratorSqlmap内容如下
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import java.util.ArrayList;
import java.util.List;
public class GeneratorSqlmap {
public void generator() throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
Resource resource = new ClassPathResource("mybatis/generatorConfig.xml");//这个是逆向工程的配置文件的路径
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration( resource.getInputStream());
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
public static void main(String[] args) throws Exception {
try {
GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
generatorSqlmap.generator();
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意运行一次后,在运行的话是会报错的,需要将之前生成的文件全部删除,然后在运行。
最终生成结果如下图所示
生成的结构如下
这里注意的是实体类并会在id上加上主键标识以及自动增长,默认生成的解构
package com.eexueche.po;
public class Emp {
private Integer id;
private Byte isWoman;
private String love;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Byte getIsWoman() {
return isWoman;
}
public void setIsWoman(Byte isWoman) {
this.isWoman = isWoman;
}
public String getLove() {
return love;
}
public void setLove(String love) {
this.love = love == null ? null : love.trim();
}
}
我们需要在id上加上id注解和自动增长方式需要添加persistence-api依赖
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
</dependency>
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
mapper的结构如下
public interface EmpMapper {
int deleteByPrimaryKey(Integer id);
int insert(Emp record);
int insertSelective(Emp record);
Emp selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(Emp record);
int updateByPrimaryKey(Emp record);
}
下面我们使用一个单元测试用一下帮我自动生成的mapper接口中的方法
public class TestMapper extends ApiApplicationTests {
@Resource
private EmpMapper empMapper;
@Test
public void fun1(){
Emp emp = new Emp();
emp.setId(emp.getId());
emp.setLove("技术总监");
System.out.println(empMapper.insert(emp));
}
@Test
public void fun2() {
Emp emp = new Emp();
emp.setId(11);
emp.setLove("架构书");
System.out.println(empMapper.updateByPrimaryKeySelective(emp));
}
}
运行结果返回的1说明成功,返回0就说明失败。
我们在到数据库去看一下
已经成功,自动给我们生成mapper也是没有问题的。
总结
MyBatis Generator 逆向工程非常的方便,当表多的时候,就可以使用它帮我们生成所有的文件,为我们节省了很多的时间,而无需把时间浪费在创建model、mapper、xml上,当然也有不足的地方,生成的mapper.xml有些可能并不是我们想要的,我们还得自己修改,总而言之MyBatis Generator是非常高效的插件。