最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记。
类似下面这段代码一样获取插入后的主键
User user = new User(); user.setUserName("chenzhou"); user.setPassword("xxxx"); user.setComment("测试插入数据返回主键功能"); System.out.println("插入前主键为:"+user.getUserId()); userDao.insertAndGetId(user);//插入操作 System.out.println("插入后主键为:"+user.getUserId());
经过查询网上资料,发现大致有两种方式。(1,主键获取方式,2,赋值给哪个字段)
方式一:
在实体类的映射文件 "*Mapper.xml" 这样写:
<insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User"> insert into user(userName,password,comment) values(#{userName},#{password},#{comment}) </insert>
Tips:
useGeneratedKeys="true" 表示给主键设置自增长keyProperty="userId" 表示将自增长后的Id赋值给实体类中的userId字段。parameterType="com.chenzhou.mybatis.User" 这个属性指向传递的参数实体类
这里提醒下,<insert></insert> 中没有resultType属性,不要乱加。实体类中uerId 要有getter() and setter(); 方法
由于我在MySQL数据库中建表时候已经设置了字段自增长,故最终我选择了第二种方式。
第二种方式:
同样在实体类的映射文件 "*Mapper.xml" 但是要这样写:
<!-- 插入一个商品 --> <insert id="insertProduct" parameterType="domain.model.ProductBean" > <selectKey resultType="java.lang.Long" order="AFTER" keyProperty="productId"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO t_product(productName,productDesrcible,merchantId)values(#{productName},#{productDesrcible},#{merchantId}); </insert>
Tips:
<insert></insert> 中没有resultType属性,但是<selectKey></selectKey> 标签是有的。
order="AFTER" 表示先执行插入语句,之后再执行查询语句。
可被设置为 BEFORE 或 AFTER。
如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。
如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用keyProperty="userId" 表示将自增长后的Id赋值给实体类中的userId字段。
SELECT LAST_INSERT_ID() 表示MySQL语法中查询出刚刚插入的记录自增长Id.
实体类中uerId 要有getter() and setter(); 方法
实现需求,上面那些就足够了。
这里如果有兴趣的,请继续听我讲一个Mybatis中可能误入的坑。
为什么Mybatis 中修改添加方法为有返回值后,虽然提示插入数据库成功并且也能读取插入的数据,但是当你打开数据库后就是看不到插入的数据?
如果在实现上述需求时,想插入后返回主键的话,切记不要这样写。
@Override
public Long insertProduct(ProductBean productBean) {
// TODO Auto-generated method stub
SqlSession session = MybatisJDBCUtil.currentSession();
ProductIDao productIDao = session.getMapper(ProductIDao.class);// 这里*.class
// 必须对应DAO的接口层
return productIDao.insertProduct(productBean);
}
Why?
因为如果你是像上面这样写,那么执行后返回的也不是你想要的主键Id,而是执行数据库语句后受影响的行数。
而且,当你执行后你会发现提示插入成功,你用代码也可以读取出插入的数据,但是永远只有一条记录。
并且,你打开数据库会发现,数据库中没有插入成功任何数据。
我在这里郁闷了N久,终于发现了关键所在。
有返回值和没返回值的区别在于:
有返回值的只是对数据库只读模式访问数据库,对数据库数据不会有任何修改,比如各种方式的查询。
无返回值的则会以读写模式访问数据库,会对数据库中的数据进行修改,比如删除,增加。
除此之外,根据个人理解应该mybatis在执行插入语句时会先缓存到构造的一个类似session集合中,然后才去调用底层驱动去操作修改数据库。
session.commit();
MybatisJDBCUtil.closeSession();
没有返回值得才有上面这两条语句,也就是说执行了这两条语句才会真正执行插入到数据库,对数据库的数据进行修改。
相反,有返回值的就没有执行这两条语句,所以只是在自己构造的session中执行了添加语句,但是并没有提交到数据库中,故数据库中是没有任何记录的。
这也就解释了为什么Mybatis 中修改添加方法为有返回值后,虽然提示插入数据库成功,但是当你打开数据库看不到插入的数据。
Mybatis中插入语句方法种不要有返回值,像这样写是正确的。
@Override public void insertProduct(ProductBean productBean) { // TODO Auto-generated method stub SqlSession session = MybatisJDBCUtil.currentSession(); ProductIDao productIDao = session.getMapper(ProductIDao.class);// 这里*.class // 必须对应DAO的接口层 productIDao.insertProduct(productBean);
session.commit(); MybatisJDBCUtil.closeSession(); }
相关推荐
**关于MyBatis插入数据的常见问题** 在实现插入数据并返回主键时,可能会遇到这样一个陷阱:在自定义插入方法时,如果错误地返回了SqlSession的自增ID,而不是正确地通过实体类传递,可能会导致看似插入成功但实际...
MyBatis插入数据返回主键的介绍 MyBatis是一个流行的持久层框架,它提供了许多实用的功能,包括插入数据返回主键的功能。在本文中,我们将详细介绍MyBatis插入数据返回主键的实现方法。 Service层实现 在Service...
总的来说,Mybatis通过`useGeneratedKeys`和`keyProperty`属性使得我们能够在插入数据后方便地获取自动生成的主键ID,无论是直接操作Java对象还是使用参数`Map`,都能确保主键值的正确返回。这种方式极大地简化了...
MybatisPlus是一个强大的Java持久层框架,它是Mybatis的扩展,简化了常见的CRUD操作,提供了丰富的API,使得开发者能够更高效地进行数据库操作。在MybatisPlus中,插入数据并获取主键值是一个常见的需求,特别是在...
在Mybatis的映射文件中,可以通过`<insert>`标签的`useGeneratedKeys`和`keyProperty`属性来处理主键自增,同时利用`<foreach>`标签进行数据遍历插入。 2. **事务管理**:SpringBoot集成Mybatis时,事务管理通常由...
Mybatis 插入一条或批量插入 返回带有自增长主键记录的实例 Mybatis 是一个基于 Java 的持久层框架,它提供了对数据库的访问和操作的功能。今天,我们将分享一个关于 Mybatis 插入一条或批量插入 返回带有自增长...
在使用MyBatis进行数据库操作时,有时我们需要在插入数据后获取自动生成的主键ID,这在处理自增主键的场景下尤其常见。在MySQL数据库中,自增主键通常用于标识每条记录的独特性,而在插入新记录后,数据库会自动为这...
由于使用了UUID作为主键,插入数据时MyBatis会自动为新记录生成一个UUID。例如: ```java import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; public interface ...
这种情况下,XML 文件中的自定义 `insert` 方法会覆盖 MP 的通用方法,使得 MP 的自动处理主键返回的功能失效。为了解决这个问题,我们需要检查并删除 XML 文件中这个自定义的 `insert` 语句,确保不再执行这个方法...
Mybatis实现插入数据后返回主键过程解析 Mybatis是一个基于Java的持久层框架,它提供了一个灵活的方式来访问和操作数据库。在实际开发中,经常需要在插入数据后返回主键值,以便于后续的业务逻辑处理。本文将详细...
Mybatis通过XML或注解方式将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录,实现了数据访问的便捷性。 2. **Eclipse集成** 在Eclipse中,我们可以利用Mybatis插件(如Mybatis...
首先,MyBatis-Plus 默认的主键生成策略是 `IdType.AUTO`,这意味着它会尝试根据数据库的自增特性来生成主键。然而,当主键类型被误设为 Integer 而不是 Long 或其他能容纳更大数值的数据类型时,可能会出现异常。...
Mybatis自定义插件生成...通过拦截器拦截Mybatis的insert语句,通过自定义注解获取到主键,并为该主键赋值雪花ID,插入数据库中。 2、技术架构 项目总体技术选型 SpringBoot2.1.7 + Mybatis + Maven3.5.4 + Mysql + lom
总的来说,MyBatis为Java开发者提供了一种高效、灵活的方式来操作数据库,它降低了SQL与业务逻辑的耦合度,提高了代码的可读性和可维护性。通过学习MyBatis,开发者可以更好地管理数据库操作,构建更健壮的数据驱动...
在 MyBatis 框架中,当我们执行一个插入(insert)...5. 确保数据库的主键 ID 是自增的,这是返回插入 ID 的前提条件。 了解并正确使用这些知识点,可以帮助我们在 MyBatis 中更高效地处理插入数据并获取新记录的 ID。
总结来说,MyBatis通过`useGeneratedKeys`和`keyProperty`属性使得我们在插入数据的同时能够方便地获取到数据库自动生成的主键ID,这对于处理一对多、多对多等关联关系的插入操作非常有帮助。只要正确配置并使用这些...
在Python3中操作MySQL数据库并插入一条数据,然后获取并返回这条数据的主键id是数据库编程中常见的需求。这一过程可以分为几个关键步骤:数据库连接、执行插入操作、获取主键id以及事务提交。下面详细说明每个步骤...
MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个...