亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 開發(fā) > Java > 正文

MyBatis執(zhí)行動(dòng)態(tài)SQL的方法

2024-07-14 08:43:22
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

大家基本上都知道如何使用 MyBatis 執(zhí)行任意 SQL,使用方法很簡(jiǎn)單,例如在一個(gè) XXMapper.xml 中:

<select id="executeSql" resultType="map">  ${_parameter}</select>

你可以如下調(diào)用:

sqlSession.selectList("executeSql", "select * from sysuser where enabled = 1");

或者你可以在 XXMapper.java 接口中定義如下方法:

List<Map> executeSql(String sql);

然后使用接口調(diào)用方法:

xxMapper.executeSql("select * from sysuser where enabled = 1");

上面這些內(nèi)容可能都會(huì),下面在此基礎(chǔ)上再?gòu)?fù)雜一點(diǎn)。

假如像上面SQL中的enabled = 1我想使用參數(shù)方式傳值,也就是寫成enabled = #{enabled},如果你沒(méi)有遇到過(guò)類似這種需求,可能不明白為什么要這么寫,舉個(gè)例子,要實(shí)現(xiàn)一種動(dòng)態(tài)查詢,可以在前臺(tái)通過(guò)配置 SQL,提供一些查詢條件就能實(shí)現(xiàn)一個(gè)查詢的功能(為了安全,這些配置肯定是開發(fā)或者實(shí)施做的,不可能讓用戶直接操作數(shù)據(jù)庫(kù))。

針對(duì)這個(gè)功能,使用 MyBatis 實(shí)現(xiàn)起來(lái)相當(dāng)容易。配置 SQL 肯定要執(zhí)行,用上面講的這種方式肯定可以執(zhí)行 SQL,如何提供參數(shù)呢?參數(shù)就是enabled = #{enabled}中的#{enabled}部分。如果再多一些條件,一個(gè)配置好的 SQL 如下:

select * from sysuser where enabled = #{enabled} and userName like concat('%',#{userName},'%')

這種情況下,該怎么用 MyBatis 實(shí)現(xiàn)呢?

首先 XML 中修改如下:

<select id="executeSql" resultType="map">  ${sql}</select>

接口中的方法修改為:

List<Map> executeSql(Map map);

然后調(diào)用方法:

Map map = new HashMap();//這里的 sql 對(duì)應(yīng) XML 中的 ${sql}map.put("sql", "select * from sysuser "    + " where enabled = #{enabled} "    + " and userName like concat('%',#{userName},'%')");//#{enabled}map.put("enabled", 1);//#{userName}map.put("userName", "admin");//接口方式調(diào)用List<Map> list = xxMapper.executeSql(map);//sqlSession方式調(diào)用sqlSession.selectList("executeSql", map);

有了這個(gè)SQL之后,就可以將 enabled 和 userName 作為條件提供給用戶。這兩個(gè)條件顯然是必填的。如果是可選的,那該怎么寫?

也許有人想到了是不是可以用 MyBatis 中的動(dòng)態(tài) SQL,使用<if>標(biāo)簽等等?

再回答這個(gè)問(wèn)題前,我們先看處理動(dòng)態(tài) SQL 的DynamicSqlSource中的代碼:

@Override public BoundSql getBoundSql(Object parameterObject) {  DynamicContext context = new DynamicContext(configuration, parameterObject);  rootSqlNode.apply(context);  SqlSourceBuilder sqlSourceParser = new SqlSourceBuilder(configuration);  Class < ?>parameterType =         parameterObject == null ? Object.class: parameterObject.getClass();  SqlSource sqlSource = sqlSourceParser.parse(context.getSql(),         parameterType, context.getBindings());  BoundSql boundSql = sqlSource.getBoundSql(parameterObject);  for (Map.Entry < String, Object > entry: context.getBindings().entrySet()) {    boundSql.setAdditionalParameter(entry.getKey(), entry.getValue());  }  return boundSql;}

