MyBatis -- SelectKey

本文介绍在MyBatis中使用selectKey元素为插入记录生成主键的方法,包括XML映射文件配置和注解映射两种方式,并通过示例展示了如何在程序中获取并利用这些自动生成的主键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于不支持自动生成类型的数据库或可能不支持自动生成主键 JDBC 驱动来说,MyBatis 有另外一种方法来生成主键。
这里有一个简单(甚至很傻)的示例,它可以生成一个随机 ID
(你最好不要这么做,这里只是用于展示MyBatis 处理问题的灵活性及其所关心的广度):

<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>
在上面的示例中,selectKey 元素将会首先运行,Author 的 id 会被设置,然后插入语句会被调用。
这给你了一个和数据库中来处理自动生成的主键类似的行为,避免了使 Java 代码变得复杂。


这里呢还有另外一种用途,比如数据在插入数据库的时候,想要在程序中获取这个插入的主键,就可以通过selectKey先生成主键,接下来在执行插入语句之后,这个selectKey就能够被填充到keyProperty定义的属性中(JavaBean的属性)。

一。XML映射文件的设置方式:
接口:
     public   void   saveFood (Food   food);

Food 是个自己定义的JavaBean,有这个三个属性:
private String FoodId;
private String FoodName;
private String price;


XML映射文件的声明:
<insert id="saveFood">
    <!-- 用的是Oracle数据库,表的主键用序列生成 -->
 <selectKey keyProperty="foodId" order="BEFORE" statementType="STATEMENT" resultType="string">
	select FOOD_SEC.NEXTVAL from dual
 </selectKey>
	insert into food values(#{foodId} , #{foodName} , #{price})
</insert>
注意:resultType和Bean中对应字段的数据类型一定要一致。



测试方法:
@Test
public void saveFood() throws IOException{

      
        // 获取数据库会话

        SqlSession session = getSession();
        

        // 获取映射接口

        FoodMapper mapper = session.getMapper(FoodMapper.class);

        

        Food food = new Food();

        food.setFoodName("红烧狮子头");

        food.setPrice("55");

        

        // 插入数据库

        mapper.saveFood(food);

        

        // 提交事务

        session.commit();

        

        /* 现在这个Food实例的foodId的值就是selectKey中的SQL语句返回的值。 */

        System.out.println(food.getFoodId());
}
输出结果:

这个Food实例从创建到方法结束,可没有手动给foodId赋值过,这个23是selectKey中的SQL语句的执行结果被填充到了这个Bean中。


二。注解映射的设置方式:

@SelectKey(
                before = true, // 在方法执行前执行selectKey
                keyProperty = "foodId", // 填充的字段
                resultType = String.class, // selectKey的数据类型
                statement = "select FOOD_SEC.NEXTVAL from dual" // 产生key的SQL语句)
@Insert("insert into food values(#{foodId} , #{foodName} , #{price})")
public void insertFood(Food food);

测试方法:
@Test
public void insertFood() throws IOException{
        SqlSession session = getSession();
        FoodMapper mapper = session.getMapper(FoodMapper.class);
        
        Food food = new Food();
        food.setFoodName("卤水拼盘");
        food.setPrice("50");
        
        mapper.insertFood(food);
        session.commit();
        
        System.out.println("selectKey:" + food.getFoodId());
}
运行结果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值