詳解MyBatis直接履行SQL查詢及數據批量拔出。本站提示廣大學習愛好者:(詳解MyBatis直接履行SQL查詢及數據批量拔出)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解MyBatis直接履行SQL查詢及數據批量拔出正文
1、直接履行SQL查詢:
1、mappers文件節選
<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類節選
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指定一個類的途徑。
2、批量拔出數據
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文件節選
<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類節選
public interface SomeDAO{ public void insertBatch(@Param("list")List<Student> students); }
詳解mybatis批量拔出數據
起首看看批處置的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>
在批處置中,我發明有幾個須要留意的成績
1、主鍵的主動獲得,在insert中添加useGeneratedKeys=”true” keyProperty=”id”這兩個屬性有效,而且或中止數據拔出,假如id是數據庫自增的話,可以甚麼都不寫,在拔出的語句中去除主鍵屬性,還有就是應用
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer"> SELECT LAST_INSERT_ID() </selectKey>
留意 :<selectKey > 標簽在insert下只能存在一個;批處置的時刻不合適應用<selectKey >,主鍵自增最好,或許指定
2,拔出時光的獲得如下面所示,我用的是mysql,只需是mysql函數都可以拿來應用,拔出時光和主鍵都是mysql函數中的一個。。。