添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
List<User> list = new ArrayList<User>();
......
dao.saveWithKey("com.test.mapper.TestMapper.addUsers", list);

Mapper中:

<insert id="addUsers" parameterType="java.util.List">
  insert into test_user(name, age) values
    <foreach collection="list" item="item" separator=",">
       (#{item.name}, #{item.age})
    </foreach>
</insert>


2、基础对象集合(单字段),作为条件:

service中的代码:

List<String> ids = Arrays.asList(param.split(","));
return dao.getList("com.test.mapper.TestMapper.getUsers", ids);

Mapper中:

<select id="getUsers" parameterType="java.util.List" resultType="java.util.Map">
    select * from test_table  where is_deleted = 0
        <if test="list != null">
            and id in
                <foreach collection="list" item="item" open="(" close=")" separator=",">
                    #{item}
                </foreach>
</select>

3、list(单字段)作为其中一个参数,例如查询条件有3个:beginTime, endTime, list,其中list是一个List<String>

service中代码:

List<String> names= getUserNames();
Map<String, Object> params = new HashMap<String, Object>();
params.put("beginTime", beginTime);
params.put("endTime", endTime);
params.put("names", names);
dao.getList("com.test.mapper.TestMapper.getUsers", params);

Mapper中代码:

<select id="getUsers" resultType="java.util.HashMap">
   select * from test_user
   <where>
      <if test="list != null">
          and name IN
             <foreach collection="list" item = "item" separator="," open="(" close=")">
                  #{item}
             </foreach>
      <if test="beginTime!=null and beginTime != ''">
          and create_time <![CDATA[ >=]]>#{beginTime}
      <if test="endTime !=null and endTime != ''"> 
          and create_time <![CDATA[ <=]]>#{endTime}	
   </where>		    	 
</select>

<foreach>中各个属性的含义:

collection:指定要遍历的集合:  

List类型的参数会特殊处理封装在map中,map的key就叫list ;

item:将当前遍历出的元素赋值给指定的变量 ;

separator:每个元素之间的分隔符 ;

open:遍历出所有结果拼接一个开始的字符 ;

close:遍历出所有结果拼接一个结束的字符 ;

index:索引。遍历list的时候是index就是索引,item就是当前值 ;

遍历map的时候index表示的就是map的key,item就是map的值;

使用场景 在实际开发过程,我们往往需要编写复杂的SQL语句,拼接稍有不注意就会导致错误,Mybatis给开发者提供了动态SQL,大大降低了拼接SQL导致的错误。 动态标签 if标签通常用那个胡where语句,update语句,insert语句,通过判断参数值来决定是否使用某个查询条件,判断是否更新某一个字段或插入某个字段 foreach 也就是遍历迭代,在SQL通常用在 in 这个关键词的后面 foreach元素的属性主要有item,index,collection,open,separator,close。 分别代表: item表示集合每一个元素进行迭代时的别名, index用于表示在迭代过程,每次迭代到的位置, open表示该语句以什么开始, separator表示在每次进行迭代之间以什么符号作为分隔符, close表示以什么结束 代码片段: <selectid="select... MyBatis提供foreach语句实现In查询。foreach语法如下:collection:该属性的对应方法的参数类型可以是List、数组、Map。如果方法的参数类型不属于前三种,则必须和方法参数@Param指定的元素名一致。item: 表示迭代过程每个元素的别名。可以随便起名,但是必须跟元素的#{}里面的名称一致。index:表示迭代过程每次迭代到的位置(下标)open:前缀close:后缀separator:分隔符,表示迭代时每个元素之间以什么分隔。 Mybatisforeach用法----List、Array、Map三种类型遍历在mybatis的xml文件构建动态sql语句时,经常会用到标签遍历查询条件。特此记录下不同情况下书写方式!-------仅供大家参考------1. foreach元素的属性collection: 需做foreach(遍历)的对象,作为入参时,list、array对象时,collection属性值分别默认用"li... 我们学习了如何使用 Mybatisif、where、trim等动态语句来处理一些简单的查询操作。对于一些 SQL 语句含有 in 条件,需要迭代条件集合来生成的情况,可以使用 foreach 来实现 SQL 条件的迭代 Mybatis foreach 标签用于循环语句,它很好的支持了数据和 List、set 接口的集合,并对此提供遍历的功能。语法格式如下。 • <foreach item="item" index="index" collection="list|array|map key.. mybatis if test判断 list不为空及foreach的用法, <if test="orderIdList != null and orderIdList.size() != 0"> and order_id in <foreach item='order_id' collection='orderIdList' open='(' separator=',' close=')' > #{order_id} </foreach> mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。 1、statement直接定义使用动态SQL: 在statement利用if 和 where 条件组合达到我们的需求,通过一个例子来说明: 原SQL语句:<select id="findUserByUserQuveryVo" parameterType ="UserQueryVo" result if 标签 if标签有一个test属性,test属性值是一个符合OGNL要求的判断表达式,表达式的结果可以使true或者false, 除此之外所有的非0值都为true (1)、数字类型 1.1 例如: 如果参数为数字类型的时候没有特俗需求的情况只需要判断是否为null即可。 <if test="id != null"></if> 1.2 例如:如果有特俗需求,例如判断是否大于某个数的时候才行。只需要加上对应的条件判断即可。 <if test='id != null an foreach 属性介绍foreach 用于迭代传入过来的参数。它的属性介绍分别是collection:表示传入过来的参数的数据类型。该参数为必选。要做 foreach 的对象,作为入参时,List 对象默认用 list 代替作为键,数组对象有 array 代替作为键,Map 对象没有默认的键。当然在作为入参时可以使用 @Param(“keyName”) 来设置键,设置 keyName 后,lis... foreach元素的属性主要有 item,index,collection,open,separator,close。 item表示集合每一个元素进行迭代时的别名. index指 定一个名字,用于表示在迭代过程,每次迭代到的位置. open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符. close表示以什么结束.foreach : 用的地方为:保存 在使用mybatis过程,<foreach>标签算是比较常用的,最近在项目遇到这样一个问题,使用<foreach>标签循环拼接SQL语句时,报了一个错误: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘__frch_name_0’ in ‘class com.stand.modules.address.