MyBatis 處理動(dòng)態(tài) SQL 時(shí),所有動(dòng)態(tài) SQL 的標(biāo)簽都會(huì)處理為 SqlNode (這里的rootSqlNode)對(duì)象,包含${}的也會(huì)處理為TextSqlNode對(duì)象,在上面方法的前兩行,就是 MyBatis 處理動(dòng)態(tài) SQL 的地方。

因此如果我們?cè)?code style="margin: 3px auto 0px; padding: 2px 4px; outline: none; font-style: inherit; font-weight: inherit; background: rgb(249, 242, 244); width: 640px; line-height: 1.5; clear: both; font-size: 12px; border: 1px solid rgb(204, 204, 204); color: rgb(199, 37, 78); border-radius: 0px; font-family: Menlo, Monaco, Consolas, "Courier New", monospace;">${sql} 中的內(nèi)容包含嵌套的${}<if>,<where>等標(biāo)簽時(shí),他們?cè)?MyBatis 解析 XML 為 SqlNode 對(duì)象時(shí),XML <select> 元素包含的內(nèi)容只有${sql},只有${sql}會(huì)被解析,在運(yùn)行時(shí)這個(gè)參數(shù)字符串中可能包含的${}和<if>,<where>等標(biāo)簽,但是這都發(fā)生在 MyBatis 解析后,因此當(dāng)這些內(nèi)容作為字符串中的一部分出現(xiàn)時(shí),他們不會(huì)被特殊處理,他們只是SQL中的一部分,只是原樣輸出(由于數(shù)據(jù)庫(kù)不認(rèn)會(huì)報(bào)錯(cuò))無(wú)法被處理,因此沒(méi)法通過(guò) MyBatis 自帶的這種方式來(lái)寫動(dòng)態(tài) SQL。

提示

在上面的代碼中:

sqlSourceParser.parse(context.getSql(), parameterType, context.getBindings());

