日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Mybatis动态sql的使用

發(fā)布時(shí)間:2024/8/23 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mybatis动态sql的使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

通過mybatis提供的各種標(biāo)簽方法實(shí)現(xiàn)動(dòng)態(tài)拼接sql。

為什么用if標(biāo)簽?

UserMapper.xml配置sql,如下:

<!-- 根據(jù)條件查詢用戶 --> <select id="queryUserByWhere" parameterType="user" resultType="user">SELECT id, username, birthday, sex, address FROM `user`WHERE sex = #{sex} AND username LIKE'%${username}%' </select>

Mapper接口

List<User> queryUserByWhere(User user);

測試方法
測試方法:

@Test public void testQueryUserByWhere() {// mybatis和spring整合,整合之后,交給spring管理SqlSession sqlSession = this.sqlSessionFactory.openSession();// 創(chuàng)建Mapper接口的動(dòng)態(tài)代理對象,整合之后,交給spring管理UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 使用userMapper執(zhí)行根據(jù)條件查詢用戶User user = new User();user.setSex("1");user.setUsername("張");List<User> list = userMapper.queryUserByWhere(user);for (User u : list) {System.out.println(u);}// mybatis和spring整合,整合之后,交給spring管理sqlSession.close(); }

此時(shí)的測試結(jié)果是正常的,如果注釋掉 user.setSex(“1”),那么輸出的結(jié)果為空,因?yàn)槲覀兊膚here中必須同時(shí)去匹配sex與username如果我們想通過其中任意一個(gè)查詢數(shù)據(jù)庫結(jié)果,那么又需要分別添加兩個(gè)SQL語句代碼,那么如果有多個(gè)條件呢?是不是每次都要重新添加,顯然之前這種方式是不靠譜的,因?yàn)橐雱?dòng)態(tài)sql的if標(biāo)簽可以解決此問題。

使用if標(biāo)簽

注意:字符串類型的數(shù)據(jù)需要要做不等于空字符串校驗(yàn)。
and放在sex或者username的前面是合法的,如果前面沒有條件會(huì)自動(dòng)把a(bǔ)nd去掉,如果放在條件后面不會(huì)自動(dòng)去掉,可能造成異常!
where 1=1是sql語句條件邏輯判斷表達(dá)式,由于1=1成立,恒為真,該表達(dá)式1=1將始終返回”真”。
改造UserMapper.xml

<!-- 根據(jù)條件查詢用戶 --> <select id="queryUserByWhere" parameterType="user" resultType="user">SELECT id, username, birthday, sex, address FROM `user`WHERE 1=1<if test="sex != null and sex != ''">AND sex = #{sex}</if><if test="username != null and username != ''">AND username LIKE'%${username}%'</if> </select>

Where標(biāo)簽

上面的sql還有where 1=1 這樣的語句,很麻煩
可以使用where標(biāo)簽進(jìn)行改造
改造UserMapper.xml,如下

<!-- 根據(jù)條件查詢用戶 --> <select id="queryUserByWhere" parameterType="user" resultType="user">SELECT id, username, birthday, sex, address FROM `user` <!-- where標(biāo)簽可以自動(dòng)添加where,同時(shí)處理sql語句中第一個(gè)and關(guān)鍵字 --><where><if test="sex != null">AND sex = #{sex}</if><if test="username != null and username != ''">AND username LIKE'%${username}%'</if></where> </select>

sql片段使用

Sql中可將重復(fù)的sql提取出來,使用時(shí)用include引用即可,最終達(dá)到sql重用的目的。

把上面例子中的id, username, birthday, sex, address提取出來,作為sql片段,如下:
注意:申明用sql標(biāo)簽使用用include和里面的refid屬性

<!-- 根據(jù)條件查詢用戶 --> <select id="queryUserByWhere" parameterType="user" resultType="user"><!-- SELECT id, username, birthday, sex, address FROM `user` --><!-- 使用include標(biāo)簽加載sql片段;refid是sql片段id -->SELECT <include refid="userFields" /> FROM `user`<!-- where標(biāo)簽可以自動(dòng)添加where關(guān)鍵字,同時(shí)處理sql語句中第一個(gè)and關(guān)鍵字 --><where><if test="sex != null">AND sex = #{sex}</if><if test="username != null and username != ''">AND username LIKE'%${username}%'</if></where> </select><!-- 聲明sql片段 --> <sql id="userFields">id, username, birthday, sex, address </sql>

如果要使用別的Mapper.xml配置的sql片段,可以在refid前面加上對應(yīng)的Mapper.xml的namespace

foreach標(biāo)簽


向sql傳遞數(shù)組或List,mybatis使用foreach解析,如下:

根據(jù)多個(gè)id查詢用戶信息
查詢sql:
SELECT * FROM user WHERE id IN (1,10,24)
QueryVo類
如下圖在pojo中定義list屬性ids存儲(chǔ)多個(gè)用戶id,并添加getter/setter方法

package com.itheima.mybatis.pojo;import java.io.Serializable; import java.util.List; /*** new Message* @author lx**/ public class QueryVo implements Serializable {/*** */private static final long serialVersionUID = 1L;//private User user;List<Integer> idsList;Integer[] ids;public List<Integer> getIdsList() {return idsList;}public void setIdsList(List<Integer> idsList) {this.idsList = idsList;}public Integer[] getIds() {return ids;}public void setIds(Integer[] ids) {this.ids = ids;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}}

Mapper.xml文件
UserMapper.xml添加sql,如下:

<!-- 根據(jù)ids查詢用戶 --> <select id="queryUserByIds" parameterType="queryVo" resultType="user">SELECT * FROM `user`<where><!-- foreach標(biāo)簽,進(jìn)行遍歷 --><!-- collection:遍歷的集合,這里是QueryVo的ids屬性 --><!-- item:遍歷的項(xiàng)目,可以隨便寫,,但是和后面的#{}里面要一致 --><!-- open:在前面添加的sql片段 --><!-- close:在結(jié)尾處添加的sql片段 --><!-- separator:指定遍歷的元素之間使用的分隔符 --><foreach collection="ids" item="item" open="id IN (" close=")"separator=",">#{item}</foreach></where> </select>

測試方法:

@Test public void testQueryUserByIds() {// mybatis和spring整合,整合之后,交給spring管理SqlSession sqlSession = this.sqlSessionFactory.openSession();// 創(chuàng)建Mapper接口的動(dòng)態(tài)代理對象,整合之后,交給spring管理UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 使用userMapper執(zhí)行根據(jù)條件查詢用戶QueryVo queryVo = new QueryVo();List<Integer> ids = new ArrayList<>();ids.add(1);ids.add(10);ids.add(24);queryVo.setIds(ids);List<User> list = userMapper.queryUserByIds(queryVo);for (User u : list) {System.out.println(u);}// mybatis和spring整合,整合之后,交給spring管理sqlSession.close(); }

總結(jié)

以上是生活随笔為你收集整理的Mybatis动态sql的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。