MyBatis逆向工程创建CRUD代码
逆向工程简介
什么是逆向工程
MyBatis需要程序员自己编写sql语句,MyBatis官方提供逆向工程,可以针对单表自动生成MyBatis执行所需要的代码(mapper.java、mapper.xml、pojo…),可以让程序员将更多的精力放在繁杂的业务逻辑上。
实际开发中,常用的逆向工程方式:由数据库的表生成java代码。
官方文档
逆向工程的创建
创建Maven项目导入依赖
在pom.xml中添加如下依赖和插件,具体可见官方文档:Running MyBatis Generator With Maven
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<!-- mybatis-generator的配置文件,根据情况调整位置 -->
<configurationFile>src/main/resources/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>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
创建配置文件
在resources中创建generatorConfig.xml,使用如下代码,具体见官方文档:MyBatis GeneratorXML Configuration File Reference
<?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="DB2Tables" targetRuntime="MyBatis3">
<!-- Mysql数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/eesy_mybatis?serverTimezone=UTC"
userId="root"
password="1999">
</jdbcConnection>
<javaTypeResolver >
<!-- 默认为false,把JDBC DECIMAL 和NUMERIC类型解析为Integer,
为true时把JDBC DECIMAL 和NUMERIC类型解析为java.math.BigDecimal -->
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成POJO类的位置 -->
<javaModelGenerator targetPackage="com.cjx.entity" targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="mapper" targetProject=".\src\main\resources">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetProject:mapper接口生成的的位置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.cjx.mapper" targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 指定数据表 -->
<table tableName="user"/>
</context>
</generatorConfiguration>
在IDEA中执行generate
如图所示,在IDEA中点击Maven窗口,在Plugins中找到mybatis-generator,点击generate,就可以看到左边已经出现了在配置文件中配置的数据库的表生成的类(User)
生成WithBLOBS文件原因及解决方法
原因
生成结束后,发现跟我想象的不太一样,不只有User和UserExample,还有Key和WithBLOBS文件,看下面的警告,发现是因为数据库中不只一个表叫user,如图所示:
解决方法
在generatorConfig.xml里jdbc连接配置中加入一行
<property name="nullCatalogMeansCurrent" value="true" />
添加后如下:
<!-- Mysql数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/eesy_mybatis?serverTimezone=UTC"
userId="root"
password="1999">
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>
然后一定要把上一次生成的删除干净,因为mapper.xml文件再次生成时并不会覆盖,而是追加,所以后面运行时会出现xml解析错误的问题,然后再次在Maven中的Plugins里生成,这次只生成了User和UserExample,下面也没有警告了,结果如下:
如何使用刚刚生成的代码
创建MyBatis的配置文件
在resources下创建SqlMapConfig.xml,代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- MyBatis的主配置文件 -->
<configuration>
<!-- 配置环境 -->
<environments default="mysql">
<!-- 配置MySQL环境 -->
<environment id="mysql">
<!-- 配置事务类型 -->
<transactionManager type="JDBC"/>
<!-- 配置数据源/连接池 -->
<dataSource type="POOLED">
<!-- 配置连接数据库的4个基本信息 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="1999"/>
</dataSource>
</environment>
</environments>
<!-- 使用xml方式配置时这里指定映射配置文件的位置 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
创建测试类调用
在test下创建MyBatisTest类,如下:
public class MyBatisTest {
private InputStream in;
private SqlSession session;
private UserMapper userMapper;
@Before
public void init() throws Exception{
in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
session = factory.openSession();
userMapper = session.getMapper(UserMapper.class);
}
@After
public void destroy() throws Exception{
session.close();
in.close();
}
@Test
public void testFindById(){
User user = userMapper.selectByPrimaryKey(1);
System.out.println(user);
}
}
还要记得在User类中添加一个toString()方法,可用IDEA右键类Generate自动生成:
点击运行后结果如下: