电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Mybatis如何使用ognl表達式實現動態sql

瀏覽:3日期:2023-10-19 10:07:05
本文講述在mybatis中如何使用ognl表達式實現動態組裝sql語句

新建Users實體類:

public class Users { private Integer uid; private String userName; private String tel; //添加上面私有字段的get、set方法}

新建一個Dao接口類,mybatis配置文件在配置namespace屬性時需要加入這個類的完整類名,找到這個類里的方法執行:

public interface UserDao { /** * 依據userName查詢用戶信息 * @param user * @return */ List<Users> listUser(Users user); /** * 動態選擇條件 * @param user * @return */ List<Users> listUser2(Users user); /** * 動態范圍查詢 * @param uids * @return */ List<Users> listUser3(Integer[] uids); /** * 動態更新用戶信息 * @param user */ void updateUser(Users user); /** * 批量添加 * @param list */ void addBatch(List<Users> list); /** * 批量刪除 * @param ids */ void deleteBatch(int[] ids); /** * 批量更新 * @param list */ void updateBatch1(List<Users> list); /** * 批量更新 * @param list */ void updateBatch2(List<Users> list);}

新建mybatis的配置文件(下面代碼可以作為mybatis配置文件的模板,這里的namespace屬性可以設置為上面的dao類的完整類名):

<?xml version='1.0' encoding='utf-8'?><!DOCTYPE mapper PUBLIC '-//mybatis.org//DTD Mapper 3.0//EN''http://mybatis.org/dtd/mybatis-3-mapper.dtd'><!-- mapper根節點的namespace指定Dao接口的完整類名,因為mybatis在解析的時候要根據這個類名找到相應dao方法執行 --><mapper namespace=''> </mapper>

在mybatis配置文件中寫一條條件查詢sql語句:

<!-- 動態查詢(使用if拼接條件,適用于多選多的形式) --><select parameterType='users' resultMap='userMap'> select u_id, u_name, u_tel from user_info4 user_info <where><if test='userName != null and userName !=’’'> u_name = #{userName}</if><if test='tel != null and tel !=’’'> and u_tel = #{tel}</if> </where></select>

這里使用了where和if標簽,<where></where>意思就是sql語句中的where,當然,where直接在sql中寫出來也可以,<if></if>標簽就是條件判斷,test屬性中寫條件語句,如果test中的條件語句為true,那么標簽中的sql語句就會拼接到上面的sql語句中,所以這條sql語句的意思就是如果傳過來的Users對象中,userName字段不為null,或字段值不為空,那么就添加一個對userName的查詢,tel也是如此。

注意:在對tel字段的判斷時,標簽中的sql語句前加了一個and,如果前一條判斷為false,那么mybatis會自動將and關鍵字刪除。

<!-- 動態查詢(使用choose選擇條件,適用于多選一) --><select parameterType='users' resultMap='userMap'> select u_id, u_name, u_tel from user_info4 <choose><when test='userName != null and userName != ’’'> where u_name = #{userName}</when><when test='tel != null and tel != ’’'> where u_tel = #{tel}</when><otherwise> order by u_id desc</otherwise> </choose></select>

這里使用的是choose-when-otherwise標簽,有點類似于java中的switch-case-default選擇條件語句,相比于if標簽,這里只能選擇一個,即多選一。

在這條sql語句中,會按順序判斷when子句,如果所有的when子句都為false,則會執行otherwise子句中的sql語句。

<!-- 動態查詢(使用foreach范圍查詢,適用于in和or語句) --><!-- int[] ids = new int[]{1,2,3,4}; --><select parameterType='collection' resultMap='userMap'> select u_id, u_name, u_tel from user_info4 <where>u_id in<if test='array != null'> <foreach collection='array' item='id' open='(' separator=',' close=')'>#{id} </foreach></if> </where></select>

foreach標簽適用于范圍查詢(in和or語句),如遍歷一個id集合,查詢出集合中所有id對應的用戶。在foreach標簽中,collection屬性指定需要遍歷的集合的名稱,這里只有一個參數,所以可以隨意取;item指定遍歷的每一項的別名,open指定在遍歷前需要加上的內容,separator指定每遍歷一個后加上的內容,close指定遍歷完后需要加上的內容,如遍歷上面的ids集合,那么最終得到的內容就是 (1,2,3,4) 。

<!-- 動態更新(使用set動態更新字段) --><update parameterType='users' > update user_info4 <trim prefix='set' suffixOverrides=','><if test='userName != null and userName != ’’'> u_name = #{userName},</if><if test='tel != null and tel != ’’'> u_tel = #{tel}</if> </trim> <!-- where u_id = #{uid} --> <where>u_id = #{uid} </where></update>

trim標簽用于動態設值,例如在更新數據時,可以動態將改變的字段設置。在trim標簽中,prefix屬性表示在更新字段之前添加set關鍵字,suffixOverrides表示將最后一個更新字段的逗號替換成suffix指定的空格符,如果不指定suffix默認就是空格。

<!-- 批量添加,利用sql的特性 --><insert parameterType='list'> insert into user_info4(u_id, u_name, u_tel) values <foreach collection='list' item='user' separator=','>(#{user.uid}, #{user.userName}, #{user.tel}) </foreach></insert>

foreach標簽不僅可以用于范圍查詢,還可以遍歷集合用于批量添加。

因為可以利用sql的特性,例如:insert into user_info4(u_name, u_tel) values(’’, ’’), (’’, ’’), (’’, ’’);這樣執行這條sql語句就可以實現批量添加。

<!-- 批量更新1,這一種方式兼容性較好,當數據量大時 --><update parameterType='list'> <foreach collection='list' item='user' separator=';'>update user_info4<set> u_name = #{user.userName}</set>where u_id = #{user.uid} </foreach></update>

foreach還可以用于遍歷出多條sql語句,使得一次可以執行多條sql,當然,如果需要MySql執行多條批量操作時,需要開啟批量查詢功能,即在MySql的url中加入 allowMultiQueries=true 。

<!-- 批量更新2,使用MySQL的case when語句 --> <update parameterType='list'>update user_info4 set u_name = case u_id<foreach collection='list' item='user' separator=' '> when #{user.uid} then #{user.userName}</foreach>endwhere u_id in<foreach collection='list' item='user' open='(' close=')' separator=','> #{user.uid}</foreach> </update>

這里使用的是MySql中的case when語句來更新的,基本語法:

update user_info4 set u_name = case u_idwhen 3 then ’游客1’when 4 then ’游客2’endwhere u_id in(3,4);Mybatis中的ognl使用總結

經常在寫mapper中用到一些OGNL,但是沒怎么總結,使用方法一直模模糊糊的。抽點時間,查了別人的blog,做個簡單的總結

1.概念

OGNL,Object Graph Navigation Language,是一種強大的表達式語言,網上搜索這個概念,多是和structs有關的。但是在mybatis中OGNL應用很廣的;

2.基本參數

Mybatis中常用的OGNL表達式有以下:

e1 or e2

e1 and e2

e1 == e2,e1 eq e2

e1 != e2,e1 neq e2

e1 lt e2:小于

e1 lte e2:小于等于,其他gt(大于),gte(大于等于)

e1 in e2

e1 not in e2

e1 + e2,e1 * e2,e1/e2,e1 - e2,e1%e2

!e,not e:非,求反

e.method(args)調用對象方法

e.property對象屬性值

e1[ e2 ]按索引取值,List,數組和Map

@class@method(args)調用類的靜態方法

@class@field調用類的靜態字段值

更加詳細的介紹可以參考官網的介紹:https://commons.apache.org/proper/commons-ognl/language-guide.html

在一定意義上說,mybatis中的動態sql也是基于OGNL表達式的。其中常用的元素有如下幾種:

if choose(when,otherwise) trim where set foreach3.應用;

OGNL在mybatis中的應用,主要有兩種;

1)動態SQL表達式;

舉個栗子:

<code class='language-xml hljs has-numbering'><span class='hljs-tag'><<span class='hljs-title'>select</span> <span class='hljs-attribute'>id</span>=<span class='hljs-value'>'demo1'</span> <span class='hljs-attribute'>...</span>></span></code><pre name='code' class='prettyprint'><code class='language-xml hljs has-numbering'> select id, name from users <span class='hljs-tag'><<span class='hljs-title'>bind</span> <span class='hljs-attribute'>name</span>=<span class='hljs-value'>'nameLike'</span> <span class='hljs-attribute'>value</span>=<span class='hljs-value'>'’%’ + name + ’%’'</span>/></span> <span class='hljs-tag'><<span class='hljs-title'>where</span>></span><span class='hljs-tag'><<span class='hljs-title'>if</span> <span class='hljs-attribute'>test</span>=<span class='hljs-value'>'name != null and name != ’’'</span>></span> name like ’${nameLike}’<span class='hljs-tag'></<span class='hljs-title'>if</span>></span> <span class='hljs-tag'></<span class='hljs-title'>where</span>></span><span class='hljs-tag'></<span class='hljs-title'>select</span>></span></code>

其中的bind中的value值會使用OGNL計算,ps,其中bind的參數調用只能用$獲取;

2)${param}參數中

