`
zhangxiong0301
  • 浏览: 359595 次
社区版块
存档分类
最新评论

mybatis中使用map类型参数,其中key为列名,value为列值

 
阅读更多

         

          最近有个需求,就是使用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里面随便引用)
当然在作为入参时可以使用@Param("params")来设置键,设置keyName后,list,array将会失效。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。举个例子:
如果User有属性List ids。入参是User对象,那么这个collection = "ids"
如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = "ids.id"

如果传入参数类型为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>

 

通过以上两步就动态的获取了列名,并对对应的列赋值。

分享到:
评论
1 楼 hmc52107521 2016-10-09  
你好,params.keys,params.values以及#{params[${key}]}  这种用法在哪个地方有说明,在官方网站上也没有看到有对应的详细说明,这种用法的来源是哪,麻烦给解答下,多谢了!

相关推荐

    Mybatis中注解@MapKey的使用详解

    在Mybatis框架中,@MapKey注解是一个非常实用的功能,它允许我们将查询结果转换成一个Map对象,其中键(key)由我们指定的字段值决定,值(value)则是查询返回的完整行数据。这在处理多条记录时特别有用,尤其是在结果...

    Map接收Mybatis的结果,字段1为Key,字段2为Val

    以上就是使用ResultHandler将MyBatis查询结果转换为Map,以字段1为Key,字段2为Value的具体实现步骤。这种方法允许我们更灵活地处理查询结果,尤其在需要快速查找特定字段对应值的情况下非常实用。

    springmybatis

    MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个...

    Mybatis多表查询.docx

    我们可以使用Map的Key值来获取对应的列名或参数名,并使用Map的value值来获取实际值。 使用Mybatis进行多表查询需要在实体类中添加对应对象或集合对象,并在Mapper文件中使用association或collection标签进行结果集...

    MyBatis3 教程 中文完整版

    MyBatis支持两种参数映射方式:传入一个Map对象,其中key是参数名,value是参数值;使用注解@Param标记参数。 6. **结果映射** 结果映射主要用于复杂的数据结构映射,例如一对一、一对多、多对多关系的映射,以及...

    Mybatis源码分析.docx

    在一级缓存中,Mybatis使用Map来存储缓存数据,其中Key是查询的参数,Value是查询结果。当Mybatis与Spring整合时,由于会话不同,会导致一级缓存失效,可以通过开启事务来解决这个问题。 二级缓存 二级缓存是...

    Mybatis3系列课程8-带参数查询

    6. Map类型参数:在某些复杂查询中,可能会使用Map作为参数,Key代表字段名,Value代表字段值。这种情况下,可以使用`&lt;foreach&gt;`标签遍历Map,生成对应的SQL条件。 7. 使用Example类:Mybatis-Plus等扩展库提供了...

    Mybatis中传递多个参数的4种方法总结

    本文将总结Mybatis中传递多个参数的4种方法,并且介绍了关于使用Mapper接口时参数传递方式。 方法1:顺序传参法 顺序传参法是Mybatis中传递多个参数的一种方法。该方法使用#{ }里的数字代表传入参数的顺序。例如,...

    MyBatis查询返回Map示例代码

    例如根据商品的code查询对应的分类的名字,需要返回一个map,key为商品code,value为商品分类对应的名称。以方便我们后续对结果集的处理。 在MyBatis中,我们可以使用ResultMap来指定查询结果的格式。在本例中,...

    MyBatis动态条件通用查询

    Map可以存储键值对,其中键(key)对应于数据库表中的字段名,值(value)则为该字段的查询条件。例如,如果Map包含键`name`和对应的值`John`,那么在生成的SQL语句中,将会包含`name = 'John'`这一条件。 动态SQL...

    mybatis-paramDemo.zip

    3. **Map参数**:MyBatis 支持使用 Map 作为方法参数,其中 key 为参数名,value 为参数值。在 SQL 映射文件中,可以直接使用 `&lt;select id="selectByMap" parameterType="java.util.Map" resultType=...

    MyBatis3.5.4官方文档.rar

    Map参数可以通过key-value方式传递,注解参数则通过在方法参数上使用@Param注解。 7. **结果映射** 结果映射用于将查询结果自动转换为Java对象。MyBatis支持自动类型匹配、自定义类型处理器以及一对一、一对多、多...

    测试mybatis里foreach用法

    对于Map类型的集合,我们可以使用`key`和`value`属性来访问键值对: ```xml SELECT * FROM users WHERE id IN &lt;foreach collection="idsMap" item="id" key="key" open="(" separator="," close=")"&gt; #{id} ...

    mybatis多个接口参数的注解使用方式(@Param)

    Map 方法的使用很简单,就是将对应的参数以 key-value 的方式存储,key 对应 SQL 中的参数名字,value 对应需要传入的参数值。例如,获取一段时间内存储的用户,可以使用 Map 方法来传递参数。 @Param 注解方法 @...

    Mybatish和Ajax笔记

    MyBatis 可以使用简单的 XML 或注解进行配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。 #### 二、MyBatis与Spring集成配置 **1. Web.xml配置** Web....

    springboot逆向生成mybatis

    首先,要使用MyBatis逆向生成功能,你需要在项目中引入MyBatis的依赖。在SpringBoot项目中,可以通过添加以下Maven依赖到`pom.xml`文件来实现: ```xml &lt;groupId&gt;org.mybatis.spring.boot &lt;artifactId&gt;mybatis-...

    mybatis开发步骤

    -- map作为参数时,#{id}里面的字段一定要map设置的key一致 --&gt; &lt;!-- 条件查询,返回值以键值对形式存在List&lt;Map,Object&gt;&gt;中 --&gt; select id,studentId,studentName from t_student where id=#{id} &lt;!-- 无...

    Spring+Mybatis框架 ModelAndView

    Spring 和 Mybatis 是两个在 Java Web 开发中广泛使用的开源框架。Spring 提供了一个全面的编程和配置模型,包括依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等,而 Mybatis 是一个轻量级的持久层框架,...

    Mybatis传递多个参数进行SQL查询的用法

    使用Map更灵活,适用于参数数量不固定或参数类型不一致的情况;而JavaBean则更易于代码的可读性和维护,当参数具有明确的业务含义时,创建相应的JavaBean类可以使代码结构更加清晰。 总结来说,MyBatis在处理多参数...

    mybatis-study.zip

    Map 参数则可以通过 key-value 方式传递参数;而 pojo 参数则会自动映射到 SQL 的占位符。 5. **结果映射**:MyBatis 提供了自动映射机制,可以将查询结果自动匹配到对应的 Java 类。同时,也可以通过 `&lt;resultMap&gt;...

Global site tag (gtag.js) - Google Analytics