Mybatis获取自增主键的值

WorkHaH
2022-01-03 11:32
1065 次阅读

Mybatis获取自增主键的值

pojo:

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

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

1、获取自增主键的值

映射文件:

Copy
<!-- 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>

获取自增主键的值:

  • Mysql 支持自增主键,自增主键值的获取,Mybatis 也是利用statement.getGenreatedKeys()
  • useGeneratedKeys="true"使用自增主键获取主键值策略
  • keyProperty指定对应的主键属性,也就是Mybatis 获取到主键值以后,将这个值封装给javaBean 的哪个属性。

测试获取主键值:

Copy
@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变量。

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

2、获取非自增主键的值

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

Copy
<!-- 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:查出的主键值封装给 javaBean 的哪个属性

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

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

测试获取主键值:

Copy
@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提前执行把获取到的主键值封装到 JavaBean 中,然后再作为 sql 的输入执行 sql 语句,那么selectKey可不可以获取的是其他的值,甚至是另一个表获取的数据作为输出呢

验证#

答案是可以的!
blog类

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

映射文件

Copy
<!-- 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>

测试

Copy
@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类参数协作,在实际开发中逻辑比较奇怪,这里只是作为对问题猜测的验证。

posted @   WorkHaH  阅读(1070)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· DeepSeek本地性能调优
· 一文掌握DeepSeek本地部署+Page Assist浏览器插件+C#接口调用+局域网访问!全攻略
点击右上角即可分享
微信分享提示
目录