動態sql
1.什麼是動態sql
mybatis核心 對sql語句進行靈活操做,經過表達式進行判斷,對sql進行靈活拼接、組裝。
2.需求
用戶信息綜合查詢列表和用戶信息查詢列表總數這兩個statement的定義使用動態sql。
對查詢條件進行判斷,若是輸入參數不爲空才進行查詢條件拼接。
3.mapper.xml
原查詢語句配置:java
<mapper namespace="cn.edu.hpu.mybatis.mapper.UserMapper"> <!-- 用戶信息綜合查詢 #{UserCustom.sex}取出包裝對象中性別值 ${UserCustom.username}取得pojo包裝對象中用戶名稱 --> <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="cn.edu.hpu.mybatis.PO.UserCustom"> select * from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%' </select> <!-- 用戶信息綜合查詢總數 --> <select id="findUserCount" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="int"> select count(*) from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%' </select> ...... </mapper>
修改後的查詢語句配置:程序員
<!-- 用戶信息綜合查詢 #{UserCustom.sex}取出包裝對象中性別值 ${UserCustom.username}取得pojo包裝對象中用戶名稱 --> <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="cn.edu.hpu.mybatis.PO.UserCustom"> select * from user <!-- where標籤能夠自動去掉第一個and --> <where> <if test="userCustom!=null"> <if test="userCustom.sex!=null and userCustom.sex!=''"> and user.sex=#{userCustom.sex} </if> <if test="userCustom.username!=null and userCustom.username!=''"> and user.username like '%${userCustom.username}%' </if> </if> </where> </select> <!-- 用戶信息綜合查詢總數 --> <select id="findUserCount" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="int"> select count(*) from user <!-- where標籤能夠自動去掉第一個and --> <where> <if test="userCustom!=null"> <if test="userCustom.sex!=null and userCustom.sex!=''"> and user.sex=#{userCustom.sex} </if> <if test="userCustom.username!=null and userCustom.username!=''"> and user.username like '%${userCustom.username}%' </if> </if> </where> </select>
4.測試代碼sql
//用戶信息綜合查詢 @Test public void testFindUserList() throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); //建立UserMapper代理對象 UserMapper userMapper=sqlSession.getMapper(UserMapper.class); //建立包裝對象,設置查詢條件 UserQueryVo userQueryVo=new UserQueryVo(); UserCustom userCustom=new UserCustom(); //因爲這裏使用動態sql,若是這裏不設置某個值,條件不會拼接在sql中 //userCustom.setSex("男"); userCustom.setUsername("張三"); userQueryVo.setUserCustom(userCustom); //調用userMapper的方法 List<UserCustom> users=userMapper.findUserList(userQueryVo); for (int i = 0; i < users.size(); i++) { UserCustom user=(UserCustom)users.get(i); System.out.println(user.getId()+":"+user.getUsername()); } }
測試結果:
1:張三
4:張三丰mybatis
發現sql語句爲select * from user WHERE user.username like '%張三%' ,並無將sex拼接進去,說明咱們的動態sql設置成功app
5.sql片斷測試
5.1需求
將上邊實現的動態sql判斷代碼塊抽取出來,組成一個sql片斷。其它的statement中就能夠引用sql片斷。
方便程序員進行開發。
5.2定義sql片斷spa
<mapper namespace="cn.edu.hpu.mybatis.mapper.UserMapper"> <!-- 定義sql片斷 id:sql片斷的惟一標識 在sql片斷中不要加入where 經驗:通常咱們定義sql片斷是爲了可重用性,是基於單表來定義sql片斷, 這樣的話這個sql片斷可重用性才高--> <sql id="query_user_where"> <if test="userCustom!=null"> <if test="userCustom.sex!=null and userCustom.sex!=''"> and user.sex=#{userCustom.sex} </if> <if test="userCustom.username!=null and userCustom.username!=''"> and user.username like '%${userCustom.username}%' </if> </if> </sql> ...... </mapper>
5.3引用sql片斷
在mapper.xml中定義的statement中引用sql片斷:代理
<!-- 用戶信息綜合查詢 #{UserCustom.sex}取出包裝對象中性別值 ${UserCustom.username}取得pojo包裝對象中用戶名稱 --> <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="cn.edu.hpu.mybatis.PO.UserCustom"> select * from user <!-- where標籤能夠自動去掉第一個and --> <where> <!-- 應用sql片斷的id,若是refid指定的id再也不本mapper文件中,須要前邊加namespace --> <include refid="query_user_where"></include> <!-- 在這裏還可能要引用其餘的sql片斷 --> </where> </select> <!-- 用戶信息綜合查詢總數 --> <select id="findUserCount" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="int"> select count(*) from user <!-- where標籤能夠自動去掉第一個and --> <where> <!-- 應用sql片斷的id,若是refid指定的id再也不本mapper文件中,須要前邊加namespace --> <include refid="query_user_where"></include> <!-- 在這裏還可能要引用其餘的sql片斷 --> </where> </select>
測試:code
//用戶信息綜合查詢 @Test public void testFindUserList() throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); //建立UserMapper代理對象 UserMapper userMapper=sqlSession.getMapper(UserMapper.class); //建立包裝對象,設置查詢條件 UserQueryVo userQueryVo=new UserQueryVo(); UserCustom userCustom=new UserCustom(); //因爲這裏使用動態sql,若是這裏不設置某個值,條件不會拼接在sql中 userCustom.setSex("男"); userCustom.setUsername("張三"); userQueryVo.setUserCustom(userCustom); //調用userMapper的方法 List<UserCustom> users=userMapper.findUserList(userQueryVo); for (int i = 0; i < users.size(); i++) { UserCustom user=(UserCustom)users.get(i); System.out.println(user.getId()+":"+user.getUsername()); } }
測試結果:
1:張三
4:張三丰xml
小結:
sql片斷方便程序員進行開發