mybatis主键返回

在项目开发中,有时需要获取主键值。

比如在表的关联关系中,将数据插入主表之后需要再插入子表,我们需要把主表的主键作为外键插入子表中。

这样的话就需要获取主键值了。

所以涉及主键返回的问题。

1.自增主键的返回

MYSQL自增主键,执行insert提交之前自动生成一个自增主键。

通过mysql函数获取到刚刚插入的记录的自增主键。

LAST_INSERT_ID(),在insert之后调用此函数。

<insert id="insertUser" parameterType="com.winner.User">
        <!--
            将插入数据的主键返回,插入到user对象中。
            SELECT LAST_INSERT_ID():得到刚刚insert进去记录的主键值,只适用于自增主键。
            keyProperty:将查询到的主键值设置到parameterType指定的对象的哪个属性上。
            order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序。
            resultType:指定SELECT LAST_INSERT_ID()的结果类型
        -->
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            SELECT LAST_INSERT_ID()
        </selectKey>
        INSERT INTO user(username,birthday,sex,address) VALUES (#{userName},#{birthday},#{sex},#{address})
</insert>
User user = new User();
user.setUserName("王小二");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("江苏南京");
sqlSession.insert(User.class.getName().concat(".") + "insertUser", user);

可以看到,这里生成的user对象并没有设置id的值,默认是0,mapper文件中的selectKey 的设置会使得user对象的id的值是数据库中对应的记录的主键id的值。

当然是插入操作完成之后才有这个值。

2.非自增主键返回

使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。

执行思路:

先通过uuid()查询到主键,将主键输入到sql语句中。

执行uuid()语句顺序相对于insert语句之前执行。

<insert id="insertUser" parameterType="com.winner.User">

        <!--
            使用mysql的uuid()函数生成主键,将主键设置到user对象的id属性中。
            其次在执行insert语句时,从user对象中取出id属性的值。
            注意,这样的话insert语句中就需要包括id字段和id属性。
        -->
        <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
            SELECT uuid()
        </selectKey>
        INSERT INTO user(id,username,birthday,sex,address) VALUES (#{id},#{userName},#{birthday},#{sex},#{address})
</insert>

注意,这种情况下,表的id字段类型必须是varchar类型,不能自增,长度必须大于35.

User user = new User();
user.setUserName("王小二");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("江苏南京");
sqlSession.insert(User.class.getName().concat(".") + "insertUser", user);

可以看到,这里生成的user对象并没有设置id的值,默认是null,mapper文件中的selectKey 的设置会使得user对象的id的值是数据库中对应的记录的主键id的值。

但是在插入操作之前这个值就有了。

时间: 2024-11-05 14:54:48

mybatis主键返回的相关文章

mybatis主键返回的实现

向数据库中插入数据时,大多数情况都会使用自增列或者UUID做为主键.主键的值都是插入之前无法知道的,但很多情况下我们在插入数据后需要使用刚刚插入数据的主键,比如向两张关联表A.B中插入数据(A的主键是B的外键),向A表中插入数据之后,向B表中插入数据时需要用到A的主键. 比如添加一个用户,同时返回插入用户后得到的用户id: /** * 添加用户信息 * @param user * @throws Exception */ public intinsertUser(User user) throw

mybatis主键返回语句 使用方法,就是实体类.getid即可拿到返回的id

<insert id="insertSelective" parameterType="com.o2o.Content" useGeneratedKeys="true" keyProperty="id"> insert into notice_ncontent <trim prefix="(" suffix=")" suffixOverrides=",&quo

mybatis的执行流程 #{}和${} Mysql自增主键返回

n Mybatis配置 全局配置文件SqlMapConfig.xml,配置了Mybatis的运行环境等信息. Mapper.xml文件即Sql映射文件,文件中配置了操作数据库的Sql语句.此文件需要在SqlMapConfig.xml中加载. n 通过Mybatis环境等配置信息构造SqlSessionFactory,即会话工厂. n 由会话工厂创建SqlSession即会话,操作数据库需要通过SqlSession进行. n Mybatis底层自定义了Executor执行器接口操作数据库,Exec

mybatis+oracle 完成插入数据库,并将主键返回的注意事项

mybatis+oracle 完成插入数据库,并将主键返回的注意事项一条插入语句就踩了不少的坑,首先我的建表语句是: create table t_openapi_batch_info( BATCH_NO VARCHAR2(200), UM_CODE VARCHAR2(50), BATCH_STATUS CHAR(1) DEFAULT '0', BATCH_TYPE CHAR(1), CREATED_DATE DATE, CREATED_BY VARCHAR(100), UPDATED_DATE

mybatis自增主键返回

自增主键的返回: mysql自增主键,执行insert提交之前自动生成一个自增主键. 通过mysql函数获取到刚插入记录的自增主键: LAST_INSERT_ID() 是insert之后调用此函数. 修改insertUser定义: 非自增主键返回: 使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位. 执行思路: 先通过uuid()查询到主键,将主键输入 到sql语句中. 执行uuid()语句顺序相对于insert语句之前执行. 通过oracle的

mybatis入门--主键返回(九)

自增主键返回 mysql自增主键,执行insert提交之前自动生成一个自增主键. 通过mysql函数获取到刚插入记录的自增主键: LAST_INSERT_ID() 是insert之后调用此函数. 修改insertUser定义: 非自增主键返回(使用uuid()) 使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位. 执行思路: 先通过uuid()查询到主键,将主键输入 到sql语句中. 执行uuid()语句顺序相对于insert语句之前执行. 通过

c# datatable按主键合并相同主键返回新的datatable

一.概述: 在python转c#时,python中pandas.merge可以按主键合并两个datatable,苦苦找了很久,希望c#也有同样的函数,未果,就自己写了一个,目前测试没问题,同样我也考虑了效率和简洁的问题. 二.原理:      (1)封装的函数如下:传入两个datatable和主键,返回一个datatable private DataTable unite_on_datatable(DataTable dt1,DataTable dt2,string key) (2)先将dt1和

mybatis主键回填和自定义

主键回填 insert配置字段: id:和命名空间组合作为唯一标识 keyProperty:主键列名,联合组建则以分号分隔 useGeneratedKeys:是否内部生成主键 keyColumn:主键是第几列 例子:(role有id,roleName,note三个属性) <insert id="insertRole" parameterType="role"  useGeneratedKeys="true" keyProperty=&quo

oracle,mybatis主键自增长

<insert id="insert" parameterType="resource"> <selectKey resultType="long" order="BEFORE" keyProperty="id"> SELECT sys_resource_id_SEQ.NEXTVAL AS id FROM DUAL </selectKey> INSERT INTO <