最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

mybatis使用小貼士

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 15:06:51
文檔

mybatis使用小貼士

mybatis使用小貼士:分享了以下tips: 一、事務(wù)管理 二、xml配置sql代碼段 三、#和$的區(qū)別 四、注意對(duì)、做轉(zhuǎn)義 五、依據(jù)字符串是否為空,動(dòng)態(tài)組織sql語(yǔ)句 六、使用自定義的類型轉(zhuǎn)換器 七、resultMap的復(fù)用 一、事務(wù)管理 用戶執(zhí)行一個(gè)動(dòng)作,后臺(tái)需依次更新多個(gè)表,如果其中有一個(gè)
推薦度:
導(dǎo)讀mybatis使用小貼士:分享了以下tips: 一、事務(wù)管理 二、xml配置sql代碼段 三、#和$的區(qū)別 四、注意對(duì)、做轉(zhuǎn)義 五、依據(jù)字符串是否為空,動(dòng)態(tài)組織sql語(yǔ)句 六、使用自定義的類型轉(zhuǎn)換器 七、resultMap的復(fù)用 一、事務(wù)管理 用戶執(zhí)行一個(gè)動(dòng)作,后臺(tái)需依次更新多個(gè)表,如果其中有一個(gè)

分享了以下tips: 一、事務(wù)管理 二、xml配置sql代碼段 三、#和$的區(qū)別 四、注意對(duì)、做轉(zhuǎn)義 五、依據(jù)字符串是否為空,動(dòng)態(tài)組織sql語(yǔ)句 六、使用自定義的類型轉(zhuǎn)換器 七、resultMap的復(fù)用 一、事務(wù)管理 用戶執(zhí)行一個(gè)動(dòng)作,后臺(tái)需依次更新多個(gè)表,如果其中有一個(gè)

分享了以下tips:

一、事務(wù)管理
二、xml配置sql代碼段
三、#和$的區(qū)別
四、注意對(duì)<、>做轉(zhuǎn)義
五、依據(jù)字符串是否為空,動(dòng)態(tài)組織sql語(yǔ)句
六、使用自定義的類型轉(zhuǎn)換器
七、resultMap的復(fù)用

一、事務(wù)管理

用戶執(zhí)行一個(gè)動(dòng)作,后臺(tái)需依次更新多個(gè)表,如果其中有一個(gè)更新失敗,則要回滾之前的更新。這種情況,就是事務(wù)回滾。 要支持事務(wù)操作,需要:

1、確保數(shù)據(jù)庫(kù)表的類型是InnoDB,而不是MyISAM

(MyISAM不支持事務(wù),這是一個(gè)坑,之前總結(jié)過(guò) http://blog.csdn.net/lizeyang/article/details/9280253)

2、所有更新操作完成后,再執(zhí)行commit

例如:
SqlSession session = getSqlSession();
int sqlResult = session.insert("insert a table", po);
int sqlResult = session.update("update b table", po);
//這時(shí),前面的insert和update還沒(méi)真正執(zhí)行
session.commit();
//commit后,db才真正更新
session.close();

二、xml配置sql代碼段

mybatis需要通過(guò)xml配置每次db操作的sql語(yǔ)句。如果多個(gè)sql語(yǔ)句中,包含了相同的sql語(yǔ)段,怎么辦呢?復(fù)制粘貼?這顯然不是一個(gè)好習(xí)慣。建議配置代碼段,然后每個(gè)sql直接引用這個(gè)代碼段。 語(yǔ)法:

1、在xml中先用這個(gè)標(biāo)簽,包裝代碼段,配置id

 
from t_comment where refer_type = #{type} and
refer_id = #{referId} 
 

2、在需要這個(gè)代碼段的地方,通過(guò)語(yǔ)句,引入這個(gè)sql

例如

三、#和$的區(qū)別

當(dāng)sql中有一些參數(shù),需要調(diào)用時(shí)動(dòng)態(tài)傳入時(shí),就需要在sql中寫變量,調(diào)用時(shí)再傳入變量。mybatis中,#和$,都是變量的修飾符。一般推薦用#。 #相當(dāng)于jdbc中,對(duì)prepareStatement做set參數(shù)的操作,而$則相當(dāng)于拼接了sql語(yǔ)句,再執(zhí)行statament。prepareStatement、statament的區(qū)別,具體可以在網(wǎng)上搜下,這里就不贅述了。

四、注意對(duì)<、>做轉(zhuǎn)義

其實(shí),寫xml文件,都得注意這個(gè)問(wèn)題,要將>轉(zhuǎn)義成> 要將<轉(zhuǎn)義成< 。我們?cè)趯憇ql時(shí),經(jīng)常要用到<、>來(lái)篩選sql結(jié)果,更要牢記這個(gè)注意項(xiàng)。

