目錄
一、事务管理
1、确保数据库表的类型是InnoDB,而不是MyISAM
2、所有更新操作完成后,再执行commit
二、xml配置sql代码段
1、在xml中先用这个标签,包装代码段,配置id
语句,引入这个sql" >2、在需要这个代码段的地方,通过语句,引入这个sql
三、#和$的区别
四、注意对<、>做转义
五、依据字符串是否为空,动态组织sql语句
六、使用自定义的类型转换器
1、configuration xml文件配置
2、自定义类型转换器
3、mapper xml配置
七、resultMap的复用
mapper文件A
mapper文件B
首頁 資料庫 mysql教程 mybatis使用小贴士

mybatis使用小贴士

Jun 07, 2016 pm 03:56 PM
mybatis 事務管理 使用 分享

分享了以下tips: 一、事务管理 二、xml配置sql代码段 三、#和$的区别 四、注意对、做转义 五、依据字符串是否为空,动态组织sql语句 六、使用自定义的类型转换器 七、resultMap的复用 一、事务管理 用户执行一个动作,后台需依次更新多个表,如果其中有一个

分享了以下tips:

一、事务管理
二、xml配置sql代码段
三、#和$的区别
四、注意对做转义
五、依据字符串是否为空,动态组织sql语句
六、使用自定义的类型转换器
七、resultMap的复用

一、事务管理

用户执行一个动作,后台需依次更新多个表,如果其中有一个更新失败,则要回滚之前的更新。这种情况,就是事务回滚。 要支持事务操作,需要:

1、确保数据库表的类型是InnoDB,而不是MyISAM