<code class='language-xml hljs has-numbering'><span class='hljs-tag'><<span class='hljs-title'>select</span> <span class='hljs-attribute'>id</span>=<span class='hljs-value'>'demo2'</span> <span class='hljs-attribute'>...</span>></span> select id,name from users <span class='hljs-tag'><<span class='hljs-title'>where</span>></span><span class='hljs-tag'><<span class='hljs-title'>if</span> <span class='hljs-attribute'>test</span>=<span class='hljs-value'>'name != null and name != ’’'</span>></span> name like ’${’%’ + name + ’%’}’<span class='hljs-tag'></<span class='hljs-title'>if</span>></span> <span class='hljs-tag'></<span class='hljs-title'>where</span>></span><span class='hljs-tag'></<span class='hljs-title'>select</span>></span></code>

此處寫的是 ${’%’ + name + ’%’},而不是 %${name}%,這兩種方式的結果一樣,但是處理過程不一樣。

ps,說明一下#和$的區別:${} 為原樣輸出,你傳什么,sql里就填入什么,比如有引號它也會原樣填到sql里。#{} 會使用 PreparedStatement,變量處用 ? 代替。

在能使用 #{} 盡量使用它吧,可以防止sql注入。

以下是一個OGNL的調用靜態方法的示例:

<select parameterType='java.lang.String' resultType='java.lang.String'> select title from song_question where questionState = #{value} <if test='@Ognl@isSolve(value[0],0)'> order by questionTime desc </if> <if test='@Ognl@isSolve(value[0],1)'> order by answerTime desc </if> limit 0,1</select>

