MyBatis insert 返回主键的方法

本文详细介绍了如何在数据库操作中结合MyBatis框架进行数据的增删改查,并通过实例演示了如何使用MyBatis的动态SQL、缓存及事务管理功能。重点阐述了MyBatis的XML映射文件配置以及使用MyBatis插入数据时如何获取自增主键的方法。
表结构:
/*==============================================================*/
/* Table: Dic_City                                              */
/*==============================================================*/
create table Dic_City (
   ID                   int                  identity ,
   City_Code            varchar( 10)          not null ,
   Provinces_Code       varchar( 20)          not null ,
   State_Code           varchar( 10)          not null ,
   City_Name            varchar( 50)          null ,
   PY_Code              varchar( 50)          null ,
   PY_Code_Short        varchar( 10)          null ,
   Ext1                 varchar( 20)          null ,
   Ext2                 varchar( 20)          null ,
   Ext3                 varchar( 20)          null ,
   Ext4                 varchar( 20)          null ,
   Ext5                 varchar( 20)          null ,
   constraint PK_DIC_CITY primary key ( ID)
)

MyBatisXML配置,下面两种方式都行

方式1:
<insert id= "insert" parameterType= "cn.softsea.model.DicCity" >
  <selectKey resultType= "java.lang.Integer" keyProperty= "id" order= "AFTER" >
    SELECT @@IDENTITY
  </selectKey>
  insert into Dic_City (City_Code, Provinces_Code,
    State_Code, City_Name, PY_Code,
    PY_Code_Short, Ext1, Ext2,
    Ext3, Ext4, Ext5)
  values (#{cityCode,jdbcType=VARCHAR}, #{provincesCode,jdbcType=VARCHAR},
    #{stateCode,jdbcType=VARCHAR}, #{cityName,jdbcType=VARCHAR}, #{pyCode,jdbcType=VARCHAR},
    #{pyCodeShort,jdbcType=VARCHAR}, #{ext1,jdbcType=VARCHAR}, #{ext2,jdbcType=VARCHAR},
    #{ext3,jdbcType=VARCHAR}, #{ext4,jdbcType=VARCHAR}, #{ext5,jdbcType=VARCHAR})
</insert>
方式2:
<insert id= "insert" parameterType= "cn.softsea.model.DicCity" useGeneratedKeys= "true" keyProperty= "id" >
  insert into Dic_City (City_Code, Provinces_Code,
    State_Code, City_Name, PY_Code,
    PY_Code_Short, Ext1, Ext2,
    Ext3, Ext4, Ext5)
  values (#{cityCode,jdbcType=VARCHAR}, #{provincesCode,jdbcType=VARCHAR},
    #{stateCode,jdbcType=VARCHAR}, #{cityName,jdbcType=VARCHAR}, #{pyCode,jdbcType=VARCHAR},
    #{pyCodeShort,jdbcType=VARCHAR}, #{ext1,jdbcType=VARCHAR}, #{ext2,jdbcType=VARCHAR},
    #{ext3,jdbcType=VARCHAR}, #{ext4,jdbcType=VARCHAR}, #{ext5,jdbcType=VARCHAR})
</insert>
调用Mapper返回主键:
//生成新对象用于插入
DicCity city = new DicCity();
city . setCityCode( "330100");
city . setCityName( "杭州市");

//获取mapper对象
DicCityMapper cityMapper = (DicCityMapper) SpringContextUtil.getBean("dicCityMapper");

int row = cityMapper.insert(city);    //insrt不再返回主键,只返回响应行数,这点和ibatis不同了

System.out.println("响应的行数:"+row);
//取得自增的标识列 ID的值
System.out.println("新插入的数据的ID:"+city.getId());


MyBatisinsert操作返回主键主要有以下两种方法: ### 使用`useGeneratedKeys`属性 当插入的表id以自增列为主键时,可将`useGeneratedKeys`设置为`true`,允许JDBC支持自动生成主键,并将自动生成的主键id返回。该参数只针对insert语句生效,默认为`false`。示例代码如下: ```xml <insert id="insert" keyProperty="id" useGeneratedKeys="true"> INSERT INTO student( name, age) values(#{name},#{age}) </insert> ``` 上述代码中,`keyProperty`指定了将生成的主键赋值给实体类中的哪个属性。如果使用逆向工程生成的mapper代码,`insert`标签可以这样写: ```xml <insert id="insertSelective" parameterType="com.demo.UserData" useGeneratedKeys="true" keyProperty="id"> <!-- SQL语句 --> </insert> ``` 这种方式适用于支持自动生成主键的数据库和JDBC驱动,如MySQL等[^2][^3]。 ### 使用`selectKey`标签 对于不支持自动生成主键列的数据库和可能不支持自动生成主键的JDBC驱动,可使用`selectKey`标签来生成主键。`selectKey`标签有以下属性: - `resultType`:结果类型。 - `keyProperty`:实体类中属性名。 - `keyColumn`:数据库主键字段名。 - `order`:可以设置为`BEFORE`或`AFTER`。如果设置为`BEFORE`,会首先选择主键,设置`keyProperty`然后执行插入语句;如果设置为`AFTER`,则先执行插入语句,然后是`selectKey`元素,这和像Oracle的数据库相似,在插入语句内部可能有嵌入索引调用。 - `statementType`:MyBatis支持`STATEMENT`、`PREPARED`和`CALLABLE`语句的映射类型,分别代表`PreparedStatement`和`CallableStatement`类型。 以下是一个使用`selectKey`标签的示例: ```xml <insert id="INSERT" parameterType="com.kebi.User"> <selectKey resultType="int" order="AFTER" keyProperty="id" keyColumn="id"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO users ( username, password ) VALUES ( #{username}, #{password} ) </insert> ``` 另外,还有一个简单示例,它可以生成一个随机ID(不建议实际使用,仅用于展示MyBatis处理问题的灵活性和宽容度): ```xml <insert id="insertAuthor"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1 </selectKey> insert into Author (id, username, password, email,bio, favourite_section) values (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR}) </insert> ``` 这种方式适用于各种数据库,通过自定义SQL语句来生成主键[^1][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值