因為oracle數(shù)據(jù)庫沒有直接支持主鍵值增值,而且批量添加的語句也和MySQL有一定的區(qū)別,這里特意做個記錄,雖然都在經(jīng)常用,但是怕忘記
首先我們建立個數(shù)據(jù)庫的表和一個自增長序列
--測試用用戶表
create table t_user(
u_id int primary key not null,
u_name varchar2(20),
u_sex varchar2(2),
u_age number(3)
);
--測試用用戶表序列
create sequence seq_t_user
increment by 1 --每次加1
start with 1 --開始于1
nomaxvalue --不設置最大值
minvalue 1--最小值1,可以設置nominvalue 無最小值
nocycle --不循環(huán)
nocache --不緩存
mybatis映射mapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lovo.mapper.UserMapper">
<insert id="batchAddUser" parameterType="java.util.List">
insert into t_user (u_id, u_name,u_sex,u_age)
(select
seq_t_user.nextval,temp.* from (
<foreach collection="list" item="user" separator="union all">
select
#{user.name,jdbcType = VARCHAR} u_name,
#{user.sex ,jdbcType = VARCHAR} u_sex,
#{user.age,jdbcType = NUMERIC} u_age
from dual
</foreach>
) temp
)
</insert>
</mapper>
oreach的主要用在構(gòu)建in條件中,它可以在SQL語句中進行迭代一個集合。
foreach元素的屬性主要有 item,index,collection,open,separator,close。
item表示集合中每一個元素進行迭代時的別名,index指定一個名字,用于表示在迭代過程中,每次迭代到的位置,open表示該語句以什么開始,separator表示在每次進行迭代之間以什么符號作為分隔符,close表示以什么結(jié)束,在使用foreach的時候最關(guān)鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況 下,該屬性的值是不一樣的,主要有一下3種情況:
1.如果傳入的是單參數(shù)且參數(shù)類型是一個List的時候,collection屬性值為list
2.如果傳入的是單參數(shù)且參數(shù)類型是一個array數(shù)組的時候,collection的屬性值為array
3.如果傳入的參數(shù)是多個的時候,我們就需要把它們封裝成一個Map了,當然單參數(shù)也可以封裝成map
Mybatis oracle jdbcType對照表
image.png