一、直接執行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函數中的一個。。。