一、一个参数(对象)

1.1、只有一个参数一个值时,使用 #{value}

在动态SQL中,如果只有一个参数时,在xml文件中使用 #{ value }

Mapper 接口:

public interface UserMapper{
	public List<SysUser> getUserList(String name);  
}

mapper.xml :

<select id="getUserList" parameterType="java.lang.String" resultType="SysUser">
  select t.* from sys_user  t where t.name= #{value}
</select>  

1.2、Map 封装的一个参数多个值:

这个是最常见的,不多说了。

示例1:

数据对象:

HashMap <String, Object> params = new HashMap<String, Object>();
params.put("id", "1234");
params.put("code ", "ABCD");

Mapper 接口:

public interface UserMapper{
	public List<SysUser>  getUserList(Map  params);
}

mapper.xml :

<select id="getUserList" parameterType="map" resultType="SysUser">
  select t.* from sys_user t where  id=#{id}  and  code = #{code}
</select>

示例2:(有比较复杂的参数)

如果参数既要包含 String 类型,又包含 List 类型,使用Map 来封装参数。 其实就是与 1.3的内容。

将参数放入Map,再取出Map中的List遍历。如下:

// 定义一个 map
Map<String, Object> params = new HashMap<String, Object>();

params.put("status", "0");

// List类型
List<String> ids= new ArrayList<String>();
ids.add("1");
ids.add("2");

params.put("ids", ids); 

Mapper 接口:

public interface UserMapper{
	public List<SysUser> getUserList(Map  params);
}

mapper.xml :

<select id="getUserList" parameterType="map" resultType="SysUser">
 select t.*
  from sys_user t
  WHERE t.status = #{status} 
  <if test=' ids != null and ids.size() > 0 '>
	  and t.id not in 
 	  <foreach collection="ids" item="item" index="index" open="(" close=")" separator=",">
     	  #{item}
  	  </foreach>
   </if>
</select>

1.3、使用对象封装的一个参数多个值

数据对象:

public class UserQueryVO {
	private Integer id;
	private String code;
	
	// getter/setter....
}

Mapper 接口:

public interface UserMapper{
	public List<SysUser> getUserList(UserQueryVO userQueryVO); 
}

mapper.xml :

<select id="getUserList" parameterType="com.xxx.entity.vo.UserQueryVO" resultType="SysUser">
   select t.* from sys_user t where id=#{id} code = #{code}
</select>

1.4、List 封装 in:

Mapper 接口:

public interface UserMapper{
	public List<SysUser> getUserList(List<String> idsIn);
}

mapper.xml :

<select id="getUserList" resultType="SysUser">
  select t.* from sys_user t
  where id in
  <foreach collection="idsIn" item="item"   open="(" separator="," close=")">  
    #{item}  
  </foreach>  
</select>

foreach 最后的效果是 select 字段... from XXX where id in ('1','2','3','4')

二、使用 @param 指定参数

2.1、一个参数

Mapper 接口:

public interface UserMapper{
	public List<SysUser> getUserList(@param("id")String id);
}

mapper.xml :

<select id="getUserList" parameterType="java.lang.String" resultType="SysUser">
  select t.* from sys_user t where t.id= #{id}
</select>

mapper.xml 中 #{id}id ,对应的是 @param("id") 中指定的名称 id ,而不是String idid

2.1、多个参数(重点)

数据:

// List类型
List<String> ids= new ArrayList<String>();
ids.add("1");
ids.add("2");
params.put("ids", ids); 

String code = "1";

Mapper 接口:

public interface UserMapper{
	public List<SysUser>  getUserList(@Param("idIn")String ids, @Param("codeStr ")String code); 
}

多参数时,@Param() 中指定参数的名称,在 mapper.xml 中引用

mapper.xml :

<select id="getUserList" resultType="SysUser">
  select t.* 
  from sys_user t 
  where id in
  <foreach collection="idIn" item="item"   open="(" separator="," close=")">  
    #{item}  
  </foreach>  
	and code= #{ codeStr }
</select>

三、多参数,基于参数顺序

Mapper 接口:

public interface UserMapper{
	public List<SysUser> getUserList(String id , String code);
}

不需要写 parameterType 参数。

mapper.xml :

<select id="getUserList" resultType="SysUser">
  select t.* from sys_user t  
  where id = #{0} and name = #{1}
</select>

这里不再使用参数名,使用索引,即 #{ index }。index 索引从 0 开始递增。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