在平常開發中,若是數據庫中存在多張表,本身手動建立 多個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>