詳解MyBatis直接執(zhí)行SQL查詢及數(shù)據(jù)批量插入
一、直接執(zhí)行SQL查詢:
1、mappers文件節(jié)選
<resultMap id="AcModelResultMap" type="com.izumi.InstanceModel">
<result column="instanceid" property="instanceID" jdbcType="VARCHAR" />
<result column="instancename" property="instanceName" jdbcType="VARCHAR" />
</resultMap>
<select id="getInstanceModel" resultType="com.izumi.InstanceModel">
${paramSQL}
</select>
2、DAO類節(jié)選
public interface SomeDAO{
List<InstanceModel> getInstanceModel(@Param("paramSQL")String sql);
}
3、注意事項
3.1:傳入方法的參數(shù)sql必須遵循以下規(guī)范"select XXX as instanceid, XXX as instancename ....." ,否則MyBatis無法自動將查詢結(jié)果變成Java對象。
3.2: mappers文件中的#{}語法與${}語法的區(qū)別:
默認(rèn)情況下, #{}語法會促使MyBatis生成PreparedStatement屬性并且使用PreparedStatement的參數(shù)(=?)來設(shè)置值。如果你想直接將未更改的字符串代入到sql中,可以使用${}。
也就是說,MyBatis看到 #{}會認(rèn)為你在給sql中的變量賦值,就像JDBC編程中給問號賦值一樣(比如MyBatis會判斷它的類型,并自動在前后加單引號)。而當(dāng)MyBatis看到${}的時候會直接將之替換成變量的值而不做任何處理。
所以在使用${}的時候,不需要像#{}一樣寫"jdbcType=VARCHAR"之類的屬性。
3.3:resultType和resultMap
按照1中的寫法, < resultMap > 部分可以刪除不用了,因為在接下來的<select >中沒用使用定義的resultMap,而是使用了resultType。
所以我們可以看出,關(guān)于<select >返回值的定義有兩種寫法,一種是定義一個resultMap然后引用這個resultMap,還有一種就是直接使用resultType指定一個類的路徑。
二、批量插入數(shù)據(jù)
1、經(jīng)驗告訴我們,使用insert into XXX values(XX)(XXX)(XXX),比使用insert into XXX values(XX),insert into XXX values(XXX),insert into XXX values(XXX)效率要高。
2、在MyBatis中的用法
2.1、mappers文件節(jié)選
<insert id="insertBatch" > insert into student ( <include refid="Base_Column_List" /> ) values <foreach collection="list" item="item" index="index" separator=","> (null,#{item.name},#{item.sex},#{item.address},#{item.telephone},#{item.tId}) </foreach>
</insert>
2.2、DAO類節(jié)選
public interface SomeDAO{
public void insertBatch(@Param("list")List<Student> students);
}
詳解mybatis批量插入數(shù)據(jù)
首先看看批處理的mapper.xml文件
<insert id="insertbatch" parameterType="java.util.List">
<selectKey keyProperty="fetchTime" order="BEFORE"
resultType="java.lang.String">
SELECT CURRENT_TIMESTAMP()
</selectKey>
insert into kangaiduoyaodian ( depart1, depart2, product_name,
generic_name, img, product_specification, unit,
approval_certificate, manufacturer, marketPrice, vipPrice,
website, fetch_time, productdesc ) values
<foreach collection="list" item="item" index="index"
separator=",">
( #{item.depart1}, #{item.depart2}, #{item.productName},
#{item.genericName}, #{item.img},
#{item.productSpecification}, #{item.unit},
#{item.approvalCertificate}, #{item.manufacturer},
#{item.marketprice}, #{item.vipprice}, #{item.website},
#{fetchTime}, #{item.productdesc} )
</foreach>
</insert>
在批處理中,我發(fā)現(xiàn)有幾個需要注意的問題
1、主鍵的自動獲取,在insert中添加useGeneratedKeys=”true” keyProperty=”id”這兩個屬性無效,并且或中斷數(shù)據(jù)插入,如果id是數(shù)據(jù)庫自增的話,可以什么都不寫,在插入的語句中去除主鍵屬性,還有就是利用
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer"> SELECT LAST_INSERT_ID() </selectKey>
注意 :<selectKey > 標(biāo)簽在insert下只能存在一個;批處理的時候不適合使用<selectKey >,主鍵自增最好,或者指定
2,插入時間的獲取如上面所示,我用的是mysql,只要是mysql函數(shù)都可以拿來使用,插入時間和主鍵都是mysql函數(shù)中的一個。。。
相關(guān)文章
利用java和sqlserver建立簡易圖書管理系統(tǒng)的完整步驟
圖書館管理系統(tǒng)是圖書館管理工作中不可缺少的部分,它對于圖書館的管理者和使用者都非常重要,下面這篇文章主要給大家介紹了關(guān)于利用java和sqlserver建立簡易圖書管理系統(tǒng)的完整步驟,需要的朋友可以參考下2022-06-06
SpringBoot如何實(shí)現(xiàn)定時任務(wù)示例詳解
使用定時任務(wù)完成一些業(yè)務(wù)邏輯,比如天氣接口的數(shù)據(jù)獲取,定時發(fā)送短信,郵件。以及商城中每天用戶的限額,定時自動收貨等等,這篇文章主要給大家介紹了關(guān)于SpringBoot如何實(shí)現(xiàn)定時任務(wù)的相關(guān)資料,需要的朋友可以參考下2021-10-10
基于SpringBoot和Hutool工具包實(shí)現(xiàn)驗證碼的案例
隨著安全性的要求越來越高,目前項目中很多都會使用驗證碼,只要涉及到登錄,絕大多數(shù)都會有驗證的要求,驗證碼的形式也是多種多樣,更復(fù)雜的圖形驗證碼和行為驗證碼已經(jīng)成為了更流行的趨勢,本文給大家介紹了SpringBoot Hutool實(shí)現(xiàn)驗證碼的案例,需要的朋友可以參考下2024-05-05
JDK8中的HashMap初始化和擴(kuò)容機(jī)制詳解
這篇文章主要介紹了JDK8中的HashMap初始化和擴(kuò)容機(jī)制,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06

