Mybatis获取自增主键的值(Mysql和Oracle)

pojo:

public class User {
    private Integer id;
    private String name;
    private String pwd;
    setter和getter....
}

数据库:
在这里插入图片描述

1、获取自增主键的值

映射文件:

	<!-- UserMapper接口 public void addUser(User user); -->
	<insert id="addUser" parameterType="com.workhah.pojo.User" useGeneratedKeys="true" keyProperty="id" databaseId="mysql">
		insert into user(name,pwd) 
		values(#{name},#{pwd})
	</insert>

获取自增主键的值:

  • M y s q l Mysql Mysql 支持自增主键,自增主键值的获取, M y b a t i s Mybatis Mybatis 也是利用statement.getGenreatedKeys()
  • useGeneratedKeys="true"使用自增主键获取主键值策略
  • keyProperty指定对应的主键属性,也就是 M y b a t i s Mybatis Mybatis 获取到主键值以后,将这个值封装给 j a v a B e a n javaBean javaBean 的哪个属性。

测试获取主键值:

    @Test
    public void test() {
        SqlSession sqlSession = getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = new User(0, "workhah", "123");
        mapper.addUser(user); 
        System.out.println(user.getId());	// 14
        // 原本user表就有13条数据,现在插入一条数据该数据的id就为14,而且这个自增主键id的值返回了给user变量。
    }

原本user表就有13条数据,现在插入一条数据该数据的id就为14,而且这个自增主键id的值返回了给user变量。

因此要注意的是,想要获取自增主键的值,必须得有对应得 J a v a B e a n JavaBean JavaBean类(如上例中的user变量),该类来封装自增主键的值。

2、获取非自增主键的值

Oracle不支持自增;Oracle使用序列来模拟自增;每次插入的数据的主键是从序列中拿到的值;

	<!-- UserMapper接口 public void addUser(User user); -->
	<insert id="addUser" databaseId="oracle">
		<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
			<!-- 编写查询主键的sql语句 -->
			<!-- BEFORE-->
			select USER_SEQ.nextval from dual 
		</selectKey>
		
		<!-- 插入时的主键是从序列中拿到的 -->
		<!-- BEFORE:-->
		insert into user(id,name,pwd) 
		values(#{id},#{name},#{pwd})
	</insert>
  • keyProperty:查出的主键值封装给 j a v a B e a n javaBean javaBean 的哪个属性

  • order="BEFORE":当前 sql 在插入 sql 之前运行
    AFTER:当前 sql 在插入 sql 之后运行

    • BEFORE运行顺序:
      先运行selectKey查询 id 的 sql;查出 id 值封装给 j a v a B e a n javaBean javaBean 的 id 属性
      在运行插入的 sql;就可以取出 id 属性对应的值
    • AFTER运行顺序:
      先运行插入的 sql(从序列中取出新值作为 id)
      再运行selectKey查询 id 的 sql;
  • resultType:查出的数据的返回值类型

测试获取主键值:

    @Test
    public void test() {
        SqlSession sqlSession = MyTest.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = new User(0, "workhah", "123");
        mapper.addUser(user); 
        System.out.println(user.getId());	// 12
    }

思考

问题

既然 selectKey提前执行把获取到的主键值封装到 J a v a B e a n JavaBean JavaBean 中,然后再作为 sql 的输入执行 sql 语句,那么selectKey可不可以获取的是其他的值,甚至是另一个表获取的数据作为输出呢

验证

答案是可以的!
blog类

public class Blog {
    private int id;
    private String title;
    private String author;
    private String createTime;
    private int views;
    setter和getter....
}

映射文件

<!-- UserMapper接口 public void updateUser(Blog blog); -->
<update id="updateUser" parameterType="user">
	<selectKey keyProperty="title" resultType="String" order="BEFORE">
		select title from blog where id = 1
	</selectKey>
	update user set name = #{title} where id = 13
</update>

测试

@Test
    public void test() {
        SqlSession sqlSession = MyTest.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Blog blog = new Blog(0, null, null, null,0);
        System.out.println(blog);
        // 结果
        // Blog(id=0, title=Mybatis, author=null, createTime=null, views=0)
    }

数据库
在这里插入图片描述

selectKey的返回值作为 sql 语句的输入成功修改和数据库,并且成功返回给了变量blog。这接口方法虽然可以实现跨表,但是需要用到Blog类参数协作,在实际开发中逻辑比较奇怪,这里只是作为对问题猜测的验证。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值