首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

mybatis+oracle 完成插入数据库,并将主键返回的注意事项

2023-11-12 来源:花图问答

mybatis+oracle 完成插入数据库,并将主键返回的注意事项一条插入语句就踩了不少的坑,首先我的建表语句是:

create table t_openapi_batch_info(BATCH_NO VARCHAR2(200),UM_CODE VARCHAR2(50),BATCH_STATUS CHAR(1) DEFAULT ‘0‘,BATCH_TYPE CHAR(1),CREATED_DATE DATE,CREATED_BY VARCHAR(100),UPDATED_DATE DATEUPDATED_BY VARCHAR(100))

CREATE SEQUENCE SEQ_OPENAPI_BATCHNOminvalue 0maxvalue 999999999start wuth 7342937increate by 1cache 40;123456789101112131415161718我写的mapper.xml的sql语句为:

<?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> <insert id="insertBatchInfo" parameterType="java.util.Map" useGeneratedKeys="true" keyColumn ="batchNo"> <selectKey resultType="int" keyProperty="batchNo" order="BEFORE"> select seq_openapi_batchno.nextval as batchNo from dual </selectKey> insert into t_openapi_batch_info <include refid="batchInfoKey"/> VALUES <include refid="batchInfoVal"/> </insert>

<sql id="batchInfoKey"> <trim prefix="(" suffix=")"> batch_no, <if test="umCode!=null and umCode!=‘‘"> um_code, </if> <if test="batchStatus!=null and batchStatus!=‘‘"> batch_status, </if> <if test="batchType!=null and batchType!=‘‘"> batch_type, </if> created_by,created_date,updated_by,updated_date </trim> </sql> <sql id="batchInfoVal"> <trim prefix="(" suffix=")"> #{batchNo}, <if test="umCode!=null and umCode!=‘‘"> #{umCode}, </if> <if test="batchStatus!=null and batchStatus!=‘‘"> #{batchStatus}, </if> <if test="batchType!=null and batchType!=‘‘"> #{batchType}, </if> user,sysdate,user,sysdate </trim> </sql> </mapper>

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647

截取上面mapper文件中的重要的部分,1.使用useGeneratedkey,默认为false,设置为true可以将需要的值返回2.keyColumn这个值可以指定你需要返回的值,比如我需要返回批次号,那么就可以指定keyColumn的值为batchNo,此时我可以将batchNo绑定到map,当然,如果你的参数类型是dto的话,就会绑定到对应实体类的属性上面,使用map.get(“batchNo”)就可以得到相应的值。3.resultType=“int”,这里我踩得坑是将resultType写成了String类型**

