一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 詳解MyBatis直接執行SQL查詢及數據批量插入

詳解MyBatis直接執行SQL查詢及數據批量插入

2020-03-24 13:17izumi JAVA教程

這篇文章主要介紹了MyBatis直接執行SQL查詢及數據批量插入的相關知識,需要的朋友一起學習吧

一、直接執行SQL查詢:

1、mappers文件節選

?
1
2
3
4
5
6
7
<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類節選

?
1
2
3
public interface SomeDAO{
List<InstanceModel> getInstanceModel(@Param("paramSQL")String sql);
}

3、注意事項

3.1:傳入方法的參數sql必須遵循以下規范"select XXX as instanceid, XXX as instancename ....." ,否則MyBatis無法自動將查詢結果變成Java對象。

3.2: mappers文件中的#{}語法與${}語法的區別:

默認情況下, #{}語法會促使MyBatis生成PreparedStatement屬性并且使用PreparedStatement的參數(=?)來設置值。如果你想直接將未更改的字符串代入到sql中,可以使用${}。

也就是說,MyBatis看到 #{}會認為你在給sql中的變量賦值,就像JDBC編程中給問號賦值一樣(比如MyBatis會判斷它的類型,并自動在前后加單引號)。而當MyBatis看到${}的時候會直接將之替換成變量的值而不做任何處理。

所以在使用${}的時候,不需要像#{}一樣寫"jdbcType=VARCHAR"之類的屬性。

3.3:resultType和resultMap

按照1中的寫法, < resultMap > 部分可以刪除不用了,因為在接下來的<select >中沒用使用定義的resultMap,而是使用了resultType。

所以我們可以看出,關于<select >返回值的定義有兩種寫法,一種是定義一個resultMap然后引用這個resultMap,還有一種就是直接使用resultType指定一個類的路徑。

二、批量插入數據

1、經驗告訴我們,使用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文件節選

?
1
2
<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類節選

?
1
2
3
public interface SomeDAO{
public void insertBatch(@Param("list")List<Student> students);
}

詳解mybatis批量插入數據

首先看看批處理的mapper.xml文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<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>

在批處理中,我發現有幾個需要注意的問題

1、主鍵的自動獲取,在insert中添加useGeneratedKeys=”true” keyProperty=”id”這兩個屬性無效,并且或中斷數據插入,如果id是數據庫自增的話,可以什么都不寫,在插入的語句中去除主鍵屬性,還有就是利用

?
1
2
3
4
<selectKey keyProperty="id" order="BEFORE"
resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>

注意 :<selectKey > 標簽在insert下只能存在一個;批處理的時候不適合使用<selectKey >,主鍵自增最好,或者指定
2,插入時間的獲取如上面所示,我用的是mysql,只要是mysql函數都可以拿來使用,插入時間和主鍵都是mysql函數中的一個。。。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产在线精品99一卡2卡 | 色图大全| 青青热久免费精品视频网站 | 三级无删减高清在线影院 | 国产成+人+综合+亚洲不卡 | 青青青草免费 | 国产精品成人一区二区1 | 亚洲视频999 | 亚洲AV无码专区国产乱码网站 | 半挠脚心半黄的网站 | 精品推荐国产麻豆剧传媒 | 毛片视频网站在线观看 | 亚洲AV精品无码喷水直播间 | 精品久久久久久国产 | 地址二地址三2021变更 | 欧美日韩国产最新一区二区 | 高清视频免费 | avtt在线观看 | 欧美成人免费草草影院视频 | 亚洲人尿尿 | 午夜十八岁禁 | 继的朋友无遮漫画免费观看73 | 亚洲大片免费看 | 欧美一区二区日韩一区二区 | 波多野结衣家庭教师 | 欧美色综合高清免费 | 国产情侣偷国语对白 | 精品一久久香蕉国产线看观 | 免费精品在线视频 | 色欲麻将 | 成年私人影院免费视频网站 | 亚洲成年www | 欧美在线一级视频 | 欧美帅老头oldmangay | 国产伦精品一区二区三区女 | www日本高清视频 | 免费看男女做好爽好硬视频 | 韩国三级日本三级香港三级黄 | 国产美女久久精品香蕉69 | 美女黄板视频 | 国产精品一级香蕉一区 |