Mapper中insert 顺便返回主键

转自:https://www.cnblogs.com/xingyunblog/p/6243179.html

类似下面这段代码一样获取插入后的主键

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());  

经过查询网上资料,发现大致有两种方式。


方式一:

在实体类的映射文件 "*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(); 方法


### 回答1: Mybatis plus是一款基于Mybatis的增强工具,它在Mybatis的基础上进行了扩展,提供了更加便捷的使用方式。在使用mybatis plus的mapper.insert方法时,如果没有返回主键id,这可能是由于数据源连接池未配置正确导致的。常见设置方式是在application.yml或application.properties文件增加如下配置: ``` # datasource spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.initialSize=1 spring.datasource.maxActive=10 spring.datasource.minIdle=1 spring.datasource.maxWait=60000 spring.datasource.timeBetweenEvictionRunsMillis=60000 spring.datasource.minEvictableIdleTimeMillis=300000 spring.datasource.validationQuery=SELECT 1 spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false ``` 如果以上配置项设置正确,但仍然无法返回主键id,则可以考虑通过在实体类使用@TableId注解指定主键生成策略来解决问题。例如: ``` @TableId(value = "id", type = IdType.AUTO) private Long id; ``` 通过指定type属性值为IdType.AUTO,可以让Mybatis plus自动根据数据库自增长生成主键id。 当然,如果以上解决方法均无效,则可以考虑在mapper.xml文件使用<selectKey>标签手动获取主键id。 总的来说,使用Mybatis plus时如果mapper.insert无法返回主键id要检查数据源连接池配置是否正确,并注意实体类主键的生成策略设置。 ### 回答2: Mybatis Plus是一个基于Mybatis的增强工具库,提供了很多便捷的方法和功能。Mapper.insert方法是其一个经常被使用的方法,它可以将一个实体类对象插入到数据库。但是,在使用Mapper.insert方法插入数据的时候,有的时候我们会遇到一个问题,即没有返回主键id。 造成这种情况的原因是,当我们使用Mapper.insert方法插入数据时,如果实体类没有主键id属性或者主键id属性的值为null,则Mybatis Plus默认使用数据库自增插入主键id。而这时,插入操作是通过SQL语句完成的,数据库返回主键id并不会映射到实体类的主键id属性上,因此Mapper.insert方法无法返回主键id值。 为了解决这个问题,我们可以使用Mybatis Plus提供的两种方法: 1.使用注解@TableId(type= IdType.AUTO)标注实体类的主键id属性,表示主键id是自增的,默认类型为雪花算法(63位随机自增的唯一ID),这样Mybatis Plus会在插入成功后将主键id赋值到实体类的主键id属性上。 2.在Mapper.insert操作后,通过实体类对象获取主键id值,可以使用Mybatis Plus提供的两种方法: (1)实体类主键id属性用@TableId注解,并指定id生成策略,如自增: User user = new User(); user.setName("test"); user.setAge(20); user.setSex(1); user.setAddress("test"); mapper.insert(user); Long id = user.getId(); (2)实体类主键id属性不用@TableId注解,Mapper.insert方法后使用数据库的CURRVAL或NEXTVAL获取主键id: User user = new User(); user.setName("test"); user.setAge(20); user.setSex(1); user.setAddress("test"); mapper.insert(user); Long id = (Long)SqlHelper.getObject(user, MetaObject.forObject(user), "id"); 综上所述,Mybatis Plus Mapper.insert方法没有返回主键id,是因为实体类主键id属性没有映射到返回值里。我们可以使用@TableId注解或者getObject方法获取实体类主键id属性的值来解决这个问题。 ### 回答3: MyBatis Plus作为一个流行的ORM框架,大大简化了Java应用程序与数据库的交互。在使用MyBatis PlusMapper接口进行数据插入时,如果使用Mapper.insert方法,可能会遇到无法返回主键id的情况。 造成该现象的主要原因在于Mapper.insert方法使用了另一个名为SqlMethod.INSERT_ONE的私有静态方法,该方法会忽略对主键id的处理。实际上,该方法的insert语句并没有包含主键列,所以也就无法返回主键id了。 在这种情况下,我们可以使用Mapper.insert方法的重载版本,即Mapper.insert(T entity, boolean selective)。其,第二个参数为一个布尔值,表示是否选择只插入非空字段。通过将该参数置为false,我们可以强制Mapper插入所有字段,包括主键列,从而获得正确的主键id。例如: ``` User user = new User(); user.setName("张三"); user.setAge(20); user.setEmail("zhangsan@qq.com"); mapper.insert(user, false); //将第二个参数置为false System.out.println("新增用户id:" + user.getId()); ``` 除了使用重载方法之外,我们还可以在实体类的主键字段上添加一个注解,指示该字段为自增主键。这样,MyBatis Plus就会自动处理主键id,在插入数据后将主键id赋值给实体对象的主键字段。例如: ``` public class User { @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; private String email; //...省略getter和setter方法 } ``` 在实际开发,我们可以根据具体场景选择使用哪种方式获取插入数据的主键id,以便更好地处理业务逻辑。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值