首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

SSM 框架整合實戰筆記(三):MyBatis 逆向工程自動生成代碼與完整測試流程

     編輯:Java 綜合教學

MyBatis Generator 逆向工程簡介

MyBatis Generator (MBG) 可根據數據庫表結構自動生成實體類、Mapper 接口、XML 映射文件,大幅減少樣板代碼編寫。本文記錄從插件安裝、配置、生成到代碼調整與整合測試的完整流程。

環境準備與插件安裝

  1. 下載 mybatis_generator_1.3.1.zip(或最新版)
  2. 關閉 MyEclipse/Eclipse,在安裝目錄下建立 `soft/mybatis` 文件夾,解壓 zip 內的 jar 包至該目錄
  3. 啟動 IDE,通過 Help > Install New Software > Add > Local 指向該目錄安裝 MBG 插件

核心配置文件:generatorConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "https://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!-- JDBC 驅動包位置(本地絕對路徑) -->
    <classPathEntry location="D:/Genuitec/MyEclipse 10/soft/mybatis/mysql-connector-java-5.1.26-bin.jar" />

    <context id="testTables" targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
            <property name="suppressDate" value="true" />
        </commentGenerator>

        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
            connectionURL="jdbc:mysql://localhost:3306/scm?useUnicode=true&amp;characterEncoding=UTF-8"
            userId="root" password="root">
        </jdbcConnection>

        <!-- 實體類生成位置 -->
        <javaModelGenerator targetPackage="cn.itcast.scm.entity" targetProject="scm/src">
            <property name="trimStrings" value="false" />
        </javaModelGenerator>

        <!-- Mapper XML 生成位置 -->
        <sqlMapGenerator targetPackage="cn.itcast.scm.dao" targetProject="scm/src" />

        <!-- Mapper 接口生成位置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="cn.itcast.scm.dao" targetProject="scm/src" />

        <!-- 目標表配置 -->
        <table tableName="account" domainObjectName="Account" />
        <table tableName="supplier" domainObjectName="Supplier" />
    </context>
</generatorConfiguration>

關鍵配置說明:

  • targetRuntime="MyBatis3":生成 MyBatis 3.x 風格代碼
  • suppressAllComments/Date:抑制生成的註釋與時間戳,避免版本控制噪音
  • trimStrings:是否自動 trim 字符串屬性,通常設為 false 由業務層處理
  • type="XMLMAPPER":生成 XML 映射文件 + 接口(而非純註解模式)
  • 重複生成警告: 同一表二次生成會產生重複屬性/方法,需手動刪除舊文件或在配置中註釋已生成的 ``

    數據庫準備腳本

    drop database if exists scm;
    create database scm default character set utf8;
    use scm;
    
    create table account (
        acc_id int not null auto_increment,
        acc_login varchar(20),
        acc_name varchar(20),
        acc_pass varchar(20),
        primary key (acc_id)
    );
    
    create table supplier (
        sup_id int not null auto_increment,
        sup_name varchar(20),
        sup_linkman varchar(20),
        sup_phone varchar(11),
        sup_address varchar(100),
        sup_remark varchar(200),
        primary key (sup_id)
    );
    
    insert into account (acc_login, acc_pass) values ('admin','admin'), ('admin2','admin2');
    insert into supplier (sup_name, sup_linkman, sup_phone, sup_address, sup_remark)
    values ('蘋果供應商','小張','12388888887','廣州花都','普通供應商'),
           ('三星供應商','小王','12388888888','廣州增城','普通供應商'),
           ('華為供應商','小王','12388888889','廣東深圳','一級供應商');

    生成代碼後的必要調整

    MBG 生成的代碼包含大量冗餘方法(如 `selectByExample`、`updateByPrimaryKeySelective` 等),實際項目中建議精簡保留業務需要的方法。

    1. 實體類精簡 - Account.java

    package cn.itcast.scm.entity;
    import java.io.Serializable;
    
    public class Account implements Serializable {
        private static final long serialVersionUID = -649693483437792411L;
        private Integer accId;
        private String accLogin;
        private String accName;
        private String accPass;
        // getter/setter 省略
        @Override
        public String toString() {
            return "Account [accId=" + accId + ", accLogin=" + accLogin + ", accName=" + accName + ", accPass=" + accPass + "]";
        }
    }

    2. Mapper 接口精簡 - AccountMapper.java

    package cn.itcast.scm.dao;
    import cn.itcast.scm.entity.Account;
    
    public interface AccountMapper {
        int insertAccount(Account record);  // 僅保留業務需要的方法
        // Account selectByPrimaryKey(Integer accId);  // 按需添加
    }

    3. Mapper XML 修正 - AccountMapper.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="cn.itcast.scm.dao.AccountMapper">
        <resultMap id="accountResultMap" type="cn.itcast.scm.entity.Account">
            <id column="acc_id" property="accId" jdbcType="INTEGER" />
            <result column="acc_login" property="accLogin" jdbcType="VARCHAR" />
            <result column="acc_name" property="accName" jdbcType="VARCHAR" />
            <result column="acc_pass" property="accPass" jdbcType="VARCHAR" />
        </resultMap>
    
        <insert id="insertAccount" parameterType="cn.itcast.scm.entity.Account">
            insert into account (acc_name) values (#{accName})
        </insert>
    </mapper>

    注意: MBG 生成的 `` 可能包含所有字段,需根據業務調整(如自增主鍵不插入、密碼加密處理等)。

    業務層代碼補全

    Service 接口與實現

    // AccountService.java
    public interface AccountService {
        int insertAccount(Account account) throws Exception;
    }
    
    // AccountServiceImpl.java
    @Service
    public class AccountServiceImpl implements AccountService {
        @Autowired
        private AccountMapper accountMapper;
    
        @Override
        public int insertAccount(Account account) throws Exception {
            return accountMapper.insertAccount(account);
        }
    }

    Controller

    @Controller
    @RequestMapping("/account")
    public class AccountAction {
        @Resource
        private AccountService accountService;
    
        @RequestMapping("/insert")
        public String insert(Account account) {
            try {
                accountService.insertAccount(account);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "forward:/jsp/main.jsp";
        }
    }

    前端測試頁面

    <%@ page language="java" pageEncoding="utf-8"%>
    <html><body>
    <form action="account/insert.action" method="post">
        管理員名稱:<input type="text" name="accName"><br>
        <input type="submit" value="ok">
    </form>
    </body></html>

    逆向工程最佳實踐總結

    階段關鍵動作避坑指南
    配置精確配置 JDBC URL、驅動包路徑、目標包路徑使用相對路徑或環境變量避免機器遷移失效
    生成按表生成,首次全量,後續增量註釋已生成表版本控制提交前審查生成代碼,刪除冗餘方法
    調整實體類去冗餘、Mapper 接口精簡、XML 修正 SQL保留 MBG 註釋標識(如 `@mbg.generated`)便於未來重新生成合併
    整合補全 Service/Controller、配置事務、驗證測試單元測試覆蓋 Mapper 方法,集成測試覆蓋完整鏈路

    MyBatis Generator 是加速開發的利器,但生成的代碼只是「骨架」,業務邏輯、驗證、異常處理、安全控制仍需開發者注入「血肉」。建立「生成→審查→精簡→測試」的標準化流程,才能真正發揮其價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved