ps:如果想批量插入数据并返回主键请查看https://my.oschina.net/zudajun/blog/674946
需要修改mybatis源码。
1.传入写好的sql传入mybatis
mapper文件
<select id="createTempTable" parameterType="map" >
${sql}<!-- 注意这里是$而不是# -->
</select>
mappers文件中的#{}语法与${}语法的区别:
默认情况下, #{}语法会促使MyBatis生成PreparedStatement属性并且使用PreparedStatement的参数(=?)来设置值。如果你想直接将未更改的字符串代入到sql中,可以使用${}。
也就是说,MyBatis看到 #{}会认为你在给sql中的变量赋值,就像JDBC编程中给问号赋值一样(比如MyBatis会判断它的类型,并自动在前后加单引号)。而当MyBatis看到${}的时候会直接将之替换成变量的值而不做任何处理。
所以在使用${}的时候,不需要像#{}一样写"jdbcType=VARCHAR"之类的属性。
在执行create table table_name as select 。。。的时候,select 的字段不能为null,否则报错,信息:ORA-01723: 不允许长度为 0 的列
2.单挑插入数据库并返回主键
<insert id="addUserListTest" parameterType="com.pay.phone.entity.SysUser">
<!-- keyProperty的值,谁写在前边返回那个值,不能返回多个,不知如何返回 -->
<selectKey resultType="string" order="AFTER" keyProperty="user_account,user_id">
<!-- SELECT CONCAT(sys_user_id.currval,'') FROM DUAL -->
<!--SELECT SYS_GUID() as user_id,SYS_GUID() as user_account FROM DUAL -->
select max(to_number(user_id)) from SYS_USER
</selectKey>
INSERT INTO SYS_USER (USER_ID,USER_ACCOUNT,USER_PASSWORD,USER_STATE,CREATE_TIME,LAST_LOGIN_TIME,USER_REMARK,USER_THEME,USER_SCOPE)
SELECT <!-- CONCAT(sys_user_id.nextval,'') USER_ID, -->
(select max(to_number(user_id))+1 from SYS_USER) USER_ID,
#{user_account ,jdbcType=VARCHAR} USER_ACCOUNT,
#{user_password ,jdbcType=VARCHAR} USER_PASSWORD,
#{user_state ,jdbcType=VARCHAR} USER_STATE,
#{create_time ,jdbcType=DATE } CREATE_TIME,
#{last_login_time ,jdbcType=DATE } LAST_LOGIN_TIME,
#{user_remark ,jdbcType=VARCHAR} USER_REMARK,
#{user_theme ,jdbcType=VARCHAR} USER_THEME,
#{user_scope ,jdbcType=VARCHAR} USER_SCOPE
FROM DUAL
</insert>
返回主键的数据在你传入的对象之中,