這一段代碼是處理動(dòng)態(tài)參數(shù)(#{})的 
這個(gè)處理在動(dòng)態(tài) SQL 處理之后, 
因此可以在 SQL 中使用這種類型的參數(shù)。

既然不能用 MyBatis 動(dòng)態(tài) SQL 方式,該怎么實(shí)現(xiàn)動(dòng)態(tài) SQL 呢?

這里提供一個(gè)簡(jiǎn)單的思路,在 SQL 中使用模板標(biāo)記語(yǔ)言來(lái)實(shí)現(xiàn)動(dòng)態(tài)SQL(例如freemarker),在 SQL 交給 MyBatis 執(zhí)行之前,使用模板對(duì) SQL 進(jìn)行處理生成最終執(zhí)行的 SQL(需要避免處理#{}參數(shù)),將這個(gè)SQL交給 MyBatis 執(zhí)行。

舉一個(gè)Freemarker模板的例子,仍然以上面的SQL為基礎(chǔ):

select * from sysuser where 1 = 1<#if enabled??>enabled = #{enabled} </#if><#if userName?? && userName != ''>and userName like concat('%',#{userName},'%')</#if>

注意,這里的<#if>是Freemarker的元素。在不考慮SQL注入的情況下,上面的SQL還可以寫成:

select * from sysuser where 1 = 1<#if enabled??>enabled = #{enabled} </#if><#if userName?? && userName != ''>and userName like '%${userName}%'</#if>

區(qū)別就是'%${userName}%',因?yàn)?Freemarker 也會(huì)處理${userName},也會(huì)用實(shí)際的值來(lái)替換這里的參數(shù)。

在前面調(diào)用的代碼中,這里修改如下:

//#{enabled}map.put("enabled", 1);//#{userName}map.put("userName", "admin");//這里的 sql 對(duì)應(yīng) XML 中的 ${sql}String sql = "上面兩個(gè)復(fù)雜SQL中的一個(gè)";//使用Freemarker處理sqlsql = processSqlByFreemarker(sql, map);//將處理后的sql放到map中map.put("sql", sql);//執(zhí)行方法List<Map> list = xxMapper.executeSql(map);

注:processSqlByFreemarker方法就是根據(jù)map中的數(shù)據(jù)來(lái)處理sql字符串,實(shí)現(xiàn)方式可以自己搜索。

到這里,一個(gè)不是很復(fù)雜的動(dòng)態(tài)SQL功能就實(shí)現(xiàn)了。

不知道有沒(méi)有更貪心的人,你會(huì)不會(huì)想,上面返回值都是List<Map>類型,能不能返回一個(gè)我指定的實(shí)體類呢?

例如在map中:

map.put("class", "tk.mybatis.model.SysUser");

能不能通過(guò)這種方式讓返回值變成SysUser類型呢?由于這篇文章耗時(shí)已經(jīng)太長(zhǎng),這里就提供一個(gè)方案,不深入。

你可以使用攔截器實(shí)現(xiàn),獲取MappedStatement后,復(fù)制一份,然后修改resultMapsresultMaptype屬性為你指定的class類型就能實(shí)現(xiàn),說(shuō)起來(lái)容易,實(shí)際操作起來(lái)能有 PageHelper 分頁(yè)插件 1/10 左右的工作量。

注:如果是動(dòng)態(tài)的update,insert,delete 語(yǔ)句,可以將上面的<select>改為<update>(不需要使用<delete><insert>),返回值用int,比select的情況容易很多。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JAVA教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产伦理片在线观看| 精品动漫3d一区二区三区免费版| 搜成人激情视频| 深夜福利免费在线观看| a级片在线观看| 91精品国产91久久久久久不卡| 午夜精品久久久久久久久| 日韩不卡中文字幕| 精品久久久久久久久久久院品网| 亚洲视频国产精品| 亚洲精品18在线观看| 成人黄网18免费观看的网站| 7777精品伊人久久久大香线蕉的| 日韩电影在线观看完整免费观看| 麻豆九一精品爱看视频在线观看免费| 欧美亚洲色综久久精品国产| 日韩色视频在线观看| 这里只有精品免费| 美女视频亚洲色图| 综合 欧美 亚洲日本| 91色在线播放| av在线免费电影| 黄色av电影在线播放| 69av视频在线| 成人小视频免费在线观看| 粉嫩av免费一区二区三区| 人人网欧美视频| 综合一区二区三区| 在线观看亚洲网站| 亚洲精品久久久久久宅男| 免播放器亚洲一区| 精品国产免费人成电影在线观...| 精品97人妻无码中文永久在线| 精品人妻少妇嫩草av无码专区| 先锋资源一区二区| 欧美人在线视频| 新呦u视频一区二区| 精品一区二区91| 国产成人精品免费在线| 日韩欧美在线视频观看| 91麻豆精品一二三区在线| 国产熟妇一区二区三区四区| 91亚洲精品国产| 亚洲夫妻av| 黄色三级生活片| 欧美精品久久久久久久久老牛影院| 狠狠躁狠狠躁视频专区| 欧美黑人孕妇孕交| 五月婷婷久久综合| 欧美一级小视频| 国产伦精品一区二区三区高清版| 欧美视频免费一区二区三区| 免费高清视频精品| 中文字幕の友人北条麻妃| 久久米奇亚洲| 黄色漫画在线免费观看| 日韩亚洲第一页| 国产精品无码免费播放| 久久久999成人| 亚洲一区二区欧美| xxxxx成人.com| 国产九九热视频| 成人免费高清完整版在线观看| 国产精品91一区二区| 亚洲欧美日本国产有色| 九热视频在线观看| 久久久久久久久久av| 免费在线视频你懂的| 久久99偷拍| 国产伦精品一区二区三区免费| 成人av网址在线观看| 亚洲欧美日韩国产成人综合一二三区| 国产精品视频一区二区在线观看| 清纯唯美亚洲经典中文字幕| 亚洲人成电影在线播放| 无码人妻久久一区二区三区蜜桃| 在线综合亚洲欧美在线视频| 国产精品美女免费看| 可以免费观看av的网站| 欧美激情小视频| 欧美亚洲在线日韩| 欧美在线精品一区二区三区| 精品91免费| 十九岁完整版在线观看好看云免费| 青青青国产视频| 一区二区三区四区五区视频在线观看| 亚洲人成77777男人| 国产一级精品视频| 成人精品3d动漫| 一区二区三区国产精品| 2022国产麻豆剧果冻传媒剧情| 在线观看视频中文字幕| 国产国语亲子伦亲子| 国内自拍亚洲| 91香蕉嫩草影院入口| 精品一区二区在线视频| 深夜免费福利视频| 欧美激情va永久在线播放| 国产精品久久久久久久久久免费| 日本va欧美va欧美va精品| av片在线观看永久免费| 在线免费观看黄色av| 国产黑丝一区二区| 成人一二三区视频| 免费人成自慰网站| 95av在线视频| 精品亚洲国内自在自线福利| 精品国产无码一区二区| 国模私拍视频在线观看| 不卡亚洲精品| 国产美女久久久| 一级毛片国产| 欧美视频成人| 亚洲开发第一视频在线播放| 国产精品女同一区二区三区| 中文日韩欧美| 日本一道高清一区二区三区| 久久精品国产96久久久香蕉| 天天综合网在线| 九九视频直播综合网| 99热这里只有精品3| 免费电影网站在线视频观看福利| 久久网一区二区| 在线精品亚洲| 一区二区三区电影| 国产v亚洲v天堂无码久久久| 一本色道久久综合精品竹菊| 国产精品一级无码| silk一区二区三区精品视频| 中文字幕在线观看网站| 四虎精品成人免费网站| 久久久www成人免费毛片麻豆| 国内免费精品永久在线视频| 18岁以下禁止观看的美女视频| 日韩精品久久一区| 日韩精品手机在线| 天天干天天干天天| 欧美又大又粗又长| 国产精品视频99| 亚洲裸色大胆大尺寸艺术写真| 日韩中文字幕一区二区高清99| 亚洲精品国产电影| 浓精h攵女乱爱av| 久久一区免费| 日本1区2区3区中文字幕| 99精品一区二区三区| 欧美极品日韩| 91久久国语露脸精品国产高跟| 成+人+亚洲+综合天堂| 五月激情婷婷在线| 亚洲第一二三区| 亚洲国产日韩a在线播放性色| 亚洲成人av网址| 亚洲欧美国产一区二区三区| 韩国中文字幕在线| 全网免费在线播放视频入口| 99视频精品免费观看| 大尺度做爰床戏呻吟舒畅| 成人在线看片网站| 国产精品视频第一区| 亚洲综合网站在线观看| xfplay精品久久| 国产精品成人无码免费| 在线伊人免费视频| 精品调教chinesegay| 精品少妇一区二区三区免费观看| 国产精品美女高潮无套| 国内精品久久久久影院薰衣草| 欧美日韩aaaaa| 亚洲福利在线观看视频| www五月天com| 91精品在线国产| 国产原创精品视频| 中文字幕亚洲日本岛国片| 丁香花在线电影小说观看| 日韩av二区| 三级网在线观看| www.26天天久久天堂| 人禽交欧美网站免费| 色婷婷精品久久二区二区蜜臂av| a天堂视频在线| www.国产在线视频| 奇米色欧美一区二区三区| 日本韩国欧美一区二区三区| 久久久久久爱| 亚洲午夜精品| 激情五月开心婷婷| 免费色片视频| 久久69精品久久久久久久电影好| 国产精品有限公司| 怡红院红怡院欧美aⅴ怡春院| 五月天婷婷社区| h版电影在线播放视频网站| 深田咏美中文字幕| 九九热在线视频播放| 欧美专区福利免费| 国产精品久久久久免费| 一区在线观看视频| 日韩av懂色| 欧洲有码在线视频| 国产 日韩 欧美 成人| 精品视频偷偷看在线观看| 搡的我好爽在线观看免费视频| 91精品国产成人www| 久久女同精品一区二区| 一本一道久久a久久精品综合| 2018av男人天堂| 久草在线官网| 伊人手机在线| 一本一道久久a久久精品综合蜜臀| 久草久草久草| av三级在线观看| 久久久久久国产精品| 国产精品进线69影院| 亚洲开心激情| 黑丝av在线播放| 91丨九色丨国产| 日本福利专区在线观看| av在线亚洲天堂| 欧美大片日本大片免费观看| 夜色av.com| 国产一区二区三区久久悠悠色av| 波多野结衣精品在线| 久久亚洲精品一区二区| 亚洲自拍与偷拍| 国产精品一区二区av交换| 欧美黄片一区二区三区| 欧美一级色片| 妺妺窝人体色www在线观看| 美女脱光内衣内裤视频久久影院| 中文字幕+乱码+中文字幕| 精品无码一区二区三区爱欲| 黄页在线免费观看| 91黑人精品一区二区三区| 亚洲精品乱码电影在线观看| 精品国产自在精品国产浪潮| 亚洲 日韩 国产第一区| 久久精品论坛| 日日噜噜夜夜狠狠久久波多野| 国产视频在线免费观看| 日韩欧美在线观看视频| 久久久久这里只有精品| 91手机在线视频| 亚洲丝袜美腿一区| 调教在线观看| 一区二区三区产品免费精品久久75| 欧美日韩亚洲一区三区| 中文字幕日韩专区| 久久99精品网久久| 国内免费精品视频| 日韩欧美福利视频| 毛片网站在线看| 欧美一级欧美一级在线播放| 国产精品嫩草视频| 欧美日韩不卡在线视频| 国产小视频在线免费观看| 在线免费观看黄色| 色婷婷av一区二区三区之一色屋| 自拍欧美一区| 日韩av在线免费| 欧美激情一区二区三级高清视频| 婷婷亚洲久悠悠色悠在线播放| 久久综合九色综合欧美98| 日本一区二区三区国色天香| 久久成人在线| 欧美性xxxxx极品视频| 男女视频在线看| av首页在线观看| 一卡二卡三卡亚洲| 久热中文字幕在线观看| 三级影片在线看| av网站免费观看| 神马影院午夜我不卡影院| 色偷偷噜噜噜亚洲男人的天堂| 亚洲一级特黄毛片| 国产熟妇久久777777| 欧美一级大片在线视频| 成人eeuss影院在线观看| 国产suv精品一区二区三区| 亚洲欧洲自拍| 日本精品久久久久中文| 精品久久久无码中文字幕| 国产精品手机在线观看| 一区中文字幕在线观看| 熟女少妇内射日韩亚洲| 亚洲色图av在线| 性久久久久久久| 男人天堂v视频| 91久久精品午夜一区二区| 先锋影音男人站| av男人的天堂在线观看| 欧美一级爆毛片| 国产精品每日更新在线播放网址| 国产丝袜一区二区| 黄色一级片av| 九色91蝌蚪在线| 国产精品乱码妇女bbbb| 男人天堂视频网| 一二三区视频在线观看| 五月天色一区| 一级性生活毛片| 欧美成人禁片在线www| 久久久久性色av无码一区二区| 欧美日韩国产欧| 宅男一区二区三区| 一个人免费播放在线视频看片| 国产精品丝袜黑色高跟| 亚洲精品国产欧美| 日本精品一区二区三区不卡无字幕| 免费欧美一级片| 亚洲男同1069视频| 国产美女在线播放| 欧美亚洲另类视频| 欧美成人亚洲成人日韩成人| 亚洲一区二区三区不卡国产欧美| 自拍偷拍在线视频| 一区二区三区日本| 97aⅴ精品视频一二三区| 在线观看天堂| 亚洲欧美在线视频观看| 青青在线免费观看视频| 黄色电影网站在线观看| 国产色综合一区| 欧美hdsex| 亚洲国产精品久久人人爱潘金莲| 青青操在线视频| 精品伊人久久97| 自拍偷自拍亚洲精品被多人伦好爽|