Mybatis使用insert插入数据

在使用MyBatis操作MySQL数据库时,遇到插入数据至userinfo表失败的问题,即使程序未报错,也无法查看到数据。经过排查发现,未调用session.commit()导致数据未实际写入。

         我使用了mybatis,数据库是mysql,在mysql中有一个叫userinfo的表,id是自增的,然后在调用insert方法插入数据的时候发现,虽然程序并没有报错,好像也正常执行了,但数据库中却没有任何数据显示,一下将展示遇到的情况。

        说明:这是一个表名为userinfo的在mysql数据库中的表,设置的id自增,在插入将数据插入到userinfo表中时发现不能够正常插入,本以为id自增在初始化对应的UserInfo类的时候就不用初始化id了,结果发现不初始化id数据没有插入,但既然设定了自增就不希望再进行id的初始化。但即使初始化了id依然是无法显示插入的数据。

通过多次尝试发现,如果直接登录mysql之后再写插入语句就能够出现,运行程序就不能插入,最特别之处在下图:

        这是间隔执行直接登录mysql和运行程序插入,可以发现,虽然运行程序看似没有插入,但实际上它已经占用自增的id了,27是mysql客户端运行插入语句得到的结果,中间运行了一次程序,在运行一次mysql客户端的插入程序,明显发现有一个id已经被占用了,这就可以推断出上面有个间隔的id也是因为运行程序时,虽然没有插入到表中,但实际上已经有点作用了,只是还不清楚为什么这么诡异。

最后通过一段时间的折腾和查找发现在代码中没有调用session.commit()方法,虽然在查询的时候不需要commit()方法,然后在插入和更新数据的时候却是需要的。

总结:mybatis中使用手动创建SqlSession的时候,对于插入和更新数据需要commit()方法,否则无法真正写入到数据库。


MyBatis 中实现插入操作时结合使用 SELECT 查询结果,可以通过在 `<insert>` 标签中直接嵌入 `SELECT` 语句来完成,这种方式适用于需要从其他表或计算结果中获取插入数据的场景。以下为几种常见的实现方式: ### 1. 单条插入结合 SELECT 查询结果 可以在 `INSERT INTO ... SELECT ...` 语句结构中使用,直接从其他表中查询所需数据插入目标表中。例如: ```xml <insert id="insertFromSelect"> INSERT INTO target_table (column1, column2) SELECT column_a, column_b FROM source_table WHERE condition_column = #{value} </insert> ``` 上述语句将从 `source_table` 中查询满足条件的数据,并将查询结果插入到 `target_table` 中。 ### 2. 批量插入结合 SELECT 查询结果 如果需要批量插入数据,并且这些数据来源于一个或多个表的查询结果,也可以使用 `<foreach>` 标签来构造批量插入语句。例如: ```xml <insert id="batchInsertFromSelect"> INSERT INTO target_table (column1, column2) <foreach collection="conditions" item="item" separator=" UNION ALL "> SELECT column_a, column_b FROM source_table WHERE condition_column = #{item.value} </foreach> </insert> ``` 该方法通过 `UNION ALL` 将多个 `SELECT` 查询结果合并,并一次性插入到目标表中。 ### 3. 插入并获取主键 在插入操作后需要获取数据库自动生成的主键,可以使用 `<selectKey>` 标签。如果插入数据来源于 `SELECT` 查询,可以在插入语句后立即获取主键值。例如: ```xml <insert id="insertWithSelectAndReturnKey"> <selectKey keyProperty="id" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO target_table (column1, column2) SELECT column_a, column_b FROM source_table WHERE condition_column = #{value} </insert> ``` 该示例中,插入操作完成后会通过 `SELECT LAST_INSERT_ID()` 获取新插入记录的主键,并将其赋值给 `keyProperty` 指定的属性。 ### 4. 插入使用子查询 在某些情况下,可以直接在 `VALUES` 子句中使用子查询来获取插入值。例如: ```xml <insert id="insertWithSubquery"> INSERT INTO target_table (column1, column2) VALUES ( #{value1}, (SELECT column_b FROM source_table WHERE condition_column = #{value2}) ) </insert> ``` 此方式适用于需要将某个字段的值从其他表中动态获取的场景。 ### 注意事项 - 插入操作中的 `SELECT` 查询必须确保返回的数据类型与目标表字段类型匹配。 - 如果插入操作涉及大量数据,应考虑性能优化,例如分批次插入使用数据库提供的批量导入功能。 - 在使用 `<selectKey>` 获取主键时,需根据数据库类型选择合适的主键生成策略,例如 `LAST_INSERT_ID()` 适用于 MySQL,而 Oracle 则通常使用序列。 通过上述方式,可以灵活地在 MyBatis 中实现插入操作结合 `SELECT` 查询结果的需求,提升数据操作的灵活性和效率。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值