Oracle设置了自增序列,使用Mybatis的反向工程插入方法,页面报错SQL无效,数据库有新增数据

Oracle设置了自增序列,使用Mybatis的反向工程插入方法,页面报错,数据库有新增数据

问题描述:

我在项目中使用oracle数据库,加mybatis。在oracle数据库中,设置了序列,和触发器。之后,在项目中使用Mybatis的自动生成的方法insertSelective()来插入数据,发现页面报错,SQL无效,但是数据库内数据已经插入了。

解决方案:

自己写SQL语句,先从数据库中获取序列的值,作为插入数据的id。

 

先建接口:

 

再建mapper.xml:

 

 

在mapper.xml文件中填写以下类似代码:

<?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.etc.dao.InsertMapper" >


	<!--Oracle不支持	自增;Oracle使用序列序列来模拟自增;
		每次插入的数据的主键是从序列中拿到的值:如歌获取到这个值?
	 -->
	<insert id="insertTodoItems" parameterType="com.etc.entity.CUX_TODO_ITEMS">

		<!-- keyProperty:查出的主键封装给JavaBean的哪个属性,是entity中对应类的对应字段名
             order="BEFORE":当前SQL在插入之前运行
                     AFTER:当前SQL在插入之后运行
             resultType: 查出数据的返回值类型

             BEFORE运行顺序:
                 先运行selectKey查询id的sql;查出id的值封装给javaBean的id属性
                 再运行插入的SQL;就可以取出id属性对应的值
             AFTER:
                先 运行插入的SQL(从序列中取出新值作为id)
                 再运行selectKey查询id的sql
        -->
		<selectKey keyProperty="todoItemId" order="BEFORE" resultType="Short">
			<!-- 编写查询主键的SQL语句 -->
			<!-- BEFORE:-->
			SELECT CUX_TODO_ITEMS_SEQUEMCE.nextval FROM dual
			<!-- AFTER:
				SELECT seq_deptno.currval FROM dual
			 -->
		</selectKey>
		<!-- 插入时的主键是从序列中拿到的 -->
		<!-- BEFORE: -->
		 insert into dept(deptno,dname,loc)
		values (#{deptno},#{dname},#{loc}) 
		
		<!-- AFTER:
            insert into dept(deptno,dname,loc)
            values (seq_deptno.nextval,#{dname},#{loc})
        -->
	</insert>


</mapper>

最后调用改方法就行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值