时间:2023-01-20 09:33:58 | 栏目:JAVA代码 | 点击:次
<?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"> <!--namespace必须是接口的全类名 --> <mapper namespace="com.genius"> <!-- 1.0 查询表结构是否存在 --> <select id="selectOne" parameterType="java.util.HashMap" resultType="java.util.HashMap"> select count(*) as num from ${tableName} where seq = #{seq}; </select> <!-- 1.1 插入一条数据 --> <insert id="insertOne" parameterType="java.util.Map"> insert into ${tableName} <foreach collection="content.keys" item="key" open="(" close=")" separator=","> ${key} </foreach> values <foreach collection="content.values" item="value" open="(" close=")" separator=","> #{value} </foreach> </insert> <!-- 1.2 更新记录 --> <update id="updateOne" parameterType="java.util.Map"> UPDATE ${tableName} SET <foreach collection="content.keys" item="key" open="" close="" separator=","> ${key} = #{content[${key}]} </foreach> where seq = #{content[seq]} and genius_uid <= #{content[genius_uid]}; </update> <!-- 1.3 删除无效数据 --> <delete id="deleteOne" parameterType="java.util.Map"> delete from ${tableName} where seq = #{content[seq]}; </delete> </mapper>
SqlSession session = MyBatisConnectionFactory.getSession("pg"); HashMap<String, Object> params = new HashMap<>(); //传入的参数 params.put("content", tableContent); params.put("tableName", tableName); params.put("seq", seq); int flag = session.delete("deleteOne", params); //删除记录 HashMap<String, Object> map = session.selectOne("selectOne", params); //查询记录是否存在 flag = session.update("updateOne", params) > 0 ? true : false; //更新 flag = session.insert("insertOne", params) > 0 ? true : false; //新增
最近做东西,需要向数据库存储一个保存在HashMap的key和value中的数据。具体的结构大致是Map<Object, Set<String>>。
数据库中需要保存两个个字段:1.key中对象的id,set中的多个string,显然id和set中的string是1对多的关系;需要嵌套循环。
一开始怀疑Mybatis能否做到这样灵活sql,经过尝试,证明了Mybatis的强大。
<insert id="saveMatchResult" > INSERT INTO sp4_acl_so (acl_id, so_uuid__proc_def_id) <foreach collection="aclDeviceMap.keys" index="index" item="item" separator="UNION ALL"> <foreach collection="aclDeviceMap[item]" index="index_set" item="set" separator="UNION ALL"> SELECT #{item.aclId}, #{set} FROM DUAL </foreach> </foreach> </insert>
aclDeviceMap
:就是在接口中使用@Param("aclDeviceMap")标注了变量aclDeviceMap.keys可以取到所有的key,遍历。
aclDeviceMap[item]类似aclDeviceMap.get("key")取当前key对应的value值。由于value是set所以还需要遍历。
结果保存成功。再次膜拜强大的Mybatis。