MyBatis對整合多個表的類的操作
阿新 • • 發佈:2019-01-08
前言
前幾天在實現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>