MyBatis魔法堂:Insert操作详解(返回主键、批量插入

合集下载

mysql注解批量添加mybatis_Mybatis注解方式实现批量插入数据库

mysql注解批量添加mybatis_Mybatis注解方式实现批量插入数据库

mysql注解批量添加mybatis_Mybatis注解方式实现批量插入数据库MyBatis是一个开源的持久化框架,它提供了一种简单而灵活的方式来访问关系数据库。

在MyBatis中,可以使用注解方式来实现批量插入数据库的操作。

本文将介绍如何使用MyBatis注解来实现批量插入数据。

首先,需要在Maven或Gradle中添加MyBatis依赖。

以下是使用Maven的示例配置:```xml<dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency></dependencies>```接下来,需要创建一个数据模型类,用于表示数据库中的表结构。

假设我们有一个名为User的表,包含id、name和age字段,那么对应的数据模型类可以如下所示:```javapublic class Userprivate Long id;private String name;private Integer age;// 省略getter和setter方法```然后,需要创建一个Mapper接口,用于定义数据库操作的方法。

在该接口中,我们将使用注解方式来实现批量插入数据的方法。

假设我们的Mapper接口为UserMapper,那么可以如下所示:```javapublic interface UserMapper"<script>","INSERT INTO user (name, age) VALUES ","<foreach collection='list' item='user' separator=','>","(#{}, #{user.age})","</foreach>","</script>"})```接下来,需要在MyBatis的配置文件中配置Mapper接口的扫描路径,并且使用注解配置的方式来启用Mapper接口。

mybatis里insert返回的主键id的原理

mybatis里insert返回的主键id的原理

mybatis里insert返回的主键id的原理全文共四篇示例,供读者参考第一篇示例:MyBatis是一个流行的Java持久层框架,它提供了一种优雅的方式来管理数据库访问。

在MyBatis中,当我们执行一个插入操作时,有时会需要获取插入数据后生成的主键ID,这个主键ID是数据库自动生成的,并且在插入完成后需要返回给应用程序使用。

今天我们就来深入探讨一下MyBatis里insert返回的主键ID的原理。

在MyBatis中,插入操作通常通过使用Mapper接口中的insert 方法来实现。

在执行插入操作时,我们通常会使用GeneratedKeys返回主键ID。

GeneratedKeys是MyBatis提供的一种特殊类型的Statement,它可以获取到插入数据后生成的主键ID。

GeneratedKeys还有一个重要的特性是可以通过keyColumn指定主键字段的名称,这样可以灵活地指定获取主键ID的方式。

在实际使用中,我们可以通过以下两种方法来获取插入数据后生成的主键ID:1. 通过Mapper接口的insert方法返回主键ID在Mapper接口中定义一个返回主键ID的方法,并在insert操作中通过GeneratedKeys返回主键ID。

这样我们就可以在插入数据后直接获取到生成的主键ID。

代码示例如下:```java@Insert("INSERT INTO user(username, password) VALUES(#{username}, #{password})")@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")int insertUser(User user);第二篇示例:在MyBatis中,当我们执行插入操作时,有时需要获取插入记录的主键ID。

MyBatisinsert操作插入数据之后返回插入记录的id

MyBatisinsert操作插入数据之后返回插入记录的id

MyBatisinsert操作插⼊数据之后返回插⼊记录的idMyBatis插⼊数据的时候,返回该记录的id<insert id="insert"keyProperty="id"useGeneratedKeys="true" parameterType="com.demo.domain.CountRateConfig">insert into query_rate_config (code,partner_type,search_count, booking_count, ticket_count,rate_type)values (#{code,jdbcType=VARCHAR},#{partnerType,jdbcType=TINYINT}, #{searchCount,jdbcType=INTEGER}, #{bookingCount,jdbcType=INTEGER}, #{ticketCount,jdbcType=INTEGER},#{rateType,jdbcType=TINYINT}) </insert>⾸先我们应该保证数据库的主键Id是⾃增的,另外需要设置的两个属性为:keyProperty="id"useGeneratedKeys="true"这样的话,我们在插⼊数据之后,就可以得到插⼊数据之后的对象,然后通过该对象获取该对象的id。

useGeneratedKeys=”true” 可以获取⾃增长的ID 只⽀持具有⾃增长⽅式的那种数据库(mysql, mssql 等但 oracle 就不⽀持了 )案例如下:1、MyBatis的配置⽂件如上遍所⽰的⼀段代码;2、使⽤的Java代码如下:@Overridepublic int insert(CountRateConfig countRateConfig) {int insertNum = Integer.parseInt(countRateConfigMapper.insert(countRateConfig) + "");Long id = countRateConfig.getId();return insertNum;}3、上述代码,如果插⼊数据成功的话,则可以找到数据库中对应的key;结果是正确的,即可以读取正确的id。

Mybatis笔记–insert语句中主键的返回

Mybatis笔记–insert语句中主键的返回

Mybatis笔记–insert语句中主键的返回在DBMS中可以使⽤insert语句显⽰指定⾃增主键值,但Mybatis中不可,即使指定了也⽆效,可以使⽤特殊的⽅式返回主键。

⼀、⾃增主键返回mysql⾃增主键执⾏insert提交之前,会⾃动⽣成⼀个⾃增主键值;insert语句在提交之后可以调⽤mysql函数LAST_INSERT_ID(),返回auto_increment⾃增列新记录id值;最后再将⾃增主键值返回到pojo对象中指定的属性中即可。

这个函数只适⽤于⾃增主键。

1、标签属性标签对应的属性含义如下:keyProperty:返回的主键存储在pojo类中的哪个属性order:相对于insert语句,select LAST_INSERT_ID() 的执⾏顺序resultType:指定select LAST_INSERT_ID() 的结果类型2、详细代码1 <insert id="insertEmp" parameterType="po.Emp">2 <selectKey keyProperty="empno" order="AFTER" resultType="ng.Integer">3 select LAST_INSERT_ID()4 </selectKey>5 insert into emp(ename,job) values(#{ename},#{job})6 </insert>可以通过po类的get()⽅法获取⾃增主键值,代码如下:1//返回⾃增主键2 System.out.println(emp.getEmpno());3、运⾏结果⼆、⾮⾃增主键(UUID)返回使⽤mysql的uuid()函数⽣成主键,需要修改表中id字段类型为string,长度设置成36位(设置成35位会出错)。

mybatis批量插入并返回主键(序列)-oracle

mybatis批量插入并返回主键(序列)-oracle

mybatis批量插⼊并返回主键(序列)-oracle需求:批量插⼊数据,并返回每条数据的主键(序列),因为这⾥是采⽤序列⽣成唯⼀的主键的,其实oracle批量插⼊操作有⼏种,⽹上百度都是有相关资源的。

但是笔者现在的需求是,不仅批量插⼊数据后,并返回每条数据的主键,⽹上查阅了⼀番始终没有找到,相应办法,倒是针对mysql貌似mybatsi是⽀持批量返回主键的,因为笔者没有测试,所有不敢妄下⾔论。

好了,说了这么多,直接进⼊正题:1、参照⽹上的相关资源,如图所⽰<insert id="saveEPDetail" useGeneratedKeys="true" parameterType="java.util.List"><selectKey keyProperty="code" resultType="String" order="BEFORE">select SEQ_DIS_DRUG_PRESC_DETAIL.NEXTVAL as code from dual</selectKey>INSERT INTO DIS_DRUG_PRESC_DETAIL(code,antibac_purpose,ref_price,)SELECT SEQ_DIS_DRUG_PRESC_DETAIL.NEXTVAL,t.*FROM (<foreach collection="list" item="item" separator="UNION ALL">select#{item.antibacPurpose,jdbcType=VARCHAR},#{item.skintObserver2,jdbcType=VARCHAR}from dual</foreach>) t</insert>结果批量插⼊式成功了,单主键code打死都没有返回,如是⼀条条插⼊⼜要加锁最后的解决⽅式:因为笔者这⾥是采⽤序列⽣成的主键,于是在插⼊数据的时候,先调⽤⼀下序列获取到序列值,再赋值给主键code,最后进⾏批量插⼊操作。

MyBatisinsert语句返回主键和selectKey标签方式

MyBatisinsert语句返回主键和selectKey标签方式

MyBatisinsert语句返回主键和selectKey标签⽅式⽬录insert语句返回主键和selectKey标签1.主键⾃增的情况2.Oracle中⽤Sequence获取主键MyBatis insert语句key的⽣成和返回1.使⽤数据库⾃带的⽣成器2.使⽤selectKeyinsert语句返回主键和selectKey标签往数据库中插⼊⼀条记录后,有时候我们需要这条记录的主键,⽤于后续的操作。

如果在插⼊后再去查⼀次数据库,显然不够优雅和效率,MyBatis中已经有了insert后返回主键的功能,下⾯就主要讲⼏种不同情况的具体做法。

1.主键⾃增的情况对于MySQL和Sql Server这种⽀持主键⾃增的数据库,可以设置useGeneratedKeys="true"和keyProperty。

例如现在有⼀个表tbl_employee,表有id,name,age,create_time四个字段,MyBatis映射⽂件中可以写成如下:<insert id="insertRecord" parameterType="com.lzumetal.mybatis.entity.Employee"useGeneratedKeys="true" keyProperty="id">INSERT INTO tbl_employee(name, age, create_time)VALUES(#{name}, #{age}, #{createTime})</insert>useGeneratedKeys="true":使⽤⾃动⽣成的主键keyProperty:指定主键是(javaBean的)哪个属性。

useGeneratedKeys:(insert and update only) This tells MyBatis to use the JDBC getGeneratedKeys method to retrieve keys generated internally by the database (e.g.auto increment fields in RDBMS like MySQL or SQL Server). Default: falsekeyProperty:(insert and update only) Identifies a property into which MyBatis will set the key value returned bygetGeneratedKeys , or by a selectKey child element of the insert statement. Default: unset .Can be a comma separated list of property names if multiple generated columns are expected.2.Oracle中⽤Sequence获取主键对于Oracle数据库,当要⽤到⾃增字段时,需要⽤到Sequence,假设我们现在已经创建了⼀个名字为SEQ_ADMIN的Sequence,在MyBatis中的映射⽂件中可以结合selectKey标签使⽤。

mybatis批量insert的写法

mybatis批量insert的写法

在MyBatis 中,你可以使用以下两种方式来进行批量插入:方法一:使用<foreach>标签MyBatis 提供了<foreach>标签,你可以使用它来遍历集合,并对集合中的每个元素执行SQL 语句。

以下是使用<foreach>标签进行批量插入的示例:xml复制代码<insert id="batchInsert" parameterType="java.util.List">INSERT INTO your_table (column1, column2, ...)VALUES<foreach collection="list" item="item" separator=",">(#{item.column1}, #{item.column2}, ...)</foreach></insert>在上面的示例中,你需要将your_table替换为你要插入数据的表名,column1, column2, ...替换为表中的列名。

list是传递给SQL 语句的参数名称,item是每次遍历的元素名称。

方法二:使用ExecutorType.BATCH执行器MyBatis 还提供了ExecutorType.BATCH执行器,它专门用于批量操作。

以下是使用ExecutorType.BATCH执行器进行批量插入的示例:java复制代码try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) { YourMapper mapper = sqlSession.getMapper(YourMapper.class);for (YourObject obj : yourList) {mapper.insert(obj);}mit();} catch (Exception e) {// 处理异常}在上面的示例中,你需要将YourMapper替换为你的Mapper 接口,YourObject替换为你要插入的对象类型,yourList替换为包含要插入对象的列表。

Mybatis批量增加insert

Mybatis批量增加insert

Mybatis批量增加insert⽅法⼀:foreach容易出现的错误:出现SQL语句错误解决⽅式:在数据库的连接url后添加allowMultiQueries=true(允许批量更新)jdbc.url=jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true例⼦:xml⽂件<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.center.manager.mapper.FundMapper"><insert id="insertForeach" parameterType="java.util.List" useGeneratedKeys="false">insert into fund( id,fund_name,fund_code,date_x,data_y,create_by,create_date,update_by,update_date,remarks,del_flag)<foreach collection="list" item="item" index="index" separator=","> values(#{item.id}, #{item.fundName},#{item.fundCode},#{item.dateX},#{item.dataY},#{item.createBy},#{item.createDate},#{item.updateBy},#{item.updateDate},#{item.remarks},#{item.delFlag})</foreach></insert></mapper>mapper层package com.center.manager.mapper;import java.util.List;import org.apache.ibatis.annotations.Mapper;import com.center.manager.entity.Fund;@Mapperpublic interface FundMapper {int insertForeach(List<Fund> list);}Fun类package com.center.manager.entity;import java.util.Date;@datapublic class Fund {private String id;private String fundName;private String fundCode;private String dateX;private String dataY;private String remarks;private String createBy;private Date createDate;private String updateBy;private Date updateDate;private String delFlag;}⽅法⼆:Mybatis内置的ExecutorType有3种,默认的是simple,该模式下它为每个语句的执⾏创建⼀个新的预处理语句,单条提交sql;⽽batch模式重复使⽤已经预处理的语句,并且批量执⾏所有更新语句,显然batch性能将更优;service层@Autowiredprivate SqlSessionTemplate sqlSessionTemplate;public void add(List<ApplyInfo> list) {SqlSession sessionn = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH,false);AddInfoDap mapper = session.getMapper(AddInfo.class);for(int i = 0; i < list.seize ; i++) {mapper.addApplicationDetail(lisr.get(i));if(i == list.size()-1) {mit();session.close();}}}xml层<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.center.manager.mapper.FundMapper"><insert id="addApplicationDetail" parameterType="com.dao.entity.ApplyInfo">insert into fund( id,fund_name,fund_code,date_x,data_y,create_by,create_date,update_by,update_date,remarks,del_flag) values(#{item.id}, #{item.fundName},#{item.fundCode},#{item.dateX},#{item.dataY},#{item.createBy},#{item.createDate},#{item.updateBy},#{item.updateDate},#{item.remarks},#{item.delFlag})</foreach></insert></mapper>mapper层void addApplicationDetail(ApplyInfo infos)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、前

数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅。

二、 insert元素属性详解
其属性如下:
parameterType ,入参的全限定类名或类型别名
keyColumn ,设置数据表自动生成的主键名。

对特定数据库(如PostgreSQL),若自动生成的主键不是第一个字段则必须设置
keyProperty ,默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中
useGeneratedKeys ,取值范围true|false(默认值),设置是否使用JDBC的getGenereatedKeys 方法获取主键并赋值到keyProperty设置的领域模型属性中。

MySQL和SQLServer执行auto-generated key field,因此当数据库设置好自增长主键后,可通过JDBC的getGeneratedKeys方法获取。

但像Oralce等不支持auto-generated key field的数据库就不能用这种方法获取主键了
statementType ,取值范围STATEMENT,PREPARED(默认值),CALLABLE
flushCache ,取值范围true(默认值)|false,设置执行该操作后是否会清空二级缓存和本地缓存
timeout ,默认为unset(依赖jdbc驱动器的设置),设置执行该操作的最大时限,超时将抛异常
databaseId ,取值范围oracle|mysql等,表示数据库厂家,元素内部可通过`<if test="_databaseId = ‘oracle‘">`来为特定数据库指定不同的sql语句
三、一般的INSERT操作——返回值为插入的记录数目mapper接口代码:
/**
* 添加学生信息
* @param student 学生实例
* @return 成功操作的记录数目
*/
int add(EStudent student);
mapper.xml:
<insert id="add" parameterType="EStudent">
insert into TStudent(name, age) values(#{name}, #{age})
</insert
四、执行INSERT操作后获取记录主键
mapper接口代码:
/**
* 添加学生信息
* @param student 学生实例
* @return 成功操作的记录数目
*/
int add(EStudent student);
至于mapper.xml则分为两种情况了,一种是数据库(如MySQL,SQLServer)支持auto-generated key field,另一种是数据库(如Oracle)不支持auto-generated key field的。

1. 数据库(如MySQL,SQLServer)支持auto-generated key field的情况
手段①(推荐做法):
<insert id="add" parameterType="EStudent" useGeneratedKeys="true" keyProperty="id">
insert into TStudent(name, age) values(#{name}, #{age})
</insert>
手段②:
<insert id="add" parameterType="EStudent">
// 下面是SQLServer获取最近一次插入记录的主键值的方式
<selectKey resultType="_long" keyProperty="id" order="AFTER">
select @@IDENTITY as id
</selectKey>
insert into TStudent(name, age) values(#{name}, #{age})
</insert>
由于手段②获取主键的方式依赖数据库本身,因此推荐使用手段①。

2. 数据库(如Oracle)不支持auto-generated key field的情况
<insert id="add" parameterType="EStudent">
<selectKey keyProperty="id" resultType="_long" order="BEFORE">
select CAST(RANDOM * 100000as INTEGER) a FROM
SYSTEM.SYSDUMMY1
</selectKey>
insert into TStudent(id, name, age) values(#{id}, #{name}, #{age})
</insert
注意:mapper接口返回值依然是成功插入的记录数,但不同的是主键值已经赋值到领域模型实体的id中了。

五、 selectKey子元素详解
作用:在insert元素和update元素中插入查询语句。

其属性如下:
keyProperty ,默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中
resultType ,keyPropety所指向的属性类全限定类名或类型别名
order属性,取值范围BEFORE|AFTER,指定是在insert语句前还是后执行selectKey操作
statementType ,取值范围STATEMENT,PREPARED(默认值),CALLABLE
注意:selectKey操作会将操作查询结果赋值到insert元素的parameterType的入参实例下对应的属性中。

并提供给insert语句使用
六、批量插入
方式1:
<insert id="add" parameterType="EStudent">
<foreach collection="list" item="item" index="index" separator=";">
INSERT INTO TStudent(name,age) VALUES(#{}, #{item.age})
</foreach>
</insert>
上述方式相当语句逐条INSERT语句执行,将出现如下问题:
1. mapper接口的add方法返回值将是最一条INSERT语句的操作成功的记录数目(就是0或1),而不是所有INSERT语句的操作成功的总记录数目
2. 当其中一条不成功时,不会进行整体回滚。

方式2(仅限于MSSQL):
<insert id="add" parameterType="EStudent">
WITH R AS
<foreach collection="list" item="item" index="index" open="(" close=")" separator="union all">
SELECT #{} as a, #{item.age} as b
</foreach>
INSERT INTO TStudent(name,age) SELECT a, b FROM R
</insert>
上述方式解决了方式1中的问题。

但该方式仅限于MSSQL
方式3(通用解决方法):
INSERT INTO TStudent(name,age)
<foreach collection="list" item="item" index="index" open="(" close=")" separator="union all">
SELECT #{} as a, #{item.age} as b
</foreach>
该方式与方式2效果一样,而且不仅限于MSSQL。

相关文档
最新文档