詳解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、注意事項(xiàng)
3.1:傳入方法的參數(shù)sql必須遵循以下規(guī)范"select XXX as instanceid, XXX as instancename ....." ,否則MyBatis無(wú)法自動(dòng)將查詢結(jié)果變成Java對(duì)象。
3.2: mappers文件中的#{}語(yǔ)法與${}語(yǔ)法的區(qū)別:
默認(rèn)情況下, #{}語(yǔ)法會(huì)促使MyBatis生成PreparedStatement屬性并且使用PreparedStatement的參數(shù)(=?)來(lái)設(shè)置值。如果你想直接將未更改的字符串代入到sql中,可以使用${}。
也就是說(shuō),MyBatis看到 #{}會(huì)認(rèn)為你在給sql中的變量賦值,就像JDBC編程中給問號(hào)賦值一樣(比如MyBatis會(huì)判斷它的類型,并自動(dòng)在前后加單引號(hào))。而當(dāng)MyBatis看到${}的時(shí)候會(huì)直接將之替換成變量的值而不做任何處理。
所以在使用${}的時(shí)候,不需要像#{}一樣寫"jdbcType=VARCHAR"之類的屬性。
3.3:resultType和resultMap
按照1中的寫法, < resultMap > 部分可以刪除不用了,因?yàn)樵诮酉聛?lái)的<select >中沒用使用定義的resultMap,而是使用了resultType。
所以我們可以看出,關(guān)于<select >返回值的定義有兩種寫法,一種是定義一個(gè)resultMap然后引用這個(gè)resultMap,還有一種就是直接使用resultType指定一個(gè)類的路徑。
二、批量插入數(shù)據(jù)
1、經(jīng)驗(yàn)告訴我們,使用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)有幾個(gè)需要注意的問題
1、主鍵的自動(dòng)獲取,在insert中添加useGeneratedKeys=”true” keyProperty=”id”這兩個(gè)屬性無(wú)效,并且或中斷數(shù)據(jù)插入,如果id是數(shù)據(jù)庫(kù)自增的話,可以什么都不寫,在插入的語(yǔ)句中去除主鍵屬性,還有就是利用
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer"> SELECT LAST_INSERT_ID() </selectKey>
注意 :<selectKey > 標(biāo)簽在insert下只能存在一個(gè);批處理的時(shí)候不適合使用<selectKey >,主鍵自增最好,或者指定
2,插入時(shí)間的獲取如上面所示,我用的是mysql,只要是mysql函數(shù)都可以拿來(lái)使用,插入時(shí)間和主鍵都是mysql函數(shù)中的一個(gè)。。。
相關(guān)文章
Java開發(fā)深入分析講解二叉樹的遞歸和非遞歸遍歷方法
樹是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹中稱為結(jié)點(diǎn))按分支關(guān)系組織起來(lái)的結(jié)構(gòu),很象自然界中的樹那樣。樹結(jié)構(gòu)在客觀世界中廣泛存在,如人類社會(huì)的族譜和各種社會(huì)組織機(jī)構(gòu)都可用樹形象表示,本篇介紹二叉樹的遞歸與非遞歸遍歷的方法2022-05-05springboot項(xiàng)目test文件夾下帶main方法的類不能運(yùn)行問題
這篇文章主要介紹了springboot項(xiàng)目test文件夾下帶main方法的類不能運(yùn)行問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11SpringBoot前后端分離項(xiàng)目之打包、部署到服務(wù)器詳細(xì)圖文流程
作為后臺(tái)開發(fā),項(xiàng)目打包部署是經(jīng)常性的操作,下面這篇文章主要給大家介紹了關(guān)于SpringBoot前后端分離項(xiàng)目之打包、部署到服務(wù)器的相關(guān)資料,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12Java實(shí)現(xiàn)Web應(yīng)用中的定時(shí)任務(wù)(實(shí)例講解)
下面小編就為大家分享一篇Java實(shí)現(xiàn)Web 應(yīng)用中的定時(shí)任務(wù)的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11通過(guò)Java實(shí)現(xiàn)在Word中創(chuàng)建可填充表單
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Java代碼,以編程方式在Word中創(chuàng)建可填充表單,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-03-03