1、使用场景
因为最近在做项目过程之中需要给一个课程的资源(视频、文档),做标签的添加、编辑操作。下面分别对添加和编辑操作需要做哪些事情做做以下相关的描述以供大家探讨。
有一种简单粗暴的实现方法:
每次都是先删除,后增加;本人对此方式比较反对,这样MySQL数据库能在没有操作或者操作很少的情况产生大量Binlog日志。
如果针对添加删除进行最简单粗暴方式 直接先删除后添加将会有以下几点弊端
(1)、如果前端未做任何操作 讲执行一次批量删除操作和批量写入操作,于是就产生2份binlog日志
但是实际情况 数据库根本无需做任何操作的。
(2)、如果仅仅只取消了一条记录 本身只需做一条删除操作,结果也会执行先删除后增加
(3)、如果访问量巨大,将导致数据的IO访问瓶颈
binlog 基本认识
MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。
一般来说开启二进制日志大概会有1%的性能损耗(参见MySQL官方中文手册 5.1.24版)。二进制有两个最重要的使用场景:
其一:MySQL Replication在Master端开启binlog,Mster把它的二进制日志传递给slaves来达到master-slave数据一致的目的。
其二:自然就是数据恢复了,通过使用mysqlbinlog工具来使恢复数据。
二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。
以下是本人的实现思路:
标签添加:
1、标签可能来至两类:1.1 可以从已经存在的标签之中选择一个(使用类似于AutoSuggest组件),1.2、可能是自己新输入的标签。
2、针对选择已经输入的标签或者新增加的标签,新增的标签存储在标签标签之中,返回标签(newTagId),然后与选择的已有的标签(selectedTagId),然后在存储在 资源与标签表的对应关系表之中。建立对应关系。
新建资源标签 操作流程图如下所示:
编辑资源标签的 操作流程图如下所示:
本人是建议前端使用Vue组件 https://voerro.github.io/vue-tagsinput/ 后来由于前端无法研究如何调用选择后的方法,放弃使用此控件,我本人是力推的。
2、实现方法
2.1 主要针对删除资源标签关系过程之中需要设计 多参数传入后端。需要传递如下两个参数 资源id,删除的标签idList
于是乎设计传递过个参数到后端的MyBatis之中具体实现代码如下:
/**
* 获得资源标签结果
* @param param
* @return
*/
List<Map<String, Object>> getAutoSuggetEnclosureTagList(Map<String, Object> param);
/**
*批量添加资源标签到标签表之中
* @param tagList
* @return
*/
int addBatchEnclosureTagList(List<Map<String, Object>> tagList);
/**
* 批量添加资源与资源标签的关系的记录
* @param enclosureTagList
* @return
*/
int addBatchEnclosureTagRelationList(List<Map<String, Object>> enclosureTagList);
/**
if(deleteTagList.size()>0){
List<Long> deleteTagIdList=new ArrayList<Long>();
for(Map<String, Object> itemMap:deleteTagList) {
Long delTagId=Long.parseLong(itemMap.get("id").toString());
deleteTagIdList.add(delTagId);
}
Map<String, Object> deleteTagRelationParams=new HashMap<String, Object>();
deleteTagRelationParams.put("resourceId", courseEnclosure.getId());
deleteTagRelationParams.put("deleteTagIdList", deleteTagIdList);
deleteBatchEnclosureTagRelationList(deleteTagRelationParams);
}
* 删除资源标签关系表之中相关信息
* @param deleteTagRelationParams
* @return
*/
int deleteBatchEnclosureTagRelationList(Map<String, Object> deleteTagRelationParams);
<!-- 获得可选的资源标签搜索 -->
<select id="getAutoSuggetEnclosureTagList" resultType="hashmap" parameterType="hashmap">
SELECT
t.id,
t.tag_descn as tagName
FROM
tag AS t
WHERE
t.tag_category IS NULL
AND t.owner_company =#{ownerCompany}
<if test='searchContent != null and searchContent != ""'>
AND t.tag_descn LIKE CONCAT('%',#{searchContent},'%')
</if>
ORDER BY t.id ASC
</select>
<!-- 批处理添加资源对应的标签记录 -->
<insert id="addBatchEnclosureTagList" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
INSERT INTO tag
(tag_descn,org_id,owner_company,creator_id,create_time,modify_id,modify_time)
SELECT * from
<foreach collection="list" item="item" index="index" open="(" close=")" separator="union all">
(SELECT #{item.tagName} as tagName,#{item.orgId} as orgId,
#{item.ownerCompany} as ownerCompany,#{item.creatorId} as creatorId,
#{item.createTime} as createTime,#{item.modifyId} as modifyId,#{item.modifyTime} as modifyTime
FROM DUAL)
</foreach> b
</insert>
<!-- 批处理添加资源与标签相关的关系表 记录 -->
<insert id="addBatchEnclosureTagRelationList" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
INSERT INTO course_enclosure_tag
(resource_id,tag_id,org_id,owner_company,creator_id,create_time,modify_id,modify_time)
SELECT * from
<foreach collection="list" item="item" index="index" open="(" close=")" separator="union all">
(SELECT #{item.resourceId} as resourceId,#{item.tagId} as tagId,
#{item.orgId} as orgId,#{item.ownerCompany} as ownerCompany,#{item.creatorId} as creatorId,
#{item.createTime} as createTime,#{item.modifyId} as modifyId,#{item.modifyTime} as modifyTime
FROM DUAL)
</foreach> b
</insert>
<!-- 批量删除 课程资源标签 -->
<delete id="deleteBatchEnclosureTagRelationList" parameterType="hashmap">
delete from course_enclosure_tag where resource_id=#{resourceId} AND tag_id in
<foreach collection="deleteTagIdList" item="tagId" separator="," open="(" close=")">
#{tagId}
</foreach>
</delete>
3、实现成果