最近有个需求,就是使用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>
通过以上两步就动态的获取了列名,并对对应的列赋值。
相关推荐
在Mybatis框架中,@MapKey注解是一个非常实用的功能,它允许我们将查询结果转换成一个Map对象,其中键(key)由我们指定的字段值决定,值(value)则是查询返回的完整行数据。这在处理多条记录时特别有用,尤其是在结果...
以上就是使用ResultHandler将MyBatis查询结果转换为Map,以字段1为Key,字段2为Value的具体实现步骤。这种方法允许我们更灵活地处理查询结果,尤其在需要快速查找特定字段对应值的情况下非常实用。
MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个...
我们可以使用Map的Key值来获取对应的列名或参数名,并使用Map的value值来获取实际值。 使用Mybatis进行多表查询需要在实体类中添加对应对象或集合对象,并在Mapper文件中使用association或collection标签进行结果集...
MyBatis支持两种参数映射方式:传入一个Map对象,其中key是参数名,value是参数值;使用注解@Param标记参数。 6. **结果映射** 结果映射主要用于复杂的数据结构映射,例如一对一、一对多、多对多关系的映射,以及...
在一级缓存中,Mybatis使用Map来存储缓存数据,其中Key是查询的参数,Value是查询结果。当Mybatis与Spring整合时,由于会话不同,会导致一级缓存失效,可以通过开启事务来解决这个问题。 二级缓存 二级缓存是...
6. Map类型参数:在某些复杂查询中,可能会使用Map作为参数,Key代表字段名,Value代表字段值。这种情况下,可以使用`<foreach>`标签遍历Map,生成对应的SQL条件。 7. 使用Example类:Mybatis-Plus等扩展库提供了...
本文将总结Mybatis中传递多个参数的4种方法,并且介绍了关于使用Mapper接口时参数传递方式。 方法1:顺序传参法 顺序传参法是Mybatis中传递多个参数的一种方法。该方法使用#{ }里的数字代表传入参数的顺序。例如,...
例如根据商品的code查询对应的分类的名字,需要返回一个map,key为商品code,value为商品分类对应的名称。以方便我们后续对结果集的处理。 在MyBatis中,我们可以使用ResultMap来指定查询结果的格式。在本例中,...
Map可以存储键值对,其中键(key)对应于数据库表中的字段名,值(value)则为该字段的查询条件。例如,如果Map包含键`name`和对应的值`John`,那么在生成的SQL语句中,将会包含`name = 'John'`这一条件。 动态SQL...
3. **Map参数**:MyBatis 支持使用 Map 作为方法参数,其中 key 为参数名,value 为参数值。在 SQL 映射文件中,可以直接使用 `<select id="selectByMap" parameterType="java.util.Map" resultType=...
Map参数可以通过key-value方式传递,注解参数则通过在方法参数上使用@Param注解。 7. **结果映射** 结果映射用于将查询结果自动转换为Java对象。MyBatis支持自动类型匹配、自定义类型处理器以及一对一、一对多、多...
对于Map类型的集合,我们可以使用`key`和`value`属性来访问键值对: ```xml SELECT * FROM users WHERE id IN <foreach collection="idsMap" item="id" key="key" open="(" separator="," close=")"> #{id} ...
Map 方法的使用很简单,就是将对应的参数以 key-value 的方式存储,key 对应 SQL 中的参数名字,value 对应需要传入的参数值。例如,获取一段时间内存储的用户,可以使用 Map 方法来传递参数。 @Param 注解方法 @...
MyBatis 可以使用简单的 XML 或注解进行配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。 #### 二、MyBatis与Spring集成配置 **1. Web.xml配置** Web....
首先,要使用MyBatis逆向生成功能,你需要在项目中引入MyBatis的依赖。在SpringBoot项目中,可以通过添加以下Maven依赖到`pom.xml`文件来实现: ```xml <groupId>org.mybatis.spring.boot <artifactId>mybatis-...
-- map作为参数时,#{id}里面的字段一定要map设置的key一致 --> <!-- 条件查询,返回值以键值对形式存在List<Map,Object>>中 --> select id,studentId,studentName from t_student where id=#{id} <!-- 无...
Spring 和 Mybatis 是两个在 Java Web 开发中广泛使用的开源框架。Spring 提供了一个全面的编程和配置模型,包括依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等,而 Mybatis 是一个轻量级的持久层框架,...
使用Map更灵活,适用于参数数量不固定或参数类型不一致的情况;而JavaBean则更易于代码的可读性和维护,当参数具有明确的业务含义时,创建相应的JavaBean类可以使代码结构更加清晰。 总结来说,MyBatis在处理多参数...
Map 参数则可以通过 key-value 方式传递参数;而 pojo 参数则会自动映射到 SQL 的占位符。 5. **结果映射**:MyBatis 提供了自动映射机制,可以将查询结果自动匹配到对应的 Java 类。同时,也可以通过 `<resultMap>...