Mybatis 34_使用useGeneratedKeys返回自增长主键的值 项目0409获取自增长的主键值

发布时间:2024年01月12日

insert元素与@Insert注解

<insert … />元素通常用于定义一条insert语句。需要指定如下一个关键属性:
- id :SQL语句的唯一标识。需要与Mapper接口的方法名相同。
如果你用@Insert注解,id不需要(直接修饰Mapper接口的方法)。
<insert…/>元素还支持大量的额外属性,如果使用@Insert注解,需要配置@Options注解来指定这些额外的属性。

返回自增长主键的值

主要是对MySQL这种自持自增长的数据库有效。
(1) useGeneratedKeys属性(只对<insert…/>元素有效)设置为true
(2) 通过keyProperty告诉MyBatis将自动生成主键值传给参数对象哪个属性。

项目0409获取自增长的主键值

主类

package lee;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.itcheng.app.dao.NewsMapper;
import org.itcheng.app.domain.News;

public class NewsManager
{
	// SqlSessionFactory应该是应用级别
	private static SqlSessionFactory sqlSessionFactory;
	public static void main(String[] args) throws IOException
	{
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		// 1. 创建SqlSessionFactory
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		// 2. 打开SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		// 保存消息
//		saveNews(sqlSession);
		/* 结果
		 * DEBUG [main] org.itcheng.app.dao.NewsMapper.saveNews ==>  Preparing: insert into news_inf values (null, ?, ?) 
		 * DEBUG [main] org.itcheng.app.dao.NewsMapper.saveNews ==> Parameters: 测试标题(String), 测试内容(String)
		 * DEBUG [main] org.itcheng.app.dao.NewsMapper.saveNews <==    Updates: 1
		 * 新插入的news的id为:10
		 * */
		
		// 查询消息
		selectNews(sqlSession);
		/* 结果
		 * class com.sun.proxy.$Proxy17
		 * DEBUG [main] org.itcheng.app.dao.NewsMapper.findNews ==>  Preparing: select news_id id, news_title title, news_content content from news_inf where news_id > ? 
		 * DEBUG [main] org.itcheng.app.dao.NewsMapper.findNews ==> Parameters: -1(Integer)
		 * DEBUG [main] org.itcheng.app.dao.NewsMapper.findNews <==      Total: 9
		 * [News [id=1, title=修改的标题, content=修改的内容], 
		 * News [id=3, title=22, content=2222222222222], 
		 * News [id=4, title=33, content=3333333333333], 
		 * News [id=5, title=44, content=4444444444444], 
		 * News [id=6, title=55, content=5555555555555], 
		 * News [id=7, title=66, content=6666666666666], 
		 * News [id=8, title=77, content=7777777777777], 
		 * News [id=9, title=测试标题, content=测试内容], 
		 * News [id=10, title=测试标题, content=测试内容]]
		 * 
		 * */
	}
	
	public static void saveNews(SqlSession sqlSession)
	{
		News news = new News(null, "测试标题", "测试内容");
		
		NewsMapper newsMapper = sqlSession.getMapper(NewsMapper.class);
		
		newsMapper.saveNews(news);
		// 由于设置了useGeneratedKey属性为true,并将keyProperty设为id
		// 因此程序即可通过news对象的id属性来获取数据库底层生成的自增长主键的值
		System.out.println("新插入的news的id为:" + news.getId());
		
		// 4. 提交事务
		sqlSession.commit();
		// 5. 关闭资源
		sqlSession.close();	
	}
	
	public static void selectNews(SqlSession sqlSession)
	{
		// 此处的NewsMapper只是一个接口
		// MyBatis会使用JDK的动态代理为Mapper接口生成实现类
		NewsMapper newsMapper = sqlSession.getMapper(NewsMapper.class);
		System.out.println(newsMapper.getClass());
		List<?> list = newsMapper.findNews(-1);
		
		System.out.println(list);
		
		// 4. 提交事务
		sqlSession.commit();
		// 5. 关闭资源
		sqlSession.close();	
	}	
		
}

映射文件 insert标签useGeneratedKeys属性和keyProperty属性组合使用

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
	PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 根元素是mapper,该元素的namespace属性值相当于该mapper的唯一标识 -->	
<mapper namespace="org.itcheng.app.dao.NewsMapper">

	<!-- 
	useGeneratedKeys属性设为true,将数据库生成的自增长主键值返回给参数对象
	keyProperty告诉MyBatis将自增长的主键值返回给参数对象的id属性
	  -->
	<insert id="saveNews" useGeneratedKeys="true" keyProperty="id">
		insert into news_inf values (null, #{title}, #{content})
	</insert>

	<select id="findNews" resultType="news">
		select news_id id, news_title title, news_content content from news_inf where news_id > #{id}		
	</select>
	
</mapper>

接口文件

package org.itcheng.app.dao;

import java.util.List;

import org.itcheng.app.domain.News;

// Mapper组件相当于DAO组件
public interface NewsMapper
{
	int saveNews(News news);
	
	List<News> findNews(Integer id);

}
文章来源:https://blog.csdn.net/weixin_39289095/article/details/134593845
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。