最近有个需求,就是使用mybatis时,向mysql中插入数据,其参数为map类型,map里面的key为列名,而key对应的value是该列对应的列值;问题是每次插入mysql中数据行的部分列,即map里面key的值每次都不固定,在用mybatis时需要通过map的key作为列名。
基础知识
对于这类问题基本思路就是用foreach标签遍历map,因此需要看看foreach的知识。
foreach属性
item | 循环体中的具体对象。支持属性的点路径访问,如item.age,item.info.details。 具体说明:若collection属性为list或array,则item代表list或array里面的一个元素。若collection属性对应一个map,则item代表的是map中的value集合中的单个value 该参数为必选。 |
collection |
foreach遍历的对象,作为入参时,List对象默认用list代替作为键,数组对象有array代替作为键,Map对象没有默认的键。也就是传入的集合(list,array,map)的名字,这个名字可以在foreach里面随便引用) 如果传入参数类型为map,这个入参有注解@Param("params"),则map的所有的key集合可以写成params.keys,所有值集合可以写成params.values。这样foreach就可以对key集合或值集合进行迭代了。 上面只是举例,具体collection等于什么,就看你想对那个元素做循环。 |
separator | 元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。 |
open | foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选。 |
close | foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。 |
index | 在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。 |
实现
有了以上基础就可以实现我们想要的功能:
首先,在mapper对应的dao中使用@param注解,显式指定集合参数类的别名(列表和数组有默认的别名list和array):
public interface CrawDao { public void saveNewNews(@Param("params")Map<String, String> params); }
第二步,在mapper的xml文件里对map的key进行迭代:
<?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="us.codecraft.webmagic.dao.CrawDao"> <insert id="saveNewNews" parameterType="java.util.Map"> insert ignore into tb_news <foreach collection="params.keys" item="key" open="(" close=")" separator="," > ${key} </foreach> values <foreach collection="params.keys" item="key" open="(" close=")" separator=","> #{params[${key}]} </foreach> </insert> </mapper>
通过以上两步就动态的获取了列名,并对对应的列赋值。
相关推荐
SpringBoot+Mybatis,返回Map的时候,将Map内的Key转换为驼峰的命名
但是mybatis默认封装的map是将字段作为map的key,字段对应的值作为map的值,sql查出一条数据可以,但是有多个结果集,就不能单纯用map来接收了,必须使用List<Map>来接收,循环然后map.get,封装成map,见下图,无疑...
mybatis的原身是ibatis,现在已经脱离了apache基金会。这篇文章主要介绍了Mybatis中注解@MapKey的使用的相关资料,需要的朋友可以参考下
今天小编就为大家分享一篇关于mybatis动态sql之Map参数的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
主要实现向mybatis传入一个表名、map集合、页数、行数,然后实现将map的key作为查询字段名,value作为相应字段值的通用分页查询操作。
目录 使用场景 动态标签 if标签 where标签 choose、when、otherwise 标签 ...if标签通常用那个胡where语句,update语句,insert语句中,通过判断参数值来决定是否使用某个查询条件,判断是否更新某一个字段或插入某个字段
Mybatis中执行String类型的自己拼写的sql,不执行配置文件中的sql mybatis sql connection mybatis中使用sql,不实用配置文件中的sql实例
主要介绍了mybatis使用char类型字段查询oracle数据库时结果返回null问题的解决方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
mybatis简单使用mybatis简单使用demomybatis简单使用demomybatis简单使用demomybatis简单使用demomybatis简单使用demomybatis简单使用demomybatis简单使用demomybatis简单使用demomybatis简单使用demomybatis简单...
MyBatis拦截器分页与动态修改SQL及其参数值 提取SQL Like 字段
mybatis中操作json类型数据(csdn)————程序
下面小编就为大家带来一篇MyBatis拦截器:给参数对象属性赋值的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Mybatis 处理 CLOB、BLOB 类型数据
mybatis中文离线文档
Mybatis Log(自动填充sql参数打印到控制台)
非常好用的,就是你们所要的 Mybatis日志参数快速替换占位符 sql参数替换工具html
MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个...
今天小编就为大家分享一篇关于MyBatis Map结果的Key转为驼峰式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