在平常开发中,若是数据库中存在多张表,本身手动建立 多个pojo 类和编写 SQL 语法配置文件,未免太过繁琐,mybatis 也提供了一键式生成这些文件的操做,咱们称为 mybatis 逆向工程。通常咱们在开发中采用由数据库的表生成java代码。java
贴上官网连接:Mybatis Generatormysql
固然对于 jar 包的下载,咱们能够直接使用 maven 导入:spring
<dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.7</version> </dependency>
Mybatis Generator 提供了好几种方式来运行逆向工程:sql
能够经过 maven 工程,java 程序,eclipse 插件等方式运行,为了后续开发的兼容性问题,在这里咱们采用 java 程序经过 xml 方式配置,不用依赖于开发工具。数据库
在这里咱们经过一个具体的例子来演示 mybatis 逆向工程的操做过程。apache
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.itcast</groupId> <artifactId>mybatis-generator</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!-- mysql 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.12</version> </dependency> <!-- mybatis 核心jar包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!-- mybatis 附加功能包,如日志功能等 --> <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</artifactId> <version>1.9.6</version> </dependency> <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant-launcher</artifactId> <version>1.9.6</version> </dependency> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> <version>5.2</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.5</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.22.0-GA</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>ognl</groupId> <artifactId>ognl</artifactId> <version>3.1.16</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> <scope>test</scope> </dependency> <!-- mybatis-generator --> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.7</version> </dependency> </dependencies> </project>
<?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> <!--数据库链接的信息:驱动类、链接地址、用户名、密码 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql:///sampledb" userId="root" password=""> </jdbcConnection> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- targetProject:生成PO类的位置 --> <javaModelGenerator targetPackage="cn.itcast.ssm.po" targetProject="src/main/java"> <!-- enableSubPackages:是否让schema做为包的后缀 --> <property name="enableSubPackages" value="false" /> <!-- 从数据库返回的值被清理先后的空格 --> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- targetProject:mapper映射文件生成的位置 --> <sqlMapGenerator targetPackage="cn.itcast.ssm.mapper" targetProject="src/main/java"> <!-- enableSubPackages:是否让schema做为包的后缀 --> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- targetPackage:mapper接口生成的位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="cn.itcast.ssm.mapper" targetProject="src/main/java"> <!-- enableSubPackages:是否让schema做为包的后缀 --> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <!-- 指定数据库表 --> <table tableName="items"></table> <table tableName="orders"></table> <table tableName="orderdetail"></table> <table tableName="user"></table> <!-- 有些表的字段须要指定java类型 <table schema="" tableName=""> <columnOverride column="" javaType="" /> </table> --> </context> </generatorConfiguration>
咱们指定须要的文件路径:api
javaModelGenerator
:生成PO类的位置。mybatis
sqlMapGenerator
:mapper映射文件生成的位置。app
javaClientGenerator
:mapper接口生成的位置。eclipse
table
:指定数据库表。
须要注意的是这里关于 MySQL 数据库配置这方面,若是按上面的配置文件的话会报以下错误:
Loading class
com.mysql.jdbc.Drive
. This is deprecated. The new driver class iscom.mysql.cj.jdbc.Driver
. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
其实就是由于咱们导入的 mysql-connector包使用了新的驱动,上述的com.mysql.jdbc.Driver
已经废弃,建议咱们使用 com.mysql.cj.jdbc.Driver
,而且还应在链接的URL中须要增长时区信息。另外咱们还须要经过设置useSSL=false来显式禁用SSL链接,否则也会报关于 SSL 链接的错误。
改成以下:
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql:///sampledb?serverTimezone=GMT&useSSL=false" userId="root" password=""> </jdbcConnection>
package cn.itcast.ssm.generator; 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 java.io.File; 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; //指定逆向工程配置文件 File configFile = new File("/Users/weixuqin/IdeaProjects/mybatis-generator/src/main/resources/generatorConfig.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(configFile); 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(); } } }
注:
这里我遇到了一个问题,本身有编写日志文件,可是不知道为何老是没法加载日志信息,报以下信息,查阅相关资料后也没能解决这个问题,之后有时间本身会解决这个问题。
咱们能够复制粘贴逆向工程中的项目到本身另外的项目中使用,不推荐在原有项目中使用 mybatis generator 生成,由于很容易发生命名冲突覆盖的问题。
这里咱们将 ItemsMapper.java, ItemsMapper.xml, Items.java, ItemsExample.java 复制粘贴到咱们原有项目中,编写测试文件 ItemsMapperTest.java ,查询数据库中 "笔记本" 的记录:
package cn.itcast.ssm.test; import cn.itcast.ssm.mapper.ItemsMapper; import cn.itcast.ssm.po.Items; import cn.itcast.ssm.po.ItemsExample; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.List; public class ItemsMapperTest { private ApplicationContext applicationContext; private ItemsMapper itemsMapper; //在 setUp这个方法获得 spring 容器 @Before public void setUp() throws Exception{ applicationContext = new ClassPathXmlApplicationContext("classpath:config/spring/applicationContext.xml"); itemsMapper = (ItemsMapper) applicationContext.getBean("itemsMapper"); } @Test public void testSelectByExample(){ ItemsExample itemsExample = new ItemsExample(); //经过criteria 构造查询条件 ItemsExample.Criteria criteria = itemsExample.createCriteria(); criteria.andNameEqualTo("笔记本"); //可能返回多条记录 List<Items> list = itemsMapper.selectByExample(itemsExample); System.out.println(list); } }
输出结果以下:
这里我刚开始运行的时候始终找不到 selectByExample() 这个方法,实际上是由于找不到个人 mapper.xml 映射文件,困惑了很久,发现 mapper.xml 并无发布到目标文件中,(idea下,eclipse 下并无这个问题,接口类和映射文件放在同一目录下是容许的)。
因此咱们应该将映射文件放在 resourcs 目录下,再在 mybatis 全局配置文件中加载映射文件,再次执行上述测试文件,便不会找不到咱们的映射文件了。
<!-- 加载映射文件 --> <mappers> <!-- 经过 resource 方法一次加载一个映射文件 --> <mapper resource="config/sqlmap/ItemsMapper.xml"/> </mappers>