一、自增主键的返回
Mysql自增主键,执行insert提交之前自动生成一个自增主键。
通过MySQL函数获取到刚刚插入记录的主键:
LAST_INSERT_ID()
在insert之后调用此函数。
1、修改User.xml中的代码
通过MySQL函数获取到刚刚插入记录的主键:
LAST_INSERT_ID()
在insert之后调用此函数。
1、修改User.xml中的代码
<!-- 添加用户
parameterType:指定输入参数类型是pojo(包括用户信息)
#{}中指定pojo的属性名,接收到pojo对象的属性值,
mybatis也是通过OGNL获取对象的属性值
-->
<insert id="insertUser" parameterType="cn.sunft.mybatis.po.User">
<!-- 将刚刚插入的主键返回,返回到user对象中
SELECT LAST_INSERT_ID():得到insert进去记录的主键值,只适用于自增主键
keyProperty:将查询到主键值设置到parameterType指定的对象的那个属性
order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
resultType:指定结果的类型
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user(username, birthday, sex, address)
value(#{username}, #{birthday}, #{sex}, #{address})
</insert>
2、修改Java类中的代码
/**
* 添加用户信息
*/
@Test
public void insertUserTest(){
//mybatis配置文件
String resource = "SqlMapConfig.xml";
//得到配置文件,这种方式与路径耦合
//InputStream inStream = Resources.getResourceAsStream(resource);
//与路径解耦
InputStream inStream = this.getClass()
.getClassLoader().getResourceAsStream(resource);
//创建会话工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inStream);//创建工厂
//通过工厂得到SqlSession
SqlSession sqlSession = factory.openSession();
//插入用户对象
User user = new User();
user.setId(2);
user.setUsername("王小军");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("河南郑州");
//通过SqlSession操作数据库
sqlSession.insert("test.insertUser", user);
sqlSession.commit();
//获取用户信息主键
System.out.println("主键:" + user.getId());
//释放资源
sqlSession.close();
}
二、非自增主键的返回(使用UUID())
使用MYSQL的uuid()函数生成主键,需要修改表中的id字段类型为varchar,长度设置成35位。
执行思路:
先通过uuid()查询到主键,将主键输入到sql语句中。
执行uuid()语句顺序相对于insert()语句之前执行。
1、新增测试类并建立数据表
执行思路:
先通过uuid()查询到主键,将主键输入到sql语句中。
执行uuid()语句顺序相对于insert()语句之前执行。
1、新增测试类并建立数据表
package cn.sunft.mybatis.po;
public class Student {
private String id;
private String name;
public Student() {
super();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2、在User.xml中添加如下SQL配置信息
<insert id="insertStudent" parameterType="cn.sunft.mybatis.po.Student">
<!--
使用MySQL的uuid()生成主键
执行过程:
首先通过uuid()得到主键,将主键设置到student对象的id字段中
其次在insert执行时,从user对象中取出id属性插入数据库
-->
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
SELECT uuid()
</selectKey>
insert into student(id, name) value(#{id}, #{name})
</insert>
3、编写测试类进行测试
/**
* 添加用户信息
*/
@Test
public void insertStudentTest(){
//mybatis配置文件
String resource = "SqlMapConfig.xml";
//得到配置文件,这种方式与路径耦合
//InputStream inStream = Resources.getResourceAsStream(resource);
//与路径解耦
InputStream inStream = this.getClass()
.getClassLoader().getResourceAsStream(resource);
//创建会话工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inStream);//创建工厂
//通过工厂得到SqlSession
SqlSession sqlSession = factory.openSession();
//插入学生对象
Student student = new Student();
student.setName("江东才");
//通过SqlSession操作数据库
sqlSession.insert("test.insertStudent", student);
sqlSession.commit();
//获取用户信息主键
System.out.println("主键:" + student.getId());
//释放资源
sqlSession.close();
}
通过Oracle序列生成主键:
<insert id="insertStudent" parameterType="cn.sunft.mybatis.po.Student">
<!--
使用Oracle的序列生成主键
-->
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
SELECT 序列名.nextVal()
</selectKey>
insert into student(id, name) value(#{id}, #{name})
</insert>
Mybatis获取返回的主键的另一种方式(未测试):
<!-- 插入语句,告诉mybatis将生成的主键返回到指定对象的id属性中 -->
<insert id="insert" useGeneratedKeys="true" keyProperty="id"
keyColumn="id" parameterType="com.sunft.bean.Command">
insert into CAMMAND(NAME,DESCRIPTION) values(#{name},#{description})
</insert>