靜態方法如下:

public static boolean isSolve(Object o,String soleState){ if(o == null) return false; String str = null; if(o instanceof String[]){ String[]objects = (String[])o; str = objects[0]; }else if(o instanceof Character){ Character c = (Character) o; str = Character.toString(c); } if(StringUtils.equals(str, soleState)) return true; return false;}

如果值為0,則order by questionTime desc 根據字段questionTime排序。

如果值為1,則order by answerTime desc根據字段answerTime排序。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Mybatis 數據庫
相關文章:
主站蜘蛛池模板: 空压机网_《压缩机》杂志 | 塑料检查井_双扣聚氯乙烯增强管_双壁波纹管-河南中盈塑料制品有限公司 | 柔性测斜仪_滑动测斜仪-广州杰芯科技有限公司 | 高压微雾加湿器_工业加湿器_温室喷雾-昌润空气净化设备 | 衬氟旋塞阀-卡套旋塞阀-中升阀门首页| 灌木树苗-绿化苗木-常绿乔木-价格/批发/基地 - 四川成都途美园林 | 耐腐蚀泵,耐腐蚀真空泵,玻璃钢真空泵-淄博华舜耐腐蚀真空泵有限公司 | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 行吊_电动单梁起重机_双梁起重机_合肥起重机_厂家_合肥市神雕起重机械有限公司 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | IP检测-检测您的IP质量 | 注塑模具_塑料模具_塑胶模具_范仕达【官网】_东莞模具设计与制造加工厂家 | 厌氧工作站-通用型厌氧工作站-上海胜秋科学仪器有限公司 | 杭州可当科技有限公司—流量卡_随身WiFi_AI摄像头一站式解决方案 | 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | 自动化生产线-自动化装配线-直流电机自动化生产线-东莞市慧百自动化有限公司 | 沧州友城管业有限公司-内外涂塑钢管-大口径螺旋钢管-涂塑螺旋管-保温钢管生产厂家 | 诗词大全-古诗名句 - 古诗词赏析| 鹤壁创新仪器公司-全自动量热仪,定硫仪,煤炭测硫仪,灰熔点测定仪,快速自动测氢仪,工业分析仪,煤质化验仪器 | VOC检测仪-甲醛检测仪-气体报警器-气体检测仪厂家-深恒安科技有限公司 | 北京乾茂兴业科技发展有限公司 | 工业胀紧套_万向节联轴器_链条-规格齐全-型号选购-非标订做-厂家批发价格-上海乙谛精密机械有限公司 | 电镀标牌_电铸标牌_金属标贴_不锈钢标牌厂家_深圳市宝利丰精密科技有限公司 | 2-羟基泽兰内酯-乙酰蒲公英萜醇-甘草查尔酮A-上海纯优生物科技有限公司 | 微信小程序定制,广州app公众号商城网站开发公司-广东锋火 | 中宏网-今日新闻-财经新闻| 低粘度纤维素|混凝土灌浆料|有机硅憎水粉|聚羧酸减水剂-南京斯泰宝 | 空压机商城|空气压缩机|空压机配件-压缩机网旗下商城 | 南京种植牙医院【官方挂号】_南京治疗种植牙医院那个好_南京看种植牙哪里好_南京茀莱堡口腔医院 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 西门子伺服电机维修,西门子电源模块维修,西门子驱动模块维修-上海渠利 | 成都软件开发_OA|ERP|CRM|管理系统定制开发_成都码邻蜀科技 | WF2户外三防照明配电箱-BXD8050防爆防腐配电箱-浙江沃川防爆电气有限公司 | 螺杆式冷水机-低温冷水机厂家-冷冻机-风冷式-水冷式冷水机-上海祝松机械有限公司 | 【星耀裂变】_企微SCRM_任务宝_视频号分销裂变_企业微信裂变增长_私域流量_裂变营销 | TPE_TPE热塑性弹性体_TPE原料价格_TPE材料厂家-惠州市中塑王塑胶制品公司- 中塑王塑胶制品有限公司 | 玉米加工设备,玉米深加工机械,玉米糁加工设备.玉米脱皮制糁机 华豫万通粮机 | 板材品牌-中国胶合板行业十大品牌-环保板材-上海声达板材 | 冷水机,风冷冷水机,水冷冷水机,螺杆冷水机专业制造商-上海祝松机械有限公司 | 杭州实验室尾气处理_实验台_实验室家具_杭州秋叶实验设备有限公司 | 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛调查出轨取证公司_青岛婚外情取证-青岛探真调查事务所 |