MyBatis日常筆記記錄08 動態sql

2022-09-09 15:21:26 字數 4960 閱讀 6483

一、什麼是動態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.編寫測試類

@test

public

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.編寫測試類

@test

public

void

testselectstudentswhere()

}

3.動態sql-foreach

迴圈j**a中的數值,list集合的,主要用在sql的in語句中

sql中語句是: select * from student where id in(1001,1002,1003);

在開始foreach前先了解然後通過字串拼接的方法來得到上面的語句

@test

public

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

.編寫測試類

@test

public

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 表...