如果傳入的是單參數(shù)且參數(shù)類(lèi)型是一個(gè)List的時(shí)候,collection屬性值為list
如果傳入的是單參數(shù)且參數(shù)類(lèi)型是一個(gè)array數(shù)組的時(shí)候,collection的屬性值為array
如果傳入的參數(shù)是多個(gè)的時(shí)候,我們就需要把它們封裝成一個(gè)Map了,當(dāng)然單參數(shù)也可以封裝成map,實(shí)際上如果你在傳入?yún)?shù)的時(shí)候,在MyBatis里面也是會(huì)把它封裝成一個(gè)Map的,
map的key就是參數(shù)名,所以這個(gè)時(shí)候collection屬性值就是傳入的List或array對(duì)象在自己封裝的map里面的key
具體用法如下:
<!-- 批量保存(foreach插入多條數(shù)據(jù)兩種方法)int addEmpsBatch(@Param("emps") List<Employee> emps); --><!-- MySQL下批量保存,可以foreach遍歷 mysql支持values(),(),()語(yǔ)法 --> //推薦使用<insert id="addEmpsBatch">INSERT INTO emp(ename,gender,email,did)VALUES<foreach collection="emps" item="emp" separator=",">(#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})</foreach></insert><!-- 這種方式需要數(shù)據(jù)庫(kù)連接屬性allowMutiQueries=true的支持 如jdbc.url=jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true --><insert id="addEmpsBatch"><foreach collection="emps" item="emp" separator=";">INSERT INTO emp(ename,gender,email,did)VALUES(#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})</foreach></insert>使用ExecutorType.BATCH
Mybatis內(nèi)置的ExecutorType有3種,默認(rèn)為simple,該模式下它為每個(gè)語(yǔ)句的執(zhí)行創(chuàng)建一個(gè)新的預(yù)處理語(yǔ)句,單條提交sql;而batch模式重復(fù)使用已經(jīng)預(yù)處理的語(yǔ)句,并且批量執(zhí)行所有更新語(yǔ)句,顯然batch性能將更優(yōu); 但batch模式也有自己的問(wèn)題,比如在Insert操作時(shí),在事務(wù)沒(méi)有提交之前,是沒(méi)有辦法獲取到自增的id,這在某型情形下是不符合業(yè)務(wù)要求的
具體用法如下
//批量保存方法測(cè)試@Testpublic void testBatch() throws IOException{SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();//可以執(zhí)行批量操作的sqlSessionSqlSession openSession = sqlSessionFactory.openSession(ExecutorType.BATCH);//批量保存執(zhí)行前時(shí)間long start = System.currentTimeMillis();try {EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);for (int i = 0; i < 1000; i++) {mapper.addEmp(new Employee(UUID.randomUUID().toString().substring(0, 5), "b", "1"));}openSession.commit();long end = System.currentTimeMillis();//批量保存執(zhí)行后的時(shí)間System.out.println("執(zhí)行時(shí)長(zhǎng)" + (end - start));//批量 預(yù)編譯sql一次==》設(shè)置參數(shù)==》10000次==》執(zhí)行1次677//非批量(預(yù)編譯=設(shè)置參數(shù)=執(zhí)行 )==》10000次1121} finally {openSession.close();}}mapper和mapper.xml如下
public interface EmployeeMapper {//批量保存員工Long addEmp(Employee employee);}<mapper namespace="com.jourwon.mapper.EmployeeMapper"<!--批量保存員工 --><insert id="addEmp">insert into employee(lastName,email,gender)values(#{lastName},#{email},#{gender})</insert></mapper>如何獲取生成的主鍵對(duì)于支持主鍵自增的數(shù)據(jù)庫(kù)(MySQL)
<insert id="insertUser" useGeneratedKeys="true" keyProperty="userId" >insert into user(user_name, user_password, create_time)values(#{userName}, #{userPassword} , #{createTime, jdbcType= TIMESTAMP})</insert> parameterType 可以不寫(xiě),Mybatis可以推斷出傳入的數(shù)據(jù)類(lèi)型 。如果想要訪問(wèn)主鍵,那么應(yīng)當(dāng)parameterType 應(yīng)當(dāng)是java實(shí)體或者M(jìn)ap 。這樣數(shù)據(jù)在插入之后 可以通過(guò)ava實(shí)體或者M(jìn)ap 來(lái)獲取主鍵值 。通過(guò) getUserId獲取主鍵
不支持主鍵自增的數(shù)據(jù)庫(kù)(Oracle)
對(duì)于像Oracle這樣的數(shù)據(jù),沒(méi)有提供主鍵自增的功能,而是使用序列的方式獲取自增主鍵 ??梢允褂茫約electKey>標(biāo)簽來(lái)獲取主鍵的值,這種方式不僅適用于不提供主鍵自增功能的數(shù)據(jù)庫(kù),也適用于提供主鍵自增功能的數(shù)據(jù)庫(kù)<selectKey>一般的用法
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問(wèn)題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專(zhuān)業(yè)人士給予相關(guān)指導(dǎo)!
「愛(ài)刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- 重陽(yáng)節(jié)的來(lái)歷兒童故事
- 流鼻血和癌癥是否有關(guān)系 勿忽視身體發(fā)出的求救信號(hào)
- 手指發(fā)麻可能與身體大病有關(guān) 尤其是上半身疾病
- 有關(guān)土地方面,農(nóng)民務(wù)必清楚 一畝地等于多少平方米?
- 有關(guān)肩周炎的誤區(qū) 肩周炎的自我康復(fù)訓(xùn)練法
- 睡眠健身與“性愛(ài)”也有關(guān)系?
- 相親成功率與心理年齡有關(guān)?
- 高二下冊(cè)地理知識(shí)點(diǎn)總結(jié) 高二地理知識(shí)點(diǎn)總結(jié)
- 八年級(jí)上冊(cè)英語(yǔ)筆記整理 初二英語(yǔ)下冊(cè)知識(shí)點(diǎn)
- 有關(guān)環(huán)境的小視頻 環(huán)保宣傳視頻短片
