Mybatis動態SQL語句使用
阿新 • • 發佈:2018-06-09
第一個 from 在外 字符串 each nbsp mea pack ger
在實際開發中,有時候查詢條件可能是不確定的,查詢條件可能有多條也可能沒有,這時候就需要用到動態的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);
測試
@Test public 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);
測試
@Test public 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); }
Mybatis動態SQL語句使用