MyBatis动态SQL(二)

1.foreach

foreach语句用来遍历数组和集合对象。标签中的属性:
collection属性:值有三种list、array、map
open属性:表示调用的sql语句前缀添加的内容
close属性:表示调用的sql语句后缀添加的内容
separator属性:分隔符,表示每一次迭代元素之间用什么分隔
item属性:表示迭代时,每个元素的别名
index属性:表示当前循环的索引位置
映射文件配置代码:

<select id="queryByList" parameterType="list" resultMap="baseMap">
		select * from t_user where no in
		<foreach collection="nos" open="(" close=")" separator="," item="no">
			#{no}
		</foreach>
	</select>

方法的接口代码:

//list,map参数必须添加注解@param不然配置文件会找不着参数而报错
public List<User> queryByList(@Param("nos")List<Integer> nos);

测试代码:

public class TestSQL {
	public static IUserDao mapper = IUserMapper.getIUserMapper();
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
		list.add(1009);
		list.add(1111);
		List<User> user = mapper.queryByList(list);
		for (User user2 : user) {
			System.out.println(user2);
		}
	}
}

测试结果:
在这里插入图片描述

2.bind

bind元素就是在OGNL表达式中创建一个变量,然后在整个表达式范围内都可以使用。
映射文件配置代码:

<select id="queryById" resultType="user" parameterType="int">
		<bind name="abc" value="1009"/>
		select * 
		from t_user 
		<where>
			<if test="no=null" >
					 no=${abc}
				</if>
		</where>
	</select>

测试结果:
在这里插入图片描述

3.sql块

sql片段一般用来定义sql中的列属性。如下例子:
映射文件配置代码:

<!-- 定义好sql片段 -->
	<sql id="sql">
		no,name,age
	</sql>
	<select id="queryByList" parameterType="list" resultMap="baseMap">
		select 
		<!-- 引用定义好的sql片段 -->
		<include refid="sql"></include> 
		from t_user where no in
		<foreach collection="nos" open="(" close=")" separator="," item="no">
			#{no}
		</foreach>
	</select>
	
	<insert id="add" parameterType="user">
		insert into t_user(
		<!-- 引用定义好的sql片段 -->
		<include refid="sql"></include>
		) values(#{no},#{name},#{age}) 
	</insert>

测试结果:
在这里插入图片描述

原文地址:https://www.cnblogs.com/xj619/p/11183510.html