五、依據(jù)字符串是否為空,動(dòng)態(tài)組織sql語(yǔ)句

mabatis xml配置sql,對(duì)字符串的處理能力不夠強(qiáng)大,對(duì)于判空這樣常見(jiàn)的需求,還是得通過(guò)para!= null and para != ''來(lái)完成,沒(méi)有相關(guān)的內(nèi)建函數(shù)。 sql語(yǔ)句

六、使用自定義的類型轉(zhuǎn)換器

假設(shè)有一個(gè)字段,數(shù)據(jù)庫(kù)字段類型,是timestamp,當(dāng)賦值到j(luò)avabean時(shí),希望變成對(duì)應(yīng)的long值。怎么做呢?最原生態(tài)的一種選擇,賦值給bean時(shí),就是timestamp類型,之后再重新遍歷數(shù)據(jù),改成long值。這種做法,顯然很搓,增加了業(yè)務(wù)邏輯的代碼量,不利于轉(zhuǎn)化邏輯復(fù)用。 其實(shí),mybatis本身就支持自定義類型轉(zhuǎn)換器,可以很好地支持這種需求。這里主要想告訴你,mybatis是有這種能力的,更詳細(xì)的內(nèi)容,可以再看官方教程。這里簡(jiǎn)單貼下我的示例。

1、configuration xml文件配置


 ……




……

2、自定義類型轉(zhuǎn)換器

上面的handle為test.TimeTypeHandler,因此工程中,要寫對(duì)應(yīng)的test.TimeTypeHandler.java。轉(zhuǎn)換邏輯,就在這個(gè)java文件中
package test;
public class TimeTypeHandler implements TypeHandler
{
private final String TIME_TYPE = "yyyy-MM-dd HH:mm:ss";

public long strToLongTime(String dateStr)
{
if (null == dateStr)
return 0L;

SimpleDateFormat sdf = new SimpleDateFormat(TIME_TYPE);
Date date = new Date();
try
{
date = sdf.parse(dateStr);
}
catch (ParseException e)
{
e.printStackTrace();
}
if (date == null)
return 0L;

System.out.println(date);
return date.getTime();
}

public Long getResult(ResultSet arg0, String arg1) throws SQLException
{
String datestr = arg0.getString(arg1);
return strToLongTime(datestr);
}

public Long getResult(ResultSet arg0, int arg1) throws SQLException
{
String datestr = arg0.getString(arg1);
return strToLongTime(datestr);
}

public Long getResult(CallableStatement arg0, int arg1) throws SQLException
{
String datestr = arg0.getString(arg1);
return strToLongTime(datestr);
}

public void setParameter(PreparedStatement arg0, int arg1, Long arg2, JdbcType arg3) throws SQLException
{
if (arg2 == null)
{
arg2 = 0L;
}

Date date = new Date(arg2);
SimpleDateFormat sdf = new SimpleDateFormat(TIME_TYPE);
String datetime = sdf.format(date);
arg0.setString(arg1, datetime);
}

} 

3、mapper xml配置


……
 //這里定義了ExpDownloadPo這個(gè)sql查詢結(jié)果,要映射到j(luò)ava bean :test.ExpDownloadPo


 //first_download_time這個(gè)數(shù)據(jù),在賦值到firstDownloadTime時(shí),要轉(zhuǎn)轉(zhuǎn)換,從jdbc的time型,轉(zhuǎn)換成javaType的long型,具體怎么轉(zhuǎn)換,因?yàn)榍懊娴谝稽c(diǎn),定義了,因此會(huì)自動(dòng)使用test.TimeTypeHandler這個(gè)轉(zhuǎn)換器




……

七、resultMap的復(fù)用

我們一般會(huì)定義多個(gè)mapper.xml文件,將不同的功能,放到不同的xml中。如果mapper文件A需要使用mapper文件B中所定義的resultmap時(shí),是可以直接使用的,請(qǐng)勿在文件B中重復(fù)定義resultmap。 具體使用方法是: 例如mapper A的namespace是com.blog.test,其中定義的resultmapid是testbean,那么,在文件B中,如果要用到這個(gè)resultmap,則用它的全名即可,也就是com.blog.test.testbean(namespace+resultmapid)

mapper文件A


……

mapper文件B