Oracle的批量操作
Oracle不支持VALUES(),(),()这种方式,所以不能用上一节所讲的方法。
有时候业务会包含很多次数据库操作,为了减少数据库连接,我们会选择一次提交大量sql,
这时我们会用到begin end,使用begin end需要注意的是,每个sql语句都要确保以";"结尾,代表一句sql结束。
-
begin
-
insert into tb_employee(id,last_name,email,gender,d_id) VALUES
-
(employee_seq.nextval,'Maya','mcl@qq.com','0',1);
-
insert into tb_employee(id,last_name,email,gender,d_id) VALUES
-
(employee_seq.nextval,'Kafka','kafsl@qq.com','0',2);
-
end;
还可以利用中间表,进行批量插入,这部分不熟悉,先跳过,有兴趣的朋友可以深入了解一下,
-
<insert id="addEmps">
-
begin
-
<foreach collection="emps" item="emp">
-
insert into tb_employee(id,last_name,email,gender,d_id) VALUES
-
(tb_employee_seq.nextval,#{emp.lastName},#{emp.email},#{emp.gender},#{emp.department.id});
-
</foreach>
-
end;
-
</insert>
内置参数
不只是方法传入的参数可以被用来判断、取值,我们还可以使用两个默认的内置参数:_parameter,_databaseId
_parameter:代表整个参数
单个参数:_ parameter就是这个参数
多个参数:参数会被封装成一个map; _parameter就是代表这个map
_databaseId:如果配置了<databaseIdProvider>标签,那么_databaseId就会有值
_databaseId就代表当前数据库的别名
-
<select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">
-
<if test="_databaseId='mysql'">
-
select * from tb_employee
-
</if>
-
<if test="_databaseId='oracle'">
-
select * from tb_employee
-
</if>
-
</select>
-
<select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">
-
select * from tb_employee
-
<if test="_parameter!=null">
-
where last_name = #{_parameter.lastName}
-
</if>
-
</select>
<bind>标签
这个标签可以将OGNL表达式的值绑定到一个变量中,方便后来引用这个变量的值
举个例子,我们之前模糊查询的时候出入Employee对象时,要设定它的lastName为"%青%",也就是说这个%,是要认为拼接的,可是有些人,希望只写一个"青",让%由框架帮我们提供,那该怎么办?
-
<select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">
-
select * from tb_employee
-
<if test="_parameter!=null">
-
where last_name like `%#{ lastName}%`
-
</if>
-
</select>
这么写行不行?肯定不行,like后面是要作为整体传入数据库查询的,这时候${}就派上用场了,
-
<select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">
-
select * from tb_employee
-
<if test="_parameter!=null">
-
where last_name like '%${ lastName}%'
-
</if>
-
</select>
由于${}不会进行预编译,所以它会将拼装完成的SQL语句传入数据库,这样就不会出问题了,当然这样不安全,所以我们希望还是使用#{},这样就不得不用<bind>标签了
-
<select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">
-
<bind name="_lastName" value="'%'+ lastName+'%'"/>
-
select * from tb_employee
-
<if test="_parameter!=null">
-
where last_name like #{_lastName}
-
</if>
-
</select>
<sql>标签
用于抽取重用的sql语句,比如我们上面的例子中,下面的语句使用了多次,这时就可以考虑使用<sql>标签。
last_name,email,gender,d_id
-
<sql id="column">
-
last_name,email,gender,d_id
-
</sql>
接着将原先是这句话的sql语句,用<include>标签替换
-
<insert id="addEmps">
-
<foreach collection="emps" item="emp" separator=";">
-
INSERT INTO tb_employee(<include refid="column"></include>) VALUES
-
(#{emp.lastName},#{emp.email},#{emp.gender},#{emp.department.id})
-
</foreach>
-
</insert>
-
@Test
-
public void TestSaveBach() throws IOException {
-
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
-
SqlSession openSession = sqlSessionFactory.openSession(true);
-
Department department = new Department(2);
-
Employee e1 = new Employee("Wendy","0","adcxs@qq.com",department);
-
Employee e2 = new Employee("Diyago","1","aaasaadccjdjj@qq.con",department);
-
List<Employee> employeeList = new ArrayList<>();
-
employeeList.add(e1);
-
employeeList.add(e2);
-
try{
-
EmployeeMapperDynamic mapper = openSession.getMapper(EmployeeMapperDynamic.class);
-
mapper.addEmps(employeeList);
-
}finally {
-
openSession.close();
-
}
-
}
我们还可以通过<property>标签,自定义一些属性
-
<insert id="addEmps">
-
<foreach collection="emps" item="emp" separator=";">
-
INSERT INTO tb_employee(
-
-
<include refid="column">
-
<property name="testColumn" value="test"/>
-
</include>
-
) VALUES
-
(#{emp.lastName},#{emp.email},#{emp.gender},#{emp.department.id})
-
</foreach>
-
</insert>
注意这里是用${}取值的
-
<sql id="column">
-
last_name,email,gender,d_id,${testColumn}
-
</sql>
DEBUG [main] - ==> Preparing: INSERT INTO tb_employee( last_name,email,gender,d_id,test ) VALUES (?,?,?,?) ; INSERT INTO tb_employee( last_name,email,gender,d_id,test ) VALUES (?,?,?,?)