A. 使用Mybatis,在Oracle 数据库中批量插入数据,同时能返回主键到对应实体中吗
你的id是用seq生成的吗?
是的话:
<select id="selectNextId" resultType="long" >
select seq_sample.nextval from al</select>
B. mybatis怎么批量插入数据库
对于支持自动生成主键的数据库(如sql
Server),可以采用以下方式:
....
对于不支持自动生成主键(如Oracle),可以采用以下方式:
select
my_seq.nextval
from
al
....
C. 用mybatis向数据库插入数据,空指针异常
mybatis不能向数据库里面插入数据原因可能是执行了插入动作,但是没有最终commit到数据库服务器导致。
mybatis插入数据的例子如下:
package com.mybatis.demo;
import java.io.Reader;
public class Test {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
static{
try{
reader = Resources.getResourceAsReader("Configuration.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}catch(Exception e){
e.printStackTrace();
}
}
public static SqlSessionFactory getSession(){
return sqlSessionFactory;
}
//添加用户
public void addUser(){
User user = new User();
user.setId(4);
user.setUserAddress("人民广场");
user.setUserName("Birds");
user.setUserAge("102");
SqlSession session = sqlSessionFactory.openSession();
try{
IUserOperation userOperation = session.getMapper(IUserOperation.class);
session.commit();
System.out.println("当前增加的用户id为:"+user.getId());
}
finally{
session.close();
}
}
public static void main(String[] args) {
Test testUser = new Test();
testUser.addUser();
}
}
当执行到 testUser.addUser();后执行到session.commit();数据就会插入表。
D. mybatis动态sql实现批量插入
默认情况下, #{}语法会促使MyBatis生成PreparedStatement属性并且使用PreparedStatement的参数(=?)来设置值。如果你想直接将未更改的字符串代入到sql中,可以使用${}。
也就是说,MyBatis看到 #{}会认为你在给sql中的变量赋值,就像JDBC编程中给问号赋值一样(比如MyBatis会判断它的类型,并自动在前后加单引号)。而当MyBatis看到${}的时候会直接将之替换成变量的值而不做任何处理。
所以在使用${}的时候,不需要像#{}一样写"jdbcType=VARCHAR"之类的属性。
E. mybatis批量插入返回每条数据的id,返回集合全是最后一条数据的id(数据库主键自增)
sequence就是一个序列,你每次执行 select CASE_SEQ.nextval from al 的时候都会返回唯一的一个ID号,因此你可以先执行这个select取到这个ID,如果这个时候有多个用户在执行这个操作,那么他们select到的ID绝对跟你的不一样(sequence就是保证这一点的)。然后你就可以用这个ID插入记录,然后再返回这个ID就OK了。 代码: string sql = "Select CASE_SEQ.currval from al"; OracleConnection conn = DB.getCon(); OracleCommand cmd = conn.CreateCommand(); conn.Open(); string returnID = null; cmd.CommandText = sql; returnID = Convert.ToString(cmd.ExecuteScalar()); //获取ID sql = "insert into PATIENT_T(pid,name) values(returnID,'黎明')"; //将ID插入数据库 cmd.CommandText = sql; cmd.ExecuteNonQuery(); conn.Close(); 结束了,差不多就是这样,楼主自己调试一下就行了,注意ID在数据库中应该是varcahr类型的
F. mybatis多线程批量插入MySQL报主键冲突
主键是自增的吗?
如果是的话,看一下你的数据库引擎是MyISAM还是InnoDB。
有可能是引擎是InnoDB的问题