1. 程式人生 > >Mybatis-逆向工程-利用資料庫直接生成java程式碼

Mybatis-逆向工程-利用資料庫直接生成java程式碼

1.什麼是逆向工程?
在專案開發過程中如果資料庫中表太多的話,難免會很麻煩,所以mybatis官方提供了一個逆向工程,可以針對單表自動生成mybatis執行所需要的程式碼(包括mapper.xml、mapper.java、po..)。一般在開發中,常用的逆向工程方式是通過資料庫的表生成java程式碼。

2.使用逆向工程
使用官方網站的mapper自動生成工具mybatis-generator-core-1.3.2來生成po類和mapper對映檔案。

作用:mybatis官方提供逆向工程,可以使用它通過資料庫中的表來自動生成Mapper介面和對映檔案(單表增刪改查)和Po類.

首先建立一個JavaProject專案,建立一個lib資料夾,用來存放需要帶入的jar包,然後選中所匯入的包,右鍵buildpath,新增到系統中。
匯入的jar包有:
log4j-1.2.17.jar
mybatis-3.2.7.jar
mybatis-generator-core-1.3.2.jar
mysql-connector-java-5.1.7-bin.jar
結構如圖所示:
這裡寫圖片描述


- 第一步:mapper生成配置檔案:

直接在專案下建立逆向工程的配置檔案generator.xml,其中配置mapper生成的詳細資訊,注意改以下幾點:

  • 1、 新增要生成的資料庫表
  • 2、 po檔案所在包路徑
  • 3、 mapper檔案所在包路徑
  • 4、 配置當前電腦環境的資料庫資訊,包括資料庫名和密碼

這裡寫圖片描述
generator.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> <!--資料庫連線的資訊:驅動類、連線地址、使用者名稱、密碼 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="root" password="linmeng"> </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.itheima.pojo" targetProject=".\src"> <!-- enableSubPackages:是否讓schema作為包的字尾 --> <property name="enableSubPackages" value="false" /> <!-- 從資料庫返回的值被清理前後的空格 --> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- targetProject:mapper對映檔案生成的位置 最好是跟自己的專案包命名相同,這樣在自動生成之後即可直接使用 --> <sqlMapGenerator targetPackage="cn.itheima.mapper" targetProject=".\src"> <!-- enableSubPackages:是否讓schema作為包的字尾 --> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- targetPackage:mapper介面生成的位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="cn.itheima.mapper" targetProject=".\src"> <!-- enableSubPackages:是否讓schema作為包的字尾 --> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <!-- 指定資料庫表 --> <table tableName="user"></table> <table tableName="orders"></table> <!-- 有些表的欄位需要指定java型別 <table schema="" tableName=""> <columnOverride column="" javaType="" /> </table> --> </context> </generatorConfiguration>
  • 第二步:使用java類生成mapper檔案:
    直接在專案下建立一個java檔案,用來按照上面的配置檔案來自動生成需要的java程式碼
    例項用的是Generator.java
import java.io.File;
import java.util.ArrayList;
import java.util.List;

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;

public class Generator {
    public void generator() throws Exception {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        // 指定 逆向工程配置檔案
        File configFile = new File("generator.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 {
            Generator generatorSqlmap = new Generator();
            generatorSqlmap.generator();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

直接執行這個java檔案,然後重新整理專案,即可看到,專案下已經包含了所生成的mapper.xml檔案和pojo類程式碼。

這裡可以看出有個細節,每個po類多了一個東西,就是xxxExample.java,這個類是給使用者自定義sql使用的。

  • 第三步:拷貝生成的mapper檔案到工程中指定的目錄中

逆向工程注意事項

  1. Mapper檔案內容不覆蓋而是追加

XXXMapper.xml檔案已經存在時,如果進行重新生成則mapper.xml檔案內容不被覆蓋而是進行內容追加,結果導致mybatis解析失敗。
解決方法:刪除原來已經生成的mapper xml檔案再進行生成。
Mybatis自動生成的po及mapper.java檔案不是內容而是直接覆蓋沒有此問題。

  • Table schema問題

下邊是關於針對oracle資料庫表生成程式碼的schema問題:

Schma即資料庫模式,oracle中一個使用者對應一個schema,可以理解為使用者就是schema。
當Oralce資料庫存在多個schema可以訪問相同的表名時,使用mybatis生成該表的mapper.xml將會出現mapper.xml內容重複的問題,結果導致mybatis解析錯誤。
解決方法:在table中填寫schema,如下:<table schema="XXXX" tableName=" " >
XXXX即為一個schema的名稱,生成後將mapper.xml的schema字首批量去掉,如果不去掉當oracle使用者變更了sql語句將查詢失敗。
快捷操作方式:mapper.xml檔案中批量替換:“from XXXX.”為空

Oracle查詢物件的schema可從dba_objects中查詢,如下:
select * from dba_objects