在实际开发中,有时候查询条件可能是不确定的,查询条件可能有多条也可能没有,这时候就需要用到动态的sql语句拼接功能。
一、if、where、sql标签的使用
需求:在一些高级查询中,查询条件存在的个数不确定。如,SELECT * FROM user WHERE username LIKE '%明%' AND sex = '1';
为了能够动态拼接sql语句可以采用以下方式:
UserMapper.xml
<select id="findUserByUserNameAndSex" parameterType="cn.itheima.pojo.User" resultType="cn.itheima.pojo.User">\
SELECT * FROM user<!-- where标签作用:会自动向sql语句中添加where关键字会去掉第一个条件的and语句--><where><if test="username != null and username != ''">AND username LIKE '%${username}%'</if><if test="sex != null and sex != ''">AND sex=#{sex}</if></where></select>
where标签下的查询条件放在findUserByUserNameAndSex中,只能在该范围内使用。为了实现代码的重用性,通常将查询条件放在外面,由不同的查询共同调用。
<sql id="user_where"><where><if test="username != null and username != ''">AND username LIKE '%${username}%'</if><if test="sex != null and sex != ''">AND sex=#{sex}</if></where></sql>
<select id="findUserByUserNameAndSex" parameterType="cn.itheima.pojo.User" resultType="cn.itheima.pojo.User">SELECT * FROM user<!-- 调用sql条件 --><include refid="user_where"></include></select>
UserMapper.java中编写接口
List<User> findUserByUserNameAndSex(User user);
测试
@Testpublic void testFindUserByUserNameAndSex() throws Exception {SqlSession session = sqlSessionFactory.openSession();UserMapper userMapper = session.getMapper(UserMapper.class);User user = new User();user.setUsername("明");user.setSex("1");List<User> userList = userMapper.findUserByUserNameAndSex(user);System.out.println(userList);}
二、foreach标签的使用
需求:SQL语句中,SELECT * FROM user WHERE id IN (1,15,22,28);为了从service层接收多个id值,然后使用foreach标签动态拼接多个id值组成完整的SQL语句。
UserMapper.xml
<select id="findUserByIds" parameterType="cn.itheima.pojo.QueryVO" resultType="cn.itheima.pojo.User">SELECT * FROM user<where><if test="ids != null"><!--foreach:循环传入的集合参数collection:传入的集合的变量名称item:每次循环将循环出的数据放入这个变量open:循环开始拼接的字符串close:循环结束拼接的字符串separator:循环中拼接的分隔符--><foreach collection="ids" item="id" open=" id IN (" close=")" separator=",">#{id}</foreach></if></where></select>
QueryVO.java
package cn.itheima.pojo;import java.util.List;public class QueryVO {private List<Integer> ids;public List<Integer> getIds() {return ids;}public void setIds(List<Integer> ids) {this.ids = ids;} }
多个id值可以通过QueryVO类传递给DAO层。
UserMapper.java接口中编写接口
List<User> findUserByIds(QueryVO vo);
测试
@Testpublic void testFindUserByIds() throws Exception {SqlSession session = sqlSessionFactory.openSession();UserMapper userMapper = session.getMapper(UserMapper.class);QueryVO vo = new QueryVO();List<Integer> ids = new ArrayList<Integer>();ids.add(1);ids.add(15);ids.add(22);ids.add(28);vo.setIds(ids);List<User> userList = userMapper.findUserByIds(vo);System.out.println(userList);}