SSM 實戰項目①丨圖書管理系統 丨(3) MyBatis Generator 拓展:支持多表聯合操作

mbg

本篇隸屬於《SSM 實戰項目①丨圖書管理系統 》

詳情請見:SSM 實戰項目①丨圖書管理系統 丨(0) 項目概要及本系列介紹


1. 使用 MBG 生成相關文件

SSM 實戰項目①丨圖書管理系統 丨(2) MyBatis Generator 的基本使用

image-20200606112240284

2. 明確目標

  • 查看數據庫表

    reader_tbl 中有 operator_id 屬性,對應到 manager_tbl,我們希望在查詢 reader 信息的時候,順帶把 manager 的信息也查詢到。

image-20200606112045169

3. 對 Reader 實體類進行改造

//1. 添加一個 Manager 屬性,用作聯合查詢
private Manager manager;


//2. 爲 manger 屬性生成 getter 和 setter 方法
public Manager getManager() {
    return manager;
}

public void setManager(Manager manager) {
    this.manager = manager;
}


//3. 生成無參構造函數
public Reader() {
}

//4. 生成有參構造函數(不要帶上 manager)
public Reader(Integer readerId, String readerName, String readerGender, String readerBarcode, String readerProfession, Date readerBirth, String readerDocumentType, String readerDocumentNumber, String readerEmail, Date readerRegisterDate, Integer borrowedBookCount, Integer remainingBookCount, Integer operatorId) {
    this.readerId = readerId;
    this.readerName = readerName;
    this.readerGender = readerGender;
    this.readerBarcode = readerBarcode;
    this.readerProfession = readerProfession;
    this.readerBirth = readerBirth;
    this.readerDocumentType = readerDocumentType;
    this.readerDocumentNumber = readerDocumentNumber;
    this.readerEmail = readerEmail;
    this.readerRegisterDate = readerRegisterDate;
    this.borrowedBookCount = borrowedBookCount;
    this.remainingBookCount = remainingBookCount;
    this.operatorId = operatorId;
}
//5. 生成 toString()方法:帶上 manager(注意,manager實體類也要加上 toString()方法)
@Override
public String toString() {
  return "Reader{" +
    "readerId=" + readerId +
    ", readerName='" + readerName + '\'' +
    ", readerGender='" + readerGender + '\'' +
    ", readerBarcode='" + readerBarcode + '\'' +
    ", readerProfession='" + readerProfession + '\'' +
    ", readerBirth=" + readerBirth +
    ", readerDocumentType='" + readerDocumentType + '\'' +
    ", readerDocumentNumber='" + readerDocumentNumber + '\'' +
    ", readerEmail='" + readerEmail + '\'' +
    ", readerRegisterDate=" + readerRegisterDate +
    ", borrowedBookCount=" + borrowedBookCount +
    ", remainingBookCount=" + remainingBookCount +
    ", operatorId=" + operatorId +
    ", manager=" + manager +
    '}';
}

4. 改造 ReaderMapper.xml

PS:這裏進行改造的時候,我們可以參考 MBG 自動生成的部分,然後進行添加改造既即可,如下:

[1] 新增一個帶 manager 的結果集
<resultMap id="ResultMapWithManager" type="com.bean.Reader">
  <id column="reader_id" jdbcType="INTEGER" property="readerId" />
  <result column="reader_name" jdbcType="VARCHAR" property="readerName" />
  <result column="reader_gender" jdbcType="VARCHAR" property="readerGender" />
  <result column="reader_barcode" jdbcType="VARCHAR" property="readerBarcode" />
  <result column="reader_profession" jdbcType="VARCHAR" property="readerProfession" />
  <result column="reader_birth" jdbcType="TIMESTAMP" property="readerBirth" />
  <result column="reader_document_type" jdbcType="VARCHAR" property="readerDocumentType" />
  <result column="reader_document_number" jdbcType="VARCHAR" property="readerDocumentNumber" />
  <result column="reader_email" jdbcType="VARCHAR" property="readerEmail" />
  <result column="reader_register_date" jdbcType="TIMESTAMP" property="readerRegisterDate" />
  <result column="borrowed_book_count" jdbcType="INTEGER" property="borrowedBookCount" />
  <result column="remaining_book_count" jdbcType="INTEGER" property="remainingBookCount" />
  <result column="operator_id" jdbcType="INTEGER" property="operatorId" />
  <!--指定聯合查詢帶出管理員的信息-->
  <association property="manager" javaType="com.bean.Manager">
    <id column="manager_id" property="managerId"></id>
    <result column="manager_name" property="managerName"></result>
  </association>
</resultMap>

image-20200606113205503

[2] 新增一個帶管理員信息的屬性集
<sql id="Column_List_With_Manager">
  r.reader_id, r.reader_name, r.reader_gender, r.reader_barcode, r.reader_profession, r.reader_birth,
  r.reader_document_type, r.reader_document_number, r.reader_email, r.reader_register_date,
  r.borrowed_book_count, r.remaining_book_count, r.operator_id, m.manager_id, m.manager_name
</sql>

image-20200606113116365

[3] 新增兩個查詢信息附帶管理員的方法
<select id="selectByExampleWithManager" parameterType="com.bean.ReaderExample" resultMap="ResultMapWithManager">
  select
  <if test="distinct">
    distinct
  </if>
  <include refid="Column_List_With_Manager" />
  FROM reader_tbl r
  LEFT JOIN manager_tbl m ON r.operator_id = m.manager_id
  <if test="_parameter != null">
    <include refid="Example_Where_Clause" />
  </if>
  <if test="orderByClause != null">
    order by ${orderByClause}
  </if>
</select>
<select id="selectByPrimaryKeyWithManager" parameterType="java.lang.Integer" resultMap="ResultMapWithManager">
  select
  <include refid="Column_List_With_Manager" />
  FROM reader_tbl r
  LEFT JOIN manager_tbl m ON r.operator_id = m.manager_id
  where reader_id = #{readerId,jdbcType=INTEGER}
</select>

image-20200606113445634

5. 在 dao 層接口 ManagerMapper.java 添加對應的方法

//新增兩個方法:帶上管理員
List<Reader> selectByExampleWithManager(ReaderExample example);
Reader selectByPrimaryKeyWithManager(Integer readerId);

這裏就改造完成了。

6. 測試

編寫一個測試類,調用 mapper 接口中的方法即可測試,下面舉例:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class MapperTest {

    @Autowired
    ReaderMapper readerMapper;

    @Test
    public void mapperTest(){
      //調用 readerMapper 中的 selectByPrimaryKeyWithManager,查看控制檯信息,檢查是否實現了聯合查詢
        Reader reader = readerMapper.selectByPrimaryKeyWithManager(10);
        System.out.println(reader);
    }
}

輸出結果:

Reader{readerId=10, readerName='邱籌媽', readerGender='男', readerBarcode='ab1eb7a', readerProfession='學生', readerBirth=Sun Oct 05 11:00:00 CST 2003, readerDocumentType='學生證', readerDocumentNumber='2018302178736', readerEmail='[email protected]', readerRegisterDate=Fri May 29 11:00:00 CST 2020, borrowedBookCount=0, remainingBookCount=10, operatorId=4, manager=Manager{managerId=4, managerName='張XX', managerPwd='null'}}

測試成功。


有紕漏之處,還望不吝指出~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章