Spring+SpringMVC+MyBatis深入學習及搭建(十)——MyBatis逆向工程

来源:http://www.cnblogs.com/Joanna-Yan/archive/2017/06/11/6973266.html
-Advertisement-
Play Games

轉載請註明出處:http://www.cnblogs.com/Joanna-Yan/p/6973266.html 前面講到:Spring+SpringMVC+MyBatis深入學習及搭建(九)——MyBatis和Spring整合 使用官方網站的mapper自動生成工具mybatis-generato ...


轉載請註明出處:http://www.cnblogs.com/Joanna-Yan/p/6973266.html 

前面講到:Spring+SpringMVC+MyBatis深入學習及搭建(九)——MyBatis和Spring整合

使用官方網站的mapper自動生成工具mybatis-generator-core-1.3.2來生成po類和mapper映射文件。

1.什麼是逆向工程

mybatis需要程式員自己編寫sql語句,mybatis官方提供逆向工程可以針對單表自動生成mybatis執行所需要的代碼(mapper.java、mapper.xml、po...)

企業實際開發中,常用的逆向工程方式:

由資料庫的表生成java代碼。

2.下載逆向工程

3.使用方法(要求會用)

為了防止後期資料庫表修改、擴展,需求修改等原因,更新自動生成的po,mapper覆蓋有誤。我們新建專門逆向生成的項目generatorSqlmapCustom,再按需求將自動生成的po,mapper等拷貝到項目中去。

3.1運行逆向工程

建議使用java程式方式,不依賴開發工具。

3.2mapper生成配置文件

在gengeratorConfig.xml中配置mapper生成的詳細信息,註意改下幾點:

(1)添加要生成的資料庫表;

(2)po文件所在包路徑;

(3)mapper文件所在包路徑。

配置文件如下:

<?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/mybatisdemo" userId="root"
            password="">
        </jdbcConnection>
        <!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
            connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg" 
            userId="yycg"
            password="yycg">
        </jdbcConnection> -->

        <!-- 預設false,把JDBC DECIMAL 和 NUMERIC 類型解析為 Integer,為 true時把JDBC DECIMAL 和 
            NUMERIC 類型解析為java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!-- targetProject:生成PO類的位置 -->
        <javaModelGenerator targetPackage="joanna.yan.po"
            targetProject=".\src">
            <!-- enableSubPackages:是否讓schema作為包的尾碼 -->
            <property name="enableSubPackages" value="false" />
            <!-- 從資料庫返回的值被清理前後的空格 -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- targetProject:mapper映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="joanna.yan.mapper" 
            targetProject=".\src">
            <!-- enableSubPackages:是否讓schema作為包的尾碼 -->
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>
        <!-- targetPackage:mapper介面生成的位置 -->
        <javaClientGenerator type="XMLMAPPER"
            targetPackage="joanna.yan.mapper" 
            targetProject=".\src">
            <!-- enableSubPackages:是否讓schema作為包的尾碼 -->
            <p    roperty name="enableSubPackages" value="false" />
        </javaClientGenerator>
        <!-- 指定資料庫表 -->
        <table tableName="items"></table>
        <table tableName="orders"></table>
        <table tableName="orderdetail"></table>
        <table tableName="user"></table>
        <!-- <table schema="" tableName="sys_user"></table>
        <table schema="" tableName="sys_role"></table>
        <table schema="" tableName="sys_permission"></table>
        <table schema="" tableName="sys_user_role"></table>
        <table schema="" tableName="sys_role_permission"></table> -->
        
        <!-- 有些表的欄位需要指定java類型
         <table schema="" tableName="">
            <columnOverride column="" javaType="" />
        </table> -->
    </context>
</generatorConfiguration>

3.3使用Java類生成mapper文件

public class GeneratorSqlmap {

    public void generator() throws Exception{
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        //指定 逆向工程配置文件
        File configFile = new File("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();
        }
    }

}

 生成後的代碼:

3.4拷貝生成的mapper文件到工程中指定的目錄中

3.4.1mapper.xml

Mapper.xml文件拷貝至mapper目錄內

3.4.2mapper.java

Mapper.xml文件拷貝至mapper目錄內

註意:mapper.xml文件和mapper.java文件在一個目錄內且文件名相同。

3.4.3mapper介面測試

public class ItemsMapperTest {
    private ApplicationContext applicationContext;
    private ItemsMapper itemsMapper;
    
