Mybatis之主键的返回(6)

一、自增主键的返回

Mysql自增主键,执行insert提交之前自动生成一个自增主键。
通过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、新增测试类并建立数据表
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>





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值