(MyISAM不支持事务,这是一个坑,之前总结过 http://blog.csdn.net/lizeyang/article/details/9280253)

2、所有更新操作完成后,再执行commit

例如:
SqlSession session = getSqlSession();
int sqlResult = session.insert("insert a table", po);
int sqlResult = session.update("update b table", po);
//这时,前面的insert和update还没真正执行
session.commit();
//commit后,db才真正更新
session.close();
登入後複製

二、xml配置sql代码段

mybatis需要通过xml配置每次db操作的sql语句。如果多个sql语句中,包含了相同的sql语段,怎么办呢?复制粘贴?这显然不是一个好习惯。建议配置代码段,然后每个sql直接引用这个代码段。 语法:

1、在xml中先用这个标签,包装代码段,配置id

     <sql id="getFeedBackList_fragment">
from t_comment where refer_type = #{type} and
refer_id = #{referId} 
     </sql>
登入後複製

2、在需要这个代码段的地方,通过语句,引入这个sql

例如
<select id=&#39;getFeedBackList&#39; parameterType=&#39;map&#39; resultMap=&#39;feeback&#39;>
select id
<include refid="getFeedBackList_fragment"/>
order by
create_time desc
</select>
登入後複製

三、#和$的区别

当sql中有一些参数,需要调用时动态传入时,就需要在sql中写变量,调用时再传入变量。mybatis中,#和$,都是变量的修饰符。一般推荐用#。 #相当于jdbc中,对prepareStatement做set参数的操作,而$则相当于拼接了sql语句,再执行statament。prepareStatement、statament的区别,具体可以在网上搜下,这里就不赘述了。

四、注意对<、>做转义

其实,写xml文件,都得注意这个问题,要将>转义成> 要将<转义成< 。我们在写sql时,经常要用到<、>来筛选sql结果,更要牢记这个注意项。

五、依据字符串是否为空,动态组织sql语句

mabatis xml配置sql,对字符串的处理能力不够强大,对于判空这样常见的需求,还是得通过para!= null and para != ''来完成,没有相关的内建函数。 sql语句

六、使用自定义的类型转换器

假设有一个字段,数据库字段类型,是timestamp,当赋值到javabean时,希望变成对应的long值。怎么做呢?最原生态的一种选择,赋值给bean时,就是timestamp类型,之后再重新遍历数据,改成long值。这种做法,显然很搓,增加了业务逻辑的代码量,不利于转化逻辑复用。 其实,mybatis本身就支持自定义类型转换器,可以很好地支持这种需求。这里主要想告诉你,mybatis是有这种能力的,更详细的内容,可以再看官方教程。这里简单贴下我的示例。

1、configuration xml文件配置

<configuration>
 &hellip;&hellip;

<typeHandlers>
<typeHandler handler="test.TimeTypeHandler"
javaType="Long" jdbcType="TIME" />
</typeHandlers>
&hellip;&hellip;
</configuration>
登入後複製

2、自定义类型转换器

上面的handle为test.TimeTypeHandler,因此工程中,要写对应的test.TimeTypeHandler.java。转换逻辑,就在这个java文件中
package test;
public class TimeTypeHandler implements TypeHandler<Long>
{
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配置

<mapper namespace="xxxx">
&hellip;&hellip;
     //这里定义了ExpDownloadPo这个sql查询结果,要映射到java bean :test.ExpDownloadPo
<resultMap id="ExpDownloadPo"  type="test.ExpDownloadPo">
<id property="id" column="id" />
               //first_download_time这个数据,在赋值到firstDownloadTime时,要转转换,从jdbc的time型,转换成javaType的long型,具体怎么转换,因为前面第一点,定义了<typeHandlers><typeHandler handler="test.TimeTypeHandler" javaType="Long" jdbcType="TIME" /></typeHandlers>,因此会自动使用test.TimeTypeHandler这个转换器

<result property="firstDownloadTime" column="first_download_time" javaType="Long" jdbcType="TIME"/>
<result property="lastDownloadTime" column="last_download_time" javaType="Long" jdbcType="TIME"/>
</resultMap>
&hellip;&hellip;
</mapper >
登入後複製

七、resultMap的复用

我们一般会定义多个mapper.xml文件,将不同的功能,放到不同的xml中。如果mapper文件A需要使用mapper文件B中所定义的resultmap时,是可以直接使用的,请勿在文件B中重复定义resultmap。 具体使用方法是: 例如mapper A的namespace是com.blog.test,其中定义的resultmapid是testbean,那么,在文件B中,如果要用到这个resultmap,则用它的全名即可,也就是com.blog.test.testbean(namespace+resultmapid)

mapper文件A

<mapper namespace="com.blog.test">
&hellip;&hellip;
<resultMap id="testbean"  ></resultMap>
</mapper>
登入後複製

mapper文件B

<mapper namespace="B">
<select id="mysql" parameterType="map" resultMap="com.blog.test.testbean">
</mapper>
登入後複製
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
夸克網盤怎麼分享到百度網盤? 夸克網盤怎麼分享到百度網盤? Mar 14, 2024 pm 04:40 PM

  夸克網盤和百度網盤都是很便利的儲存工具,不少的用戶都在詢問這兩款軟體互通嗎?夸克網盤怎麼分享到百度網盤?下面就讓本站來為用戶們來仔細的介紹一下夸克網盤的文件怎麼保存到百度網盤方法吧。夸克網盤的文件怎麼保存到百度網盤方法1、想要知道怎麼把夸克網盤的文件轉到百度網盤,首先在夸克網盤上下載需要保存的文件,然後打開百度網盤客戶端後,選擇壓縮檔案要儲存的資料夾,雙擊開啟該資料夾。  2、開啟該資料夾後,點選視窗左上角區域的「上傳」。  3、在電腦中找到需要上傳的壓縮文件,點選選

crystaldiskmark是什麼軟體? -crystaldiskmark如何使用? crystaldiskmark是什麼軟體? -crystaldiskmark如何使用? Mar 18, 2024 pm 02:58 PM

CrystalDiskMark是一款適用於硬碟的小型HDD基準測試工具,可快速測量順序和隨機讀取/寫入速度。接下來就讓小編為大家介紹一下CrystalDiskMark,以及crystaldiskmark如何使用吧~一、CrystalDiskMark介紹CrystalDiskMark是一款廣泛使用的磁碟效能測試工具,用於評估機械硬碟和固態硬碟(SSD)的讀取和寫入速度和隨機I/O性能。它是一款免費的Windows應用程序,並提供用戶友好的介面和各種測試模式來評估硬碟效能的不同方面,並被廣泛用於硬體評

foob​​ar2000怎麼下載? -foobar2000怎麼使用 foob​​ar2000怎麼下載? -foobar2000怎麼使用 Mar 18, 2024 am 10:58 AM

foob​​ar2000是一款能隨時收聽音樂資源的軟體,各種音樂無損音質帶給你,增強版本的音樂播放器,讓你得到更全更舒適的音樂體驗,它的設計理念是將電腦端的高級音頻播放器移植到手機上,提供更便捷高效的音樂播放體驗,介面設計簡潔明了易於使用它採用了極簡的設計風格,沒有過多的裝飾和繁瑣的操作能夠快速上手,同時還支持多種皮膚和主題,根據自己的喜好進行個性化設置,打造專屬的音樂播放器支援多種音訊格式的播放,它還支援音訊增益功能根據自己的聽力情況調整音量大小,避免過大的音量對聽力造成損害。接下來就讓小編為大

BTCC教學:如何在BTCC交易所綁定使用MetaMask錢包? BTCC教學:如何在BTCC交易所綁定使用MetaMask錢包? Apr 26, 2024 am 09:40 AM

MetaMask(中文也叫小狐狸錢包)是一款免費的、廣受好評的加密錢包軟體。目前,BTCC已支援綁定MetaMask錢包,綁定後可使用MetaMask錢包進行快速登錄,儲值、買幣等,且首次綁定還可獲得20USDT體驗金。在BTCCMetaMask錢包教學中,我們將詳細介紹如何註冊和使用MetaMask,以及如何在BTCC綁定並使用小狐狸錢包。 MetaMask錢包是什麼? MetaMask小狐狸錢包擁有超過3,000萬用戶,是當今最受歡迎的加密貨幣錢包之一。它可免費使用,可作為擴充功能安裝在網絡

網易信箱大師怎麼用 網易信箱大師怎麼用 Mar 27, 2024 pm 05:32 PM

網易郵箱,作為中國網友廣泛使用的一種電子郵箱,一直以來以其穩定、高效的服務贏得了用戶的信賴。而網易信箱大師,則是專為手機使用者打造的信箱軟體,它大大簡化了郵件的收發流程,讓我們的郵件處理變得更加便利。那麼網易信箱大師該如何使用,具體又有哪些功能呢,下文中本站小編將為大家帶來詳細的內容介紹,希望能幫助到大家!首先,您可以在手機應用程式商店搜尋並下載網易信箱大師應用程式。在應用寶或百度手機助手中搜尋“網易郵箱大師”,然後按照提示進行安裝即可。下載安裝完成後,我們打開網易郵箱帳號並進行登錄,登入介面如下圖所示

百度網盤app怎麼用 百度網盤app怎麼用 Mar 27, 2024 pm 06:46 PM

在如今雲端儲存已成為我們日常生活和工作中不可或缺的一部分。百度網盤作為國內領先的雲端儲存服務之一,憑藉其強大的儲存功能、高效的傳輸速度以及便捷的操作體驗,贏得了廣大用戶的青睞。而且無論你是想要備份重要文件、分享資料,還是在線上觀看影片、聽取音樂,百度網盤都能滿足你的需求。但很多用戶可能對百度網盤app的具體使用方法還不了解,那麼這篇教學就將為大家詳細介紹百度網盤app如何使用,還有疑惑的用戶們就快來跟著本文詳細了解一下吧!百度雲網盤怎麼用:一、安裝首先,下載並安裝百度雲軟體時,請選擇自訂安裝選

詳解MyBatis動態SQL標籤中的Set標籤功能 詳解MyBatis動態SQL標籤中的Set標籤功能 Feb 26, 2024 pm 07:48 PM

MyBatis動態SQL標籤解讀:Set標籤用法詳解MyBatis是一個優秀的持久層框架,它提供了豐富的動態SQL標籤,可以靈活地建構資料庫操作語句。其中,Set標籤是用來產生UPDATE語句中SET子句的標籤,在更新作業中非常常用。本文將詳細解讀MyBatis中Set標籤的用法,以及透過具體的程式碼範例來示範其功能。什麼是Set標籤Set標籤用於MyBati

網路易雲音樂怎麼分享到微信朋友圈_網易雲音樂分享到微信朋友圈教程 網路易雲音樂怎麼分享到微信朋友圈_網易雲音樂分享到微信朋友圈教程 Mar 25, 2024 am 11:41 AM

1.首先我們進入到網易雲音樂中,然後在軟體首頁介面中,點選進入到歌曲的播放介面中。 2.然後在歌曲播放介面中,找到右上方的分享功能按鈕,如下圖紅框所示位置,點擊選擇分享的管道;在分享管道中,點擊底部的「分享至」選項,然後選擇第一個“微信朋友圈”,即可將內容分享至微信朋友圈。

See all articles