    @Before
    public void setUp(){
        applicationContext=new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
        itemsMapper=(ItemsMapper) applicationContext.getBean("itemsMapper");
    }
    
    @Test
    public void testInsert() {
        Items item=new Items();
        item.setName("手機");
        item.setPrice(999f);
     item.setCreatetime(new Date()); itemsMapper.insert(item); }
//自定義條件查詢 @Test public void testSelectByExample() { ItemsExample itemsExample=new ItemsExample(); //通過criteria構造查詢條件 ItemsExample.Criteria criteria=itemsExample.createCriteria(); criteria.andNameEqualTo("筆記本3"); //可能返回多條記錄 List<Items> list=itemsMapper.selectByExample(itemsExample); System.out.println(list); } //根據主鍵查詢 @Test public void testSelectByPrimaryKey() { Items items=itemsMapper.selectByPrimaryKey(1); System.out.println(items); } @Test public void testUpdateByPrimaryKey() { //對所有欄位進行更新,需要先查詢出來再更新 Items items=itemsMapper.selectByPrimaryKey(1); items.setName("水杯"); itemsMapper.updateByPrimaryKey(items); //如果傳入欄位不為空才更新,在批量更新中使用此方法,不需要先查詢再更新 itemsMapper.updateByPrimaryKeySelective(items); } }

4.逆向工程註意事項

4.1Mapper文件內容不覆蓋而是追加

XXXMapper.xml文件已經存在時,如果進行重新生成則mapper.xml文件內容不被覆蓋而是進行內容追加,結果導致mybatis解析失敗。

解決方法:刪除原來已經生成的mapper.xml文件再進行生成。

MyBatis自動生成的po和mapper.java文件不是內容追加而是直接覆蓋沒有此問題。

4.2 Table schema問題

下邊是針對Oracle資料庫表生成代碼的schema問題:

schema即資料庫模式,oracle中一個用戶對應一個schema,可以理解為用戶就是schema。當Oracle資料庫存在多個Schema可以訪問相同的表名時,使用mybatis生成該表的mapper.xml將會出現mapper內容重覆的問題,結果導致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

如果此文對您有幫助,微信打賞我一下吧~ 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • API(Application Programming Interface):應用程式編程介面 使用Scanner 獲取鍵盤錄入的字元串 next() ; 在遇到空格的時候 會判定為當前的輸入結束 空格之後的內容會收不到 nextLine(); 可以避免被空格中斷 , 但是在於接收數字一起使用的時候 ...
  • 枚舉是常用的功能,看看Python的枚舉. 枚舉的定義 註意: 定義枚舉時,成員名稱不允許重覆 預設情況下,不同的成員值允許相同。但是兩個相同值的成員,第二個成員的名稱被視作第一個成員的別名 如果枚舉中存在相同值的成員,在通過值獲取枚舉成員時,只能獲取到第一個成員 我們就獲得了Month類型的枚舉類 ...
  • 轉自:http://www.cnblogs.com/kristain/articles/2033566.html ...
  • 設計模式既上一篇關於單例模式後,終於要接著寫下去了,先來個最簡單的,簡單工廠模式,這個設計模式很簡單,也是最常用的(是不是好多東西都這樣,越簡單,門檻越低,越討人喜歡)。 概念(原諒我無恥的抄百度百科): 簡單工廠模式是屬於創建型模式,又叫做靜態工廠方法(Static Factory Method) ...
  • 一、動態代理概念 動態代理分為JDK動態代理和cglib動態代理兩種方式。 jdk動態代理是由Java內部的反射機制來實現的,cglib動態代理底層則是藉助asm來實現的。 總的來說,反射機制在生成類的過程中比較高效,而asm在生成類之後的相關執行過程中比較高效(可以通過將asm生成的類進行緩存,這 ...
  • 一、join()方法,官方描述 waits for this thread to die 等待當前線程死亡; 源碼: //無參,預設調用join(0) public final void join() throws InterruptedException { join(0); } //傳入兩時間m ...
  • MyBatis插件原理 從<plugins>解析開始 本文分析一下MyBatis的插件實現原理,在此之前,如果對MyBatis插件不是很熟悉的朋友,可參看此文MyBatis7:MyBatis插件及示例 列印每條SQL語句及其執行時間,本文我以一個例子說明瞭MyBatis插件是什麼以及如何實現。由於M ...
  • 首先,集群數需要基數,這裡搭建一個簡單的redis集群(6個redis實例進行集群)。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...