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>
测试结果: