? ? ? ?最近在項目中用到springBoot+tkMybatis涮母,在開發(fā)使用過程中遇到一些問題忆家,現(xiàn)在做下記錄總結(jié)庵芭。本文主要針對tkMybatis的使用進(jìn)行總結(jié)抑钟。
一涯曲、新增
?insert:根據(jù)對象T的屬性,生成插入語句在塔,并返回影響的行數(shù)
? ? ? ? ?備注:NULL字段也會插入進(jìn)行幻件;?但是需要指定該字段的jdbcType,否則拋出錯誤(Oracle是個奇葩蛔溃,其它好多數(shù)據(jù)庫都可以绰沥,不拋錯);如何指定字段的jdbcType城榛,參見高級用法揪利;如果T對象中有字段不想插入态兴,可以配置注解insertable=false;如果T對象中有字段不想插入狠持,可以配置注解Transient(該字段不參與自動生成語句);?
User user = newUser();
user.setId(101);
user.setUsername("admin");
user.setPassword("123456");
user.setEmail("");
userDAO.insert(user);
相當(dāng)于:insert into user(ID,username,password,email) values(101,'admin','123456','');
insertSelective:保存一個實(shí)體,null的屬性不會保存瞻润,會使用數(shù)據(jù)庫默認(rèn)值
? ? ? ? 備注:NULL字段不會被插入進(jìn)去喘垂,因此對象T的屬性不要使用8大簡單類型甜刻;需要使用其包裝類,我們實(shí)際環(huán)境運(yùn)用中常常是該函數(shù)(空屬性不插入)正勒;其余特性和insert相同得院;
二、刪除
delete:根據(jù)對象T的參數(shù)章贞,進(jìn)行絕對匹配祥绞,并刪除該記錄返回刪除的行數(shù)
? ? ? ? 備注:該方法如果入?yún)閚ull,則刪除的是表的所有數(shù)鸭限;該方法如果入?yún)閚ew T()蜕径,則刪除的是表的所有數(shù);條件采用的是絕對匹配败京;如果配置參數(shù)safeDelete沒有指定兜喻,是不允許空條件刪除,會拋錯(參加高級參數(shù)配置部分)赡麦;
deleteByPrimaryKey:根據(jù)主鍵對象朴皆,進(jìn)行刪除該主鍵所表述的記錄,并返回刪除的行數(shù)
? ? ? ? 備注:?如果<T>是單主鍵泛粹,那么直接傳遞主鍵對象即可遂铡,例如long、String等晶姊;如果<T>是復(fù)合主鍵忧便,可以傳遞<T>對象,對象的復(fù)合主鍵都存在值帽借;或者傳遞Map珠增,其中key為復(fù)合主鍵的key,也是可以的砍艾;復(fù)合主鍵情況用的較少蒂教;
userDAO.deleteByPrimaryKey(101);?
相當(dāng)于:delete?from?user?where?id=101?
三、修改
updateByPrimaryKey:根據(jù)對象T的參數(shù)的主鍵數(shù)據(jù)脆荷,進(jìn)行更新該記錄
? ? ? ? 備注:主鍵數(shù)據(jù)必須存在凝垛;如果T對象中的屬性為NULL,也會更新到數(shù)據(jù)庫中蜓谋,但需要設(shè)置jdbcType梦皮;(Oracle是個奇葩,其它好多數(shù)據(jù)庫都可以桃焕,不拋錯)剑肯;如何指定字段的jdbcType,參見高級用法观堂;如果T對象中有字段不想更新让网,可以配置注解updateable=false;如果T對象中有字段不想更新呀忧,可以配置注解Transient(該字段不參與自動生成語句);?
User?user?=new?User();?
user.setId(101);?
user.setUsername("joe");?
user.setPassword("joe");?
user.setEmail("");?
userDAO.updateByPrimaryKey(user);?
相當(dāng)于:update?user?set?username='joe',password='joe',email=''?where?id=101
updateByPrimaryKeySelective :根據(jù)對象T的參數(shù)的主鍵數(shù)據(jù),進(jìn)行更新該記錄
? ? ? ? 備注:主鍵數(shù)據(jù)必須存在溃睹;如果T對象中的屬性為NULL而账,不會更新到數(shù)據(jù)庫中;如果T對象中有字段不想更新因篇,可以配置注解updateable=false;如果T對象中有字段不想更新泞辐,可以配置注解Transient(該字段不參與自動生成語句);需要使用其包裝類,我們實(shí)際環(huán)境運(yùn)用中常常是該函數(shù)(空屬性不更新)竞滓;
User?user?=new?User();
user.setId(101);
user.setPassword("123456");
userDAO.updateByPrimaryKeySelective(user);
相當(dāng)于:update?user?set?password='123456'?where?id=101
updateByExample :
UserExample?example?=new?UserExample();
Criteria?criteria?=?example.createCriteria();
criteria.andIDEqualTo("101");
User?user?=new?User();
user.setPassword("123");
userDAO.updateByExample?(user,example);
相當(dāng)于:updateuser?set?password='123'?where?ID='101'
四铛碑、查詢
selectAll:查詢表中所有記錄,并返回<T>對象的集合
? ? ? ? 備注:該方法一般用于小表的全表查詢虽界,不適用于數(shù)據(jù)量達(dá)到或者超過K級別的情況
select:根據(jù)入?yún)⒌臈l件汽烦,進(jìn)行絕對匹配篩選,并返回<T>對象的集合
? ? ? ? 備注:該方法如果入?yún)閚ull莉御,則和selectAll的效果是一致的撇吞;該方法如果入?yún)ο蟠嬖冢瞧鋵傩远际莕ull礁叔,則和selectAll的效果是一致的牍颈;
selectByRowBounds :根據(jù)入?yún)⒌臈l件進(jìn)行分頁,進(jìn)行絕對匹配篩選琅关,并返回<T>對象的集合
? ? ? ? 備注:該方法與select一樣煮岁,只是重載了一個帶RowBounds的參數(shù)(不允許為null);因Mapper本身不支持方法重名涣易,因此就更換了函數(shù)名画机;如果外部分頁查詢是攔截RowBounds參數(shù)的,可以直接無縫對接新症;
selectOne :根據(jù)入?yún)⒌臈l件步氏,進(jìn)行絕對匹配篩選,并返回<T>對象
? ? ? ? 備注:該方法如果查詢到0-1個結(jié)果徒爹,則返回null或者<T>荚醒;如果該方法的條件查詢到多個,則拋出TooManyResultsException錯誤隆嗅;
selectCount :根據(jù)入?yún)⒌臈l件界阁,進(jìn)行絕對匹配篩選,并返回符合條件的結(jié)果總數(shù)
? ? ? ? 備注:該方法如果入?yún)閚ull胖喳,則返回的是表的記錄總數(shù)泡躯;條件采用的是絕對匹配;
selectByPrimaryKey :根據(jù)主鍵對象,查詢該主鍵所表示的<T>對象
? ? ? ? 備注:如果<T>是單主鍵精续,那么直接傳遞主鍵對象即可,例如long粹懒、String等重付;如果<T>是復(fù)合主鍵,可以傳遞<T>對象凫乖,對象的復(fù)合主鍵都存在值确垫;或者傳遞Map,其中key為復(fù)合主鍵的key帽芽,也是可以的删掀;復(fù)合主鍵情況用的較少;
? ? ? ? ?User?user?=?userDAO.selectByPrimaryKey(100);?
? ? ? ? 相當(dāng)于:select?*?from?user?where?id?=?100?
existsWithPrimaryKey :根據(jù)主鍵對象导街,判斷該主鍵所表示的<T>記錄是否存在
? ? ? ? 備注:和selectByPrimaryKey函數(shù)作用一致披泪,僅采用 0,1 結(jié)合rs.getBoolean來做返回值
5、時間查詢
在使用example進(jìn)行時間段查詢時搬瑰,需將時間轉(zhuǎn)換成與DB中對應(yīng)的時間格式字符串款票,然后再進(jìn)行查詢,否則會無法查詢到結(jié)果泽论。
例如:
Example.Criteria criteria = example.createCriteria();
if (null != layerBatchServiceDTO) {
SimpleDateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (null != layerBatchServiceDTO.getStartTime()) {
? ? ? ? criteria.andGreaterThanOrEqualTo("createTime", dateFormat.format(layerBatchServiceDTO.getStartTime()));
? ? }
if (null != layerBatchServiceDTO.getEndTime()) {
? ? ? ? criteria.andLessThanOrEqualTo("createTime", dateFormat.format(layerBatchServiceDTO.getEndTime()));
? ? }
}
本文部分內(nèi)容參考:https://blog.csdn.net/sinat_38419207/article/details/82907387