当前位置:网站首页>Dynamic SQL of ibatis
Dynamic SQL of ibatis
2022-07-05 11:28:00 【Full stack programmer webmaster】
1. Introduce
1 <select id="getUsers"
2
3 parameterClass="user"
4
5 resultMap="get-user-result">
6
7 select
8
9 id,
10
11 name,
12
13 sex
14
15 from t_user
16
17 <dynamic prepend="WHERE">
18
19 <isNotEmpty prepend="AND" property="name">
20
21 name like #name#
22
23 </isNotEmpty>
24
25 <isNotEmpty prepend="AND" property="address">
26
27 address like #address#
28
29 </isNotEmpty>
30
31 </dynamic>
32
33 </select>
adopt dynamic node , You can define a dynamic WHERE Clause . this WHERE Clause may contain two statements for name and address The judgment condition of the field . Whether these two fields are added to the search depends on the query conditions provided by the user .
The semantics of this node is , If the parameter class ”name” Property is not empty (isNotEmpty, That is, a non empty string ””), In the generated SQL Where The sentence includes the judgment condition (name like #name#), among #name# Will take the name Property value padding .
name Property corresponds to isNotEmpty node , because ibatis Will automatically determine whether to add prepend Prefix , here (name like #name#) yes WHERE The first conditional clause in clause , There is no need to AND Prefix , So automatically omit .
Decision nodes are not limited to isNotEmpty,ibatis Provides a wealth of decision definition functions . It can be divided into two categories :
One 、 Monism
Unary decision is the decision of attribute value itself , If the attribute is NULL, Whether it is null, etc .
In the above example isNotEmpty It's a typical unary decision .
The unary decision node has :
<isPropertyAvailable> Whether this property is provided in the parameter class
<isNotPropertyAvailable> And <isPropertyAvailable> contrary
<isNull> Whether the attribute value is NULL
<isNotNull> And <isNull> contrary
<isEmpty> If the property is Collection perhaps String, Its size whether <1,
If not the above two types , Through
String.valueOf( Property value )
Get it String After the value of type , Judge it size whether <1
<isNotEmpty> And <isEmpty> contrary .
Two 、 Binary decision
Binary decision has two decision parameters , One is the attribute name , It's the decision value , Such as
<isGreaterThan prepend=”AND” property=”age”
compareValue=”18″>
(age=#age#)
</isGreaterThan>
among ,property=”age” Property name specified ”age”,compareValue=”18” To specify
The judgment value is ”18”.
The above decision node isGreaterThan The corresponding semantics is : If age Property is greater than
18(compareValue), It's in SQL Add (age=#age#) Conditions .
The binary decision nodes are :
The node name Property value and compareValues The relationship between
<isEqual> equal .
<isNotEqual> Unequal .
<isGreaterThan> Greater than
<isGreaterEqual> Greater than or equal to
<isLessThan> Less than
<isLessEqual> Less than or equal to
2. The Works of Liezi
For some special symbols , If greater than >、 Less than no. < You need to write in <![CDATA[]] China can effectively , Otherwise, it will fail . 1、 dynamic SQL fragment
adopt SQL Fragments achieve code reuse
1 <!-- Dynamic conditional paging query -->
2 <sql id="sql_count">
3 select count(*)
4 </sql>
5 <sql id="sql_select">
6 select *
7 </sql>
8 <sql id="sql_where">
9 from icp
10 <dynamic prepend="where">
11 <isNotEmpty prepend="and" property="name">
12 name like '%$name$%'
13 </isNotEmpty>
14 <isNotEmpty prepend="and" property="path">
15 path like '%path$%'
16 </isNotEmpty>
17 <isNotEmpty prepend="and" property="area_id">
18 area_id = #area_id#
19 </isNotEmpty>
20 <isNotEmpty prepend="and" property="hided">
21 hided = #hided#
22 </isNotEmpty>
23 </dynamic>
24 <dynamic prepend="">
25 <isNotNull property="_start">
26 <isNotNull property="_size">
27 limit #_start#, #_size#
28 </isNotNull>
29 </isNotNull>
30 </dynamic>
31 </sql>
32 <select id="findByParamsForCount" parameterClass="map" resultClass="int">
33 <include refid="sql_count"/>
34 <include refid="sql_where"/>
35 </select>
36 <select id="findByParams" parameterClass="map" resultMap="icp.result_base">
37 <include refid="sql_select"/>
38 <include refid="sql_where"/>
39
40 </select>
2、 Number range query
The parameter name is fabricated , Non database fields , such as _img_size_ge、_img_size_lt Field
1 <isNotEmpty prepend="and" property="_img_size_ge">
2 <![CDATA[
3 img_size >= #_img_size_ge#
4 ]]>
5 </isNotEmpty>
6 <isNotEmpty prepend="and" property="_img_size_lt">
7 <![CDATA[
8 img_size < #_img_size_lt#
9 ]]>
10 </isNotEmpty>
11
12
Multiple use of one parameter is also allowed
1 <isNotEmpty prepend="and" property="_now">
2 <![CDATA[
3 execplantime >= #_now#
4 ]]>
5 </isNotEmpty>
6 <isNotEmpty prepend="and" property="_now">
7 <![CDATA[
8 closeplantime <= #_now#
9 ]]>
10 </isNotEmpty>
3、 Time range query
1 <isNotEmpty prepend="" property="_starttime">
2 <isNotEmpty prepend="and" property="_endtime">
3 <![CDATA[
4 createtime >= #_starttime#
5 and createtime < #_endtime#
6 ]]>
7 </isNotEmpty>
8 </isNotEmpty>
4、in Inquire about
1 <isNotEmpty prepend="and" property="_in_state">
2 state in ('$_in_state$')
3 </isNotEmpty>
5、like Inquire about
1 <isNotEmpty prepend="and" property="chnameone">
2 (chnameone like '%$chnameone$%' or spellinitial like '%$chnameone$%')
3 </isNotEmpty>
4 <isNotEmpty prepend="and" property="chnametwo">
5 chnametwo like '%$chnametwo$%'
6 </isNotEmpty>
6、or Conditions
1 <isEqual prepend="and" property="_exeable" compareValue="N">
2 <![CDATA[
3 (t.finished='11' or t.failure=3)
4 ]]>
5 </isEqual>
6
7 <isEqual prepend="and" property="_exeable" compareValue="Y">
8 <![CDATA[
9 t.finished in ('10','19') and t.failure<3
10 ]]>
11 </isEqual>
7、where Subquery
1 <isNotEmpty prepend="" property="exprogramcode">
2 <isNotEmpty prepend="" property="isRational">
3 <isEqual prepend="and" property="isRational" compareValue="N">
4 code not in
5 (select t.contentcode
6 from cms_ccm_programcontent t
7 where t.contenttype='MZNRLX_MA'
8 and t.programcode = #exprogramcode#)
9 </isEqual>
10 </isNotEmpty>
11 </isNotEmpty>
12
13 <select id="findByProgramcode" parameterClass="string" resultMap="cms_ccm_material.result">
14 select *
15 from cms_ccm_material
16 where code in
17 (select t.contentcode
18 from cms_ccm_programcontent t
19 where t.contenttype = 'MZNRLX_MA'
20 and programcode = #value#)
21 order by updatetime desc
22 </select>
9、 Use of functions
1 <!-- add to -->
2 <insert id="insert" parameterClass="RuleMaster">
3 insert into rulemaster(
4 name,
5 createtime,
6 updatetime,
7 remark
8 ) values (
9 #name#,
10 now(),
11 now(),
12 #remark#
13 )
14 <selectKey keyProperty="id" resultClass="long">
15 select LAST_INSERT_ID()
16 </selectKey>
17 </insert>
18 <!-- to update -->
19 <update id="update" parameterClass="RuleMaster">
20 update rulemaster set
21 name = #name#,
22 updatetime = now(),
23 remark = #remark#
24 where id = #id#
25 </update>
10、map Result set
1 <!-- Dynamic conditional paging query -->
2 <sql id="sql_count">
3 select count(a.*)
4 </sql>
5 <sql id="sql_select">
6 select a.id vid,
7 a.img imgurl,
8 a.img_s imgfile,
9 b.vfilename vfilename,
10 b.name name,
11 c.id sid,
12 c.url url,
13 c.filename filename,
14 c.status status
15 </sql>
16 <sql id="sql_where">
17 From secfiles c, juji b, videoinfo a
18 where
19 a.id = b. videoid
20 and b.id = c.segmentid
21 and c.status = 0
22 order by a.id asc,b.id asc,c.sortnum asc
23 <dynamic prepend="">
24 <isNotNull property="_start">
25 <isNotNull property="_size">
26 limit #_start#, #_size#
27 </isNotNull>
28 </isNotNull>
29 </dynamic>
30 </sql>
31 <!-- Returns the total number of records not downloaded -->
32 <select id="getUndownFilesForCount" parameterClass="map" resultClass="int">
33 <include refid="sql_count"/>
34 <include refid="sql_where"/>
35 </select>
36 <!-- Return records that have not been downloaded -->
37 <select id="getUndownFiles" parameterClass="map" resultClass="java.util.HashMap">
38 <include refid="sql_select"/>
39 <include refid="sql_where"/>
40 </select>
Publisher : Full stack programmer stack length , Reprint please indicate the source :https://javaforall.cn/109452.html Link to the original text :https://javaforall.cn
边栏推荐
- How does redis implement multiple zones?
- Repair animation 1K to 8K
- Solve the grpc connection problem. Dial succeeds with transientfailure
- DDoS attack principle, the phenomenon of being attacked by DDoS
- 【Office】Excel中IF函数的8种用法
- Startup process of uboot:
- Lombok makes ⽤ @data and @builder's pit at the same time. Are you hit?
- Harbor image warehouse construction
- Intelligent metal detector based on openharmony
- 871. Minimum Number of Refueling Stops
猜你喜欢
[JS learning notes 54] BFC mode
[JS] extract the scores in the string, calculate the average score after summarizing, compare with each score, and output
Ziguang zhanrui's first 5g R17 IOT NTN satellite in the world has been measured on the Internet of things
go语言学习笔记-分析第一个程序
Pytorch training process was interrupted
COMSOL--建立几何模型---二维图形的建立
Advanced technology management - what is the physical, mental and mental strength of managers
Codeforces Round #804 (Div. 2)
MySQL 巨坑:update 更新慎用影响行数做判断!!!
[crawler] bugs encountered by wasm
随机推荐
COMSOL--建立几何模型---二维图形的建立
How to understand super browser? What scenarios can it be used in? What brands are there?
shell脚本文件遍历 str转数组 字符串拼接
龙蜥社区第九次运营委员会会议顺利召开
Characteristics and electrical parameters of DDR4
Paradigm in database: first paradigm, second paradigm, third paradigm
AutoCAD -- mask command, how to use CAD to locally enlarge drawings
高校毕业求职难?“百日千万”网络招聘活动解决你的难题
uboot的启动流程:
Prevent browser backward operation
汉诺塔问题思路的证明
How to introduce devsecops into enterprises?
Empêcher le navigateur de reculer
Ziguang zhanrui's first 5g R17 IOT NTN satellite in the world has been measured on the Internet of things
[advertising system] incremental training & feature access / feature elimination
Idea set the number of open file windows
无密码身份验证如何保障用户隐私安全?
Is it difficult to apply for a job after graduation? "Hundreds of days and tens of millions" online recruitment activities to solve your problems
阻止瀏覽器後退操作
Three suggestions for purchasing small spacing LED display