oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
最近做项目遇到一个挺纠结的问题,由于业务的关系,DB的数据表无法确定,在使用过程中字段可能会增加,这样在insert时给我造成了很大的困扰。
先来看一下最终我是怎么实现的:
<insert id="batchInsertLine" parameterType="HashMap">
<![CDATA[
INSERT INTO tg_fcst_lines(${lineColumn})
select result.*,sq_fcst_lines.nextval from(
]]>
<foreach collection="lineList" item="item" index="index" separator="union all" >
(select
<foreach collection="item" index="key" item="_value" separator=",">
#{_value}
</foreach>
from dual)
</foreach>
<![CDATA[) result]]>
</insert>
由于数据表不确定,所以我无法确定我要insert的字段,由于是批量insert,确定value值也挺费劲。
我传给mybatis的参数是一个map:
Map insertMap = new HashMap();
insertMap.put("lineColumn",lineColumn);
insertMap.put("lineList", lineList);
lineColumn是一个字符串,lineList是一个list:
List<Map> lineList = new ArrayList();
lineList里存放的是map,map的键对应数据表的字段,值是你要insert的值,这样就可以通过foreach取出list的值作为insert语句的value,但由于map是无序的,存放的顺序和
遍历时取值的顺序不一定一致,所以为了确保insert字段和值可以一一对应,可以通过遍历一次map来取出key拼接一个字符串作为insert的字段
String lineColumn = ""; //拼接的SQL,作为insert语句的一部分
[java] view plaincopy
Map<String,String> lineMap = lineList.get(0);
for (String key : lineMap.keySet()) {
lineColumn +=key+",";
}
lineColumn +="LINE_ID";
这里的line)id是一个自增的字段,在语句中直接写序列会报错,所以先遍历list将取出的值作为result,在取出result的所有值,连同序列一起作为insert的值。
在取值的时候使用两个foreace嵌套来实现,外层的foreach遍历list,里层的foreach遍历map。
以上内容是本文给大家介绍的oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert的全部叙述,希望大家喜欢。
相关推荐
-
MyBatis批量插入(insert)数据操作
在程序中封装了一个List集合对象,然后需要把该集合中的实体插入到数据库中,由于项目使用了Spring+MyBatis的配置,所以打算使用MyBatis批量插入,由于之前没用过批量插入,在网上找了一些资料后最终实现了,把详细过程贴出来. 实体类TrainRecord结构如下: public class TrainRecord implements Serializable { private static final long serialVersionUID = -12069604621179
-
mybatis创建一个或多个新用户 insert 字段和表名不确定时动态添加问题
创建用户: /** * 创建一个或多个新用户 insert 字段和表名不确定时动态添加 */ @Test public void createAccount() { String lineColumn = ""; Map<String, Object> paramsMap = new HashMap<String, Object>(); Map<String, Object> dataMap = new HashMap<String, Obje
-
MyBatis在insert插入操作时返回主键ID的配置(推荐)
很多时候,在向数据库插入数据时,需要保留插入数据的id,以便进行后续的update操作或者将id存入其他表作为外键. 但是,在默认情况下,insert操作返回的是一个int值,并且不是表示主键id,而是表示当前SQL语句影响的行数... 接下来,我们看看MyBatis如何在使用MySQL和Oracle做insert插入操作时将返回的id绑定到对象中. MySQL用法: <insert id="insert" parameterType="com.test.User&qu
-
MyBatis中insert操作返回主键的实现方法
在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能 针对Sequence主键而言,在执行insert sql前必须指定一个主键值给要插入的记录,如Oracle.DB2,可以采用如下配置方式: <insert id="add" parameterType="vo.Category"> <selectKey resultType="
-
Mybatis 中的insertOrUpdate操作
下面一段代码给大家介绍了Mybatis 中的insertOrUpdate操作,具体代码如下所示: <insert id="insertOrUpdate"> insert into base_person (pname, idcard, gender, nation, source_flag, create_time) values <foreach collection="list" item="p" index="i
-
Oracle+Mybatis的foreach insert批量插入报错的快速解决办法
最近做一个批量导入的需求,将多条记录批量插入数据库中. 解决思路:在程序中封装一个List集合对象,然后把该集合中的实体插入到数据库中,因为项目使用了MyBatis,所以打算使用MyBatis的foreach功能进行批量插入.期间遇到了"SQL 命令未正确结束 "的错误,最终解决,记录下来供以后查阅和学习. 首先,在网上参考了有关Mybatis的foreach insert的资料,具体如下: foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach
-
oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
最近做项目遇到一个挺纠结的问题,由于业务的关系,DB的数据表无法确定,在使用过程中字段可能会增加,这样在insert时给我造成了很大的困扰. 先来看一下最终我是怎么实现的: <insert id="batchInsertLine" parameterType="HashMap"> <