- 1、获取自增主键的值
- 2、获取非自增主键的值
- 思考
- 问题
- 验证
pojo:
public class User {
private Integer id;
private String name;
private String pwd;
setter和getter....
}
数据库:
映射文件:
insert into user(name,pwd) values(#{name},#{pwd})
获取自增主键的值:
- 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使用序列来模拟自增;每次插入的数据的主键是从序列中拿到的值;
select USER_SEQ.nextval from dual insert into user(id,name,pwd) values(#{id},#{name},#{pwd})
-
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;
- BEFORE运行顺序:
-
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....
}
映射文件
select title from blog where id = 1 update user set name = #{title} where id = 13
测试
@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类参数协作,在实际开发中逻辑比较奇怪,这里只是作为对问题猜测的验证。



