国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Mybatis深入了解(五)----動態SQL

2019-11-09 13:39:31
字體:
來源:轉載
供稿:網友
什么是動態SQL實例Mapperxml測試代碼sql片段定義sql片段引用sql片段foreach應用場景在輸入參數類型中添加List ids傳入多個id修改Mapperxml測試代碼

什么是動態SQL?


    動態sql是mybatis的核心,主要是對sql語句進行靈活操作,通過表達式進行判斷,對sql進行靈活的拼接、組裝。    

實例


    用戶信息綜合查詢列表和用戶信息查詢列表總數這兩個statement的定義使用動態sql。對查詢條件進行判斷,如果輸入參數不為空才進行查詢條件拼接。

    

Mapper.xml


<!-- 用戶信息綜合查詢 #{userCustom.sex}:取出pojo包裝對象中性別值 ${userCustom.username}:取出pojo包裝對象中用戶名稱 --> <select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="cn.itcast.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.itcast.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>

    

測試代碼


//用戶信息的綜合 查詢 @Test public void testFindUserList() throws Exception { Sqlsession sqlSession = sqlSessionFactory.openSession(); //創建UserMapper對象,mybatis自動生成mapper代理對象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //創建包裝對象,設置查詢條件 UserQueryVo userQueryVo = new UserQueryVo(); UserCustom userCustom = new UserCustom(); //由于這里使用動態sql,如果不設置某個值,條件不會拼接在sql中 //userCustom.setSex("1"); userCustom.setUsername("小明"); userQueryVo.setUserCustom(userCustom); //調用userMapper的方法 List<UserCustom> list = userMapper.findUserList(userQueryVo); System.out.PRintln(list); }

    

sql片段


    將上邊實現的動態sql判斷代碼塊抽取出來,組成一個sql片段。其它的statement中就可以引用sql片段。方便程序員進行開發。

定義sql片段

<!-- 定義sql片段 id:sql片段的唯 一標識 經驗:是基于單表來定義sql片段,這樣話這個sql片段可重用性才高 在sql片段中不要包括 where --> <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>

引用sql片段

<!-- 用戶信息綜合查詢 #{userCustom.sex}:取出pojo包裝對象中性別值 ${userCustom.username}:取出pojo包裝對象中用戶名稱 --> <select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="cn.itcast.mybatis.po.UserCustom"> SELECT * FROM USER <!-- where可以自動去掉條件中的第一個and --> <where> <!-- 引用sql片段 的id,如果refid指定的id不在本mapper文件中,需要前邊加namespace --> <include refid="query_user_where"></include> <!-- 在這里還要引用其它的sql片段 --> </where> </select>

    其中的關鍵是這一句引用:

<!-- 引用sql片段 的id,如果refid指定的id不在本mapper文件中,需要前邊加namespace --><include refid="query_user_where"></include>

    

foreach


     向sql傳遞數組或List,mybatis使用foreach解析

應用場景

    在用戶查詢列表和查詢總數的statement中增加多個id輸入查詢。     類似下面的sql語句:

SELECT * FROM USER WHERE id=1 OR id=10 OR id=16SELECT * FROM USER WHERE id IN(1,10,16)

在輸入參數類型中添加List ids傳入多個id

public class UserQueryVo { //傳入多個id private List<Integer> ids;

修改Mapper.xml

    WHERE id=1 OR id=10 OR id=16,在查詢條件中,查詢條件定義成一個sql片段,需要修改sql片段。

<if test="ids!=null"> <!-- 使用 foreach遍歷傳入ids collection:指定輸入 對象中集合屬性 item:每個遍歷生成對象中 open:開始遍歷時拼接的串 close:結束遍歷時拼接的串 separator:遍歷的兩個對象中需要拼接的串 --> <!-- 使用實現下邊的sql拼接: AND (id=1 OR id=10 OR id=16) --> <foreach collection="ids" item="user_id" open="AND (" close=")" separator="or"> <!-- 每個遍歷需要拼接的串 --> id=#{user_id} </foreach>

測試代碼

    修改上面的測試方法,傳入多個id進行測試。

//創建包裝對象,設置查詢條件 UserQueryVo userQueryVo = new UserQueryVo(); UserCustom userCustom = new UserCustom(); //由于這里使用動態sql,如果不設置某個值,條件不會拼接在sql中 //userCustom.setSex("1"); userCustom.setUsername("小明"); //傳入多個id List<Integer> ids = new ArrayList<Integer>(); ids.add(1); ids.add(10); ids.add(16); //將ids通過userQueryVo傳入statement中 userQueryVo.setIds(ids); userQueryVo.setUserCustom(userCustom); //調用userMapper的方法 List<UserCustom> list = userMapper.findUserList(userQueryVo); System.out.println(list);
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 理塘县| 吉木乃县| 桃园市| 集贤县| 辽宁省| 汉川市| 凤山县| 涟源市| 灵台县| 温宿县| 古丈县| 天峻县| 高密市| 桃源县| 新营市| 兴化市| 龙里县| 奇台县| 祁连县| 海城市| 界首市| 城市| 同德县| 衡东县| 济阳县| 河南省| 乐安县| 温宿县| 罗田县| 泾源县| 海林市| 微山县| 桓仁| 新源县| 青浦区| 安达市| 西畴县| 华蓥市| 汨罗市| 临洮县| 长治市|