/** * 这个方法是对SqlSession的包装,对应insert、delete、update、select四种操作 */public Object execute(SqlSession sqlSession, Object[] args) { Object result;//返回结果   //INSERT操作 if (SqlCommandType.INSERT == command.getType()) { //处理参数 Object param = method.convertArgsToSqlCommandParam(args); //调用sqlSession的insert方法 result = rowCountResult(sqlSession.insert(command.getName(), param)); } else if (SqlCommandType.UPDATE == command.getType()) { //UPDATE操作 同上 Object param = method.convertArgsToSqlCommandParam(args); result = rowCountResult(sqlSession.update(command.getName(), param)); } else if (SqlCommandType.DELETE == command.getType()) { //DELETE操作 同上 Object param = method.convertArgsToSqlCommandParam(args); result = rowCountResult(sqlSession.delete(command.getName(), param)); } else if (SqlCommandType.SELECT == command.getType()) { //如果返回void 并且参数有resultHandler ,则调用 void select(String statement, Object parameter, ResultHandler handler);方法 if (method.returnsVoid() && method.hasResultHandler()) { executeWithResultHandler(sqlSession, args); result = null; } else if (method.returnsMany()) { //如果返回多行结果,executeForMany这个方法调用 <E> List<E> selectList(String statement, Object parameter); result = executeForMany(sqlSession, args); } else if (method.returnsMap()) { //如果返回类型是MAP 则调用executeForMap方法 result = executeForMap(sqlSession, args); } else { //否则就是查询单个对象 Object param = method.convertArgsToSqlCommandParam(args); result = sqlSession.selectOne(command.getName(), param); } } else { //接口方法没有和sql命令绑定 throw new BindingException("Unknown execution method for: " + command.getName()); } //如果返回值为空 并且方法返回值类型是基础类型 并且不是VOID 则抛出异常 if (result == null && method.getReturnType().isPrimitive() && !method.returnsVoid()) { throw new BindingException("Mapper method ‘" + command.getName() + " attempted to return null from a method with a primitive return type (" + method.getReturnType() + ")."); } return result; }

private Object rowCountResult(int rowCount) { final Object result; if (method.returnsVoid()) { result = null; } else if (Integer.class.equals(method.getReturnType()) || Integer.TYPE.equals(method.getReturnType())) { result = rowCount; } else if (Long.class.equals(method.getReturnType()) || Long.TYPE.equals(method.getReturnType())) { result = (long) rowCount; } else if (Boolean.class.equals(method.getReturnType()) || Boolean.TYPE.equals(method.getReturnType(http://www.my516.com))) { result = (rowCount > 0); } else { throw new BindingException("Mapper method ‘" + command.getName() + "‘ has an unsupported return type: " + method.getReturnType()); } return result; }

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364所以通过源码我们可以知道insert ,update,delete操作只能返回int,lang,boolean类型,若返回string类型,就会报错。

4.keyProperty 是 selectKey 语句结果应该被设置的目标属性。

SelectKey需要注意order属性,像Mysql一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值。

像Oracle这样取序列的情况,需要设置为before

,否则会报错。---------------------

mybatis+oracle 完成插入数据库,并将主键返回的注意事项

标签:status   sql语句   sql   name   string   getname   插入   code   返回   

小编还为您整理了以下内容,可能对您也有帮助:

Mybatis 怎么返回insert插入的主键

在XML中使用useGeneratedKeys和keyProperty

ibatis是可以直接返回自增主键值的,mybatis是不可以的

你可以按照这种步骤得到

sqlSession.insert(getNameSpace() + "insertDomain", domain);

int key = domain.getKey();

useGeneratedKey 设置为true, keyProperty为自增主键名称

Mybatis 怎么返回insert插入的主键

在XML中使用useGeneratedKeys和keyProperty

ibatis是可以直接返回自增主键值的,mybatis是不可以的

你可以按照这种步骤得到

sqlSession.insert(getNameSpace() + "insertDomain", domain);

int key = domain.getKey();

useGeneratedKey 设置为true, keyProperty为自增主键名称

mybatis使用oracle插入数据返回主键问题

把下面哪几行放到sql后面试试

<selectKey resultType="java.lang.Integer" keyProperty="ID" order="BEFORE">

SELECT IBOKEE_COMM_TAG_LIBRARY_SEQ.nextval AS Id FROM DUAL

</selectKey>

mybatis insert 返回主键问题

会自动封装到你传入的entity的对应字段里追问解决了,我没把DO转换成DTO,

mybatis insert 返回主键问题

会自动封装到你传入的entity的对应字段里追问解决了,我没把DO转换成DTO,

mybatis 插入数据无法返回主键

<selectKey>里面缺少一个keyColumn

类似这样:

mybatis 插入数据无法返回主键

<selectKey>里面缺少一个keyColumn

类似这样:

如何实现在Oracle插入一条记录返回主键

Oracle只有序列没有自增列。

你要实现列的自增只能通过java代码自己实现,在这个过程中可以保存主键,也没必要在插入数据的时候再返回主键了。

oracle 只有 sequence 。

先取得一个序列的下一个值:

select myseq.nextval from al;

然后再把这个值当成主键值插入数据表:

insert into mytable (id, ...) values (id_val, ...)

在C#中,mysql插入一条数据时,怎么同时把这条数据的主键返回?

把主键设置成GUID类型,在C#代码中先生成GUID,再插入数据库,根据插入成功与否,执行后面的代码

这是最常用,也最方便的方法

显示全文