1. 程式人生 > >MyBatis對整合多個表的類的操作

MyBatis對整合多個表的類的操作

前言

前幾天在實現oj的DAO層時,由於將problem表中的一些欄位拿出來做了字典表,導致了資料庫表過多,如果還是像以前一樣:
一個數據庫表對應一個實體類的話,這樣不僅會增加好多重複性的工作,還會使得邏輯層的編寫變得複雜。

解決方法

於是,我們將關聯密切的表整合為一個實體類,這樣來簡化DAO層的實現。下面就來看看DAO層是如何實現的吧。

資料庫的關聯表

這裡我對題目字典表做了簡化。

CREATE TABLE `dict_problem` (
  `id` int(10) NOT NULL auto_increment COMMENT 'ID',
  `problemAlgorithmId`
int(11) DEFAULT NULL COMMENT '演算法字典表ID', `problemStructureId` int(11) DEFAULT NULL COMMENT '資料結構字典表ID', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT = 1001 DEFAULT CHARSET=utf8 COMMENT='題目字典表';
CREATE TABLE `dict_problem_algorithm` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `type`
varchar(50) DEFAULT NULL COMMENT '演算法的型別', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='演算法字典表';
CREATE TABLE `dict_problem_structure` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `type` varchar(50) DEFAULT NULL COMMENT '資料結構的型別',
  PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT
CHARSET=utf8 COMMENT='資料結構字典表';

對應的實體類

public class Problem extends BasicVo{
    private int id;                         //ID
    private String problemAlgorithm;      //演算法字典表
    private String problemStructure;      //資料結構字典表
    //下面省略了建構函式和get,set方法...
}

插入操作

插入需要傳入一個Problem的物件,然後dict_problem表進行插入操作,(預設演算法字典表,資料結構字典表的資料已存在)
//通過insert...set來實現

<insert id="save" parameterType="Problem" >
        insert into dict_problem SET
        problemAlgorithmId = (SELECT id FROM dict_problem_algorithm WHERE dict_problem_algorithm.type = #{problemAlgorithm} ),
        problemStructureId = (SELECT id FROM dict_problem_structure WHERE dict_problem_structure.type = #{problemStructure} )
</insert>

查詢操作

根據條件將查詢的資訊放入Problem物件。
<select id="listBatch" resultType="Problem">
        select 
            p.id,
            a.type as problemAlgorithm,
            s.type as problemStructure 
        from dict_problem as p
        inner join dict_problem_algorithm as a on p.problemAlgorithmId=a.id
        inner join dict_problem_structure as s on p.problemStructureId=s.id
        <where>
            根據Problem的其他欄位進行篩選。
        </where>
        limit #{param2},#{param3}
    </select>