[mybatis]动态SQL与SQL片段


动态SQL:用来拼接SQL语句,可以将SQL语句中的WHERE等控制语句用动态SQL写入Mapper.xml文件配置中,当条件成立则拼接SQL语句,拼接where等控制语句,可以灵活控制SQL语句的变化,应对不同查询需求

动态SQL控制中写入了下面几个标签:

  1. where,用来拼接where语句
  2. if,用来拼接where里的and语句
  3. foreach,用来遍历集合,拼接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);
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号