一、什麼是動態sql
動態sql,通過mybatis提供的各種標籤隊條件作出判斷以實現動態拼接sql語句。這裡的條件判斷使用的表示式為ognl表示式。常用的動態sql標籤有、、、等。
二、動態sql的好處
動態 sql,主要用於解決查詢條件不確定的情況:在程式執行期間,根據使用者提交的查詢條件進行
查詢。提交的查詢條件不同,執行的 sql 語句不同。若將每種可能的情況均逐一列出,對所有條件進行
排列組合,將會出現大量的 sql 語句。此時,可使用動態 sql 來解決這樣的問題。
三、常用的動態sql標籤方法演示
1.動態sql-if
是判斷條件的,
語法
部分sql語句
a.在介面中定義乙個方法
//動態sql-if,使用j**a物件作為引數
listselectstudentif(student student);
<
select
id="selectstudentif"
resulttype
="com.example.domain.student"
>
select id, name, email, age from student
where id>0 /*id > 0:避免第一條判斷不執行時,sql語句會發生錯誤,如where and age>?(錯誤語法)*/
<
if test
="name !=null and name !=''"
>
and name = #
if>
<
if test
="age>0"
>
and age > #
if>
select
>
c.編寫測試類
@testpublic
void
testselectstudentsif()
}
2.動態sql-where
標籤用來包含多個的,當多個if有乙個成立時,會自動增加乙個where關鍵字,並去掉if中多餘的 and,or等
a.在介面中定義乙個方法
//動態sql-where
listselectstudentwhere(student student);
<
select
id="selectstudentwhere"
resulttype
="com.example.domain.student"
>
select id, name, email, age from student
<
where
>
<
if test
="name !=null and name !=''"
>
and name = #
if>
<
if test
="age>0"
>
and age > #
if>
where
>
select
>
c.編寫測試類
@testpublic
void
testselectstudentswhere()
}
3.動態sql-foreach
迴圈j**a中的數值,list集合的,主要用在sql的in語句中
sql中語句是: select * from student where id in(1001,1002,1003);
在開始foreach前先了解然後通過字串拼接的方法來得到上面的語句
@testpublic
void
testfor()
builder.deletecharat(builder.length()-1);
//迴圈結尾 ')'
sql = sql +builder.tostring();
system.out.println("sql=="+sql);
}
foreach本質上用到上面的字串拼接的方法
collection :表示介面中的方法引數的型別,如果是數值使用array,如果是list集合使用list
item :自定義的,表示陣列和集合成員變數
open : 迴圈開始時的字元
close : 迴圈結束時的字元
separator : 集合成員之間的分隔符
a.在介面中定義方法
//foreach用法1
listselectforeachone(listidlist);
//foreach用法2
listselectforeachtwo(liststulist);
b .
<
select
id="selectforeachone"
resulttype
="com.example.domain.student"
>
select * from student where id in
<
foreach
collection
="list"
item
="myid"
open
="("
close
=")"
separator
=","
>
#
foreach
>
select
>
<
select
id="selectforeachtwo"
resulttype
="com.example.domain.student"
>
select * from student where id in
<
foreach
collection
="list"
item
="stu"
open
="("
close
=")"
separator
=","
>
#
foreach
>
select
>
c .編寫測試類
@testpublic
void
testselectstudentsforeachone()
}@test
public
void
testselectstudentsforeachtwo()
}
4.動態sql-**片段
sql**片段,就是復用一些語法
步驟:1.先定義 sql語句 ,表名 , 欄位等
2.再使用,
演示:
<
sql
id="studentsql"
>
select id, name, age, email from student
sql>
<
select
id="selectstudentif"
resulttype
="com.example.domain.student"
>
/*select id, name, email, age from student*/
<
include
refid
="studentsql"
/>
where id>0 /*id > 0:避免第一條判斷不執行時,sql語句會發生錯誤,如where and age>?(錯誤語法)*/
<
if test
="name !=null and name !=''"
>
and name = #
if>
<
if test
="age>0"
>
and age > #
if>
select
>
Mybatis學習筆記 08 連線池
我們知道,jdbc運算元據庫,建立connection的開銷是十分大的,而mybatis實際上是對jdbc的封裝,還是避免不了建立鏈結帶來的大開銷,不過mybatis內部其實還是整合了自帶的連線池。對於頻繁建立導致的高消耗,我們的處理辦法就是引入連線池機制,所謂連線池,就是我們預先建立一些連線,在使...
django日常記錄
1 使用反向工程 前置條件 django專案中setting檔案的資料庫已經配置好。沒有執行過遷移命令 第一步必須是python manage.py inspectdb 反向工程後的manytomany的字段,需手動自己建一張表,外來鍵也要自己提前想好,在模型中建立,然後手動在models中新增就行...
Oracle日常記錄
oracle 資料型別number m,n 中m表示的是所有有效數字的位數,n表示的是小數字的位數。m的範圍是1 38,即最大38位。我以為,m表示整數字數,n表示小數字數,在專案中,死活都儲存不了。切記!varchar2 100 表示可以儲存100個字元,50個漢字。nvarchar2 100 表...