mybatis框架的動態sql語句
今天突然聽到動態sql語句這個名字,我想了一下,好像腦袋裡面沒有這個概念;上網查了查,動態和靜態都分別是什麼?
拼接sql語句來實現增刪改查,可以讓代碼復用性增強;
靜態sql就是平常寫死的sql語句;
非mybatis框架的持久層
從前我的動態sql是這樣拼接,通過一個str空字元串,判斷傳來的參數是否為空,如果為空不在where 1=1 後面拼接,如果傳過來了,那麼就拼接;
/**
* 獲取分頁數據
*/
@Override
public List<Map<String, Object>> getPage(int start, int rows, Map map) {
// TODO Auto-generated method stub
//排序參數
String str = "";
if(map.get("sort")!=null){
str = " order by "+map.get("sort")+" "+map.get("order");
}
System.out.println("select id,number,driver,store,type,color,volume,capacity,state from tb_car "+setParams(map)+str+" limit "+start+","+rows);
return BaseDao.selectMap("select id,number,driver,store,type,color,volume,capacity,state from tb_car "+setParams(map)+str+" limit "+start+","+rows, null);
}
/**
* 封裝參數
* @param map
* @return
*/
private String setParams(Map map){
//查詢參數
String str1 = " where 1=1 ";
Object id = map.get("id");
//拼接id
if(id!=null&&!"".equals(id)){
str1 += " and id ="+id;
}
//拼接numbmer
Object number = map.get("number");
//拼接numbmer
if(number!=null&&!"".equals(number)){
str1 += " and number ="+number;
}
return str1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
使用Mybatis框架
現在學了Mybatis框架,動態sql就可以更改成使用
<where></where>標籤嵌套<if></if>標籤來拼接字元串,這裡<where>有一個潛規則(mybatis底層框架封裝的一個小功能),如果第一個條件是 and 或者or 那麼就直接替換成where,這樣的好處是我們不用在sql語句後面拼接where 1=1 這個條件,使用<where>標籤就可以替換and和or;
<?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">
<!--dao層介面的全路徑-->
<mapper namespace="com.aaa.mb.dao.EmpDao">
<!--動態sql-->
<select id="getList" parameterType="Map" resultType="Map">
select * from emp
<where>
<if test="empno != null and empno != """>
and empno = #{empno}
</if>
<if test="ename != null and ename != """>
and ename like "%"||#{ename}||"%"
</if>
<if test="job != null and job != """>
and job = #{job}
</if>
<if test="beginTime != null and beginTime != """>
and hiredate > to_date(#{beginTmie}, "yyyy-mm-dd")
</if>
<if test="endTime != null and endTime != """>
and hiredate < to_date(#{endTmie}, "yyyy-mm-dd")
</if>
</where>
</select>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
補充:Map傳值的大小寫問題
我的mybatis版本
mybatis的sql語句的編寫的欄位名,可以為小寫,例如第一個and之後的empno的資料庫內為大寫,這裡寫EMPNO,EMPno,EmpNo都不影響查詢結果,意思就是.xml文件裡面的欄位名都不區分大小寫。
<select id="getList" parameterType="Map" >
。。。。。。此處為省略的代碼。。。
<if test="empno1 != null and empno1 != """>
and empno = #{empno1}
</if>
。。。。。。此處為省略的代碼。。。
1
2
3
4
5
6
但是後面那個empno1就有講究了,其他三個empno1,都是Map的put方法的傳入的key值,key值必須得與這三個值相同。例如:
Map paramMap = new HashMap();
paramMap.put("empno1",9876);
1
2
如有不對,請多多指正!感謝!


※SpringCloud之服務提供與調用(Ribbon,Feign)
※前後端分離「vue + .netcore 補程」之基於Vuex的許可權驗證探究
TAG:程序員小新人學習 |