动态SQL:用来拼接SQL语句,可以将SQL语句中的WHERE等控制语句用动态SQL写入Mapper.xml文件配置中,当条件成立则拼接SQL语句,拼接where等控制语句,可以灵活控制SQL语句的变化,应对不同查询需求
动态SQL控制中写入了下面几个标签:
动态SQL:与的应用
<!-- 动态sql查找用户列表 -->
<select id="findUserByDynamicSQL" parameterType="user" resultType="user">
SELECT * FROM USER
<!-- where,如果if成立拼接where语句 -->
<where>
<!-- 如果User传进来了id属性,那么拼接sql -->
<if test="id!=null and id!=''">
<!-- where会自动去掉条件中的第一个and -->
and id=#{id}
</if>
<!-- 如果User传进来了username属性,那么拼接sql -->
<if test="username!=null and username!=''">
<!-- where会自动去掉条件中的第一个and -->
and username=#{username}
</if>
</where>
</select>
动态SQL:与的应用:
因为是根据集合遍历,所以在传入的参数User中必须要定义一个集合属性
public class User {
//用来存储用户id的集合
private List<Integer> ids;
}
Mapper.xml文件
<!-- 根据传入的id集合遍历 -->
<select id="findUserByIds" parameterType="user" resultType="user">
SELECT * FROM USER
<where>
<!--
使用foreach遍历User中的ids集合 :
collection : User类中的集合属性名
item : 每次遍历生成的值的名字
open : 开始遍历时要拼接的串
close : 结束遍历时要拼接的串
separator : SQL语句两个值中间要拼接的串
-->
<!-- 拼接 and id in(1,2,3,4) -->
<foreach collection="ids" item="item_id" open="and id in(" close=")" separator=",">
<!-- #{item_id}中的参数名与item="item_id"一致 -->
#{item_id}
</foreach>
</where>
</select>
SQL片段:
用来抽取定义的动态sql,以方便多个statement调用同一个where条件
SQL片段应用(Mapper.xml中)
定义SQL片段
<!--
定义sql片段 : 用来抽取定义的动态sql
以方便多个statement调用同一个where条件
id : sql片段的唯一标识
技巧 :
1 : 是基于单表来定义,这样可重用性高
2 : 在sql片段中不要包含<where>
-->
<sql id="query_user_where">
<!-- 如果User传进来了id属性,那么拼接sql -->
<if test="id!=null and id!=''">
<!-- where会自动去掉条件中的第一个and -->
and id=#{id}
</if>
<!-- 如果User传进来了username属性,那么拼接sql -->
<if test="username!=null and username!=''">
<!-- where会自动去掉条件中的第一个and -->
and username=#{username}
</if>
</sql>
引用SQL片段
<!-- 动态sql查找用户列表 -->
<select id="findUserByDynamicSQL" parameterType="user" resultType="user">
SELECT * FROM USER
<where>
<!--
应用sql片段的id :
refid : 指定sql片段的id
如果refid指定的id不在本mapper.xml文件中,
需要前面加namespace命名空间
-->
<include refid="query_user_where"></include>
<!-- 还可以继续引用其他sql片段 -->
<!-- <include refid="..."></include> -->
</where>
</select>
Mapper接口:
//动态sql查找用户
public List<User> findUserByDynamicSQL (User user);
//根据id集合查询用户
public List<User> findUserByIds (User user);
Test测试:
//动态sql查找用户
@Test
public void testFindUserByDynamicSQL(){
//创建session
SqlSession session = sessionFactory.openSession();
//通过session获取mapper代理
UserMapper mapper = session.getMapper(UserMapper.class);
/*
* 给sql查询设置查询条件 :
* 1 : id和username可以二选一
* 2 : id和username也可以全部都设置上
* 3 : 如果都不设置,方法参数传null即可
* 查询结果为当前表的所有记录
*/
//调用代理接口中的方法,查询所有用户列表
List<User> userss = mapper.findUserByDynamicSQL(null);
//输出所有用户
System.out.println(userss);
//根据条件查询用户列表
User user = new User();
//设置要查询的id
user.setId(12);
//设置要查询的姓名
user.setUsername("admin");
//动态拼接sql,根据id或username查询用户列表
List<User> users = mapper.findUserByDynamicSQL(user);
//输出用户列表
System.out.println(users);
}
//动态sql查找用户
@Test
public void findUserByIds (){
//创建session
SqlSession session = sessionFactory.openSession();
//通过session获取mapper代理
UserMapper mapper = session.getMapper(UserMapper.class);
//设置要查询的id集合
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
//把id添加进入User中
User user = new User();
user.setIds(list);
//查询指定id的用户列表
List<User> users = mapper.findUserByIds(user);
System.out.println(users);
}
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。