實體對象
字典實體
@Data
@Alias("Dict")
public class SysDict {
// 字典代碼
private String dictCode;
// 字典名稱
private String dictName;
// 0系統 9解析
private Integer dictType;
// 字典項列表
private List<SysDictItem> dictItems;
}
字典項實體
@Data
@Alias("DictItem")
public class SysDictItem {
// 字典子項代碼
private String dictItemCode;
// 字典子項展示值
private String dictItemValue;
// 字典子項詳細描述
private String dictItemDesc;
// 自定義json字符串屬性
private Map<String, Object> itemAttrs;
// 將數據庫裏json字符串轉爲map對象
public void setItemAttrs(String itemAttrs) {
if (!StringUtils.isEmpty(itemAttrs)) {
// json字符串轉map
this.itemAttrs = MapperUtils.jsonToMap(itemAttrs);
}
}
}
Mapper文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.jaemon.app.mapper.SysDictMapper">
<resultMap id="DictResultMap" type="Dict">
<result column="dict_code" property="dictCode" jdbcType="VARCHAR" />
<result column="dict_name" property="dictName" jdbcType="VARCHAR" />
<collection property="dictItems" ofType="DictItem" select="queryDictById" column="{dictId=id}" />
</resultMap>
<select id="queryAllDict" resultMap="DictResultMap">
select sd.id, sd.dict_code, sd.dict_name
from sys_dict sd
where sd.dict_status = 1
</select>
<select id="queryDictById" resultType="DictItem">
select sdi.dict_item_code, sdi.dict_item_value, sdi.dict_item_desc, sdi.item_attrs
from sys_dict_item sdi
where sdi.item_status = 1 and sdi.dict_id = #{dictId}
</select>
</mapper>
resultMap標籤具體屬性含義解釋參見: Mybatis resultMap用法之系統菜單實現
輸出案例
{
"code": 0,
"msg": "成功",
"result": [
{
"dictCode": "houseStructure",
"dictName": "房屋結構",
"dictType": null,
"dictItems": [
{
"dictItemCode": "1",
"dictItemValue": "鋼筋混凝土結構",
"dictItemDesc": "鋼筋混凝土結構",
"itemAttrs": {
"left": "(",
"right": ")"
}
},
{
"dictItemCode": "2",
"dictItemValue": "磚混結構",
"dictItemDesc": "磚混結構",
"itemAttrs": null
},
{
"dictItemCode": "3",
"dictItemValue": "磚木結構",
"dictItemDesc": "磚木結構",
"itemAttrs": null
},
{
"dictItemCode": "4",
"dictItemValue": "簡易結構",
"dictItemDesc": "簡易結構",
"itemAttrs": null
}
]
}
]
}
數據庫
表結構
DROP TABLE IF EXISTS `sys_dict`;
CREATE TABLE `sys_dict` (
`id` bigint(18) NOT NULL AUTO_INCREMENT COMMENT '字典ID',
`dict_code` varchar(55) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典代碼',
`dict_name` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典名稱',
`dict_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '字典狀態\r\n0: 停用\r\n1: 啓用',
`dict_type` tinyint(4) NULL DEFAULT 0 COMMENT '字典類型(0-系統字典 5-公共 9-解析字典)',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `idx`(`dict_code`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 70 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系統-字典表' ROW_FORMAT = Dynamic;
DROP TABLE IF EXISTS `sys_dict_item`;
CREATE TABLE `sys_dict_item` (
`id` bigint(18) NOT NULL AUTO_INCREMENT COMMENT '字典子項id',
`dict_id` bigint(18) NOT NULL COMMENT '字典ID',
`dict_item_code` varchar(55) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典子項代碼',
`dict_item_value` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典子項展示值',
`dict_item_desc` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '字典子項描述',
`item_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '字典子項狀態\r\n0: 停用\r\n1: 啓用',
`item_attrs` varchar(1024) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '自定義json字符串屬性',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 283 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系統-字典子項表' ROW_FORMAT = Dynamic;
表數據
INSERT INTO `sys_dict` VALUES (1, 'houseStructure', '房屋結構', 1, 5);
INSERT INTO `sys_dict_item` VALUES (1, 1, '1', '鋼筋混凝土結構', '鋼筋混凝土結構', 1, '{\"left\": \"(\", \"right\": \")\"}');
INSERT INTO `sys_dict_item` VALUES (2, 1, '2', '磚混結構', '磚混結構', 1, NULL);
INSERT INTO `sys_dict_item` VALUES (3, 1, '3', '磚木結構', '磚木結構', 1, NULL);
INSERT INTO `sys_dict_item` VALUES (4, 1, '4', '簡易結構', '簡易結構', 1, NULL);
Mapper寫法2
<resultMap id="DictResultMap" type="Dict">
<result column="dict_code" property="dictCode" jdbcType="VARCHAR"/>
<result column="dict_name" property="dictName" jdbcType="VARCHAR"/>
<result column="dict_type" property="dictType" jdbcType="TINYINT"/>
<collection property="dictItems" resultMap="DictItemsMap"/>
</resultMap>
<resultMap id="DictItemsMap" type="DictItem">
<result column="dict_item_code" property="dictItemCode" jdbcType="VARCHAR"/>
<result column="dict_item_value" property="dictItemValue" jdbcType="VARCHAR"/>
<result column="dict_item_desc" property="dictItemDesc" jdbcType="VARCHAR"/>
</resultMap>
<select id="findDicts" resultMap="DictResultMap">
SELECT
dd.dict_code, dd.dict_name, dd.dict_type,
ddi.dict_item_code, ddi.dict_item_value, ddi.dict_item_desc
FROM sys_dict dd
LEFT JOIN sys_dict_item ddi ON dd.id = ddi.dict_id
WHERE dd.dict_status = 1 AND ddi.item_status = 1
<if test="dictCode != null">
AND dd.dict_code IN
<foreach collection="dictCodes" item="item" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</if>
ORDER BY dd.id, ddi.id
</select>
注意: 該方式由於用到一對多左連接, 所以不支持 sys_dict 級別的分頁