mybatis获得刚刚插入的自增的值
转自这里
在http://blog.csdn.net/zhangwenan2010/article/details/7579191 介绍了MyBatis 3 的配置过程,
其中,Product 类的 id 属性,在真实项目中,它的值是唯一的,以便确定对应的数据。
要在Java 中自动生成这样的 id 值,必然要进行额外的运算来找到一个唯一的 id 值,那么一旦需要存储大量的数据,这个问题就有可能成为瓶颈。
那么,解决方案是?
其实大多数主流数据库都已经提供了自动生成唯一id 值的解决方案,我们只需要将这个值与我们的 Java 对象关联起来就可以了。
比如:
1、Mysql 数据库,AUTO_INCREMENT
2、MS SQL Server 数据库,IDENTITY
修改原先的代码
工具:
1、MyBatis 3.1.0 ( 原先使用的 MyBatis 3.0.4 有bug)
2、Mysql Java Connector 5.1
首先,修改数据库
- CREATE TABLE Product(id BIGINT NOT NULL AUTO_INCREMENT , brand VARCHAR(20),
- model VARCHAR(20), name VARCHAR(30) , PRIMARY KEY (id));
然后,修改配置文件
- <?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="com.raistudies.services.ProductServices">
- <insert id="save" parameterType="product" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
- INSERT INTO Product (brand,model,name)
- VALUE (#{brand}, #{model}, #{name} )
- <selectKey keyProperty="id" resultType="long" order="AFTER">
- SELECT LAST_INSERT_ID();
- </selectKey>
- </insert>
- </mapper>
可以发现,我们对<insert/>标签作了以下修改:
1、增加了 useGeneratedKeys=”true” ,这一设置指定了 “id” 属性将会由数据库来自动生成,keyProperty ="id" 指定 Product 类中的 id 属性,keyColumn="id" 则指定了Product 表中的列名 id
2、使用<selectKey> 标签,就会在数据库自动生成 id 之后,将id 的值返回给 Java 程序中的对象,那么product 实例中的id 值就会被正确设置。
SELECT LAST_INSERT_ID() 这一语法,根据使用数据库类型的不同,有可能不同,本例中的语句仅适用与MySQL
- package com.raistudies.runner;
- import java.io.IOException;
- import java.io.Reader;
- 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 com.raistudies.domain.Product;
- import com.raistudies.services.ProductServices;
- public class AppTester {
- private static SqlSessionFactory sessionFac = null;
- private static Reader reader;
- private static String CONFIGURATION_FILE = "sqlmap-config.xml";
- static{
- try {
- reader = Resources.getResourceAsReader(CONFIGURATION_FILE);
- sessionFac = new SqlSessionFactoryBuilder().build(reader);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- SqlSession session = sessionFac.openSession();
- try {
- ProductServices productServiceObj = session.getMapper(ProductServices.class);
- Product product = new Product();
- product.setBrand("LG");
- product.setModel("P500");
- product.setName("Optimus One");
- productServiceObj.save(product);
- System.out.println("The new id is : " + product.getId());
- session.commit();
- } finally {
- session.close();
- }
- }
- }
mybatis获得刚刚插入的自增的值的更多相关文章
- mybatis获取刚刚插入到数据库的数据的id(转载)
原文地址:https://blog.csdn.net/hehuihh/article/details/82800739 我用的是第一种写法,直接把代码copy到insert标签里(id要是自增id) ...
- mysql获取插入时自增ID值的方法
1. LAST_INSERT_ID: LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变. LAST_INSERT_ID是 ...
- MyBatis 插入时返回刚插入记录的主键值
MyBatis 插入时返回刚插入记录的主键值 一.要求: 1.数据库表中的主键是自增长的,如:id: 2.获取刚刚插入的记录的id值: 二.源代码: 1.User.java package cn.co ...
- 关于mybatis用mysql时,插入返回自增主键的问题
公司决定新项目用mybatis,虽然这个以前学过但是一直没用过都忘得差不多了,而且项目比较紧,也没时间去系统点的学一学,只好很粗略的百度达到能用的程度就行了. 其中涉及到插入实体要求返回主键id的问题 ...
- 获取刚刚插入表格的这条信息的自增ID
获取刚刚插入表格的这条信息的自增ID var conn=getConnection(); var msql="INSERT INTO " + table +" (&quo ...
- Mybatis 插入数据并返回刚刚插入的数据id
1.在Mybatis Mapper文件中添加属性“useGeneratedKeys”和“keyProperty”,其中keyProperty是Java对象的属性名,而不是表格的字段名. 2.Mybat ...
- MyBatis+MySQL 返回插入的主键ID
需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法:在mapper中指定keyProperty属性,示例如下: <insert id="i ...
- (转)MyBatis+MySQL 返回插入的主键ID
MyBatis+MySQL 返回插入的主键ID 需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法:在mapper中指定keyProperty属性,示例如 ...
- myBatis获取批量插入数据的主键id
在myBatis中获取刚刚插入的数据的主键id是比较容易的 , 一般来说下面的一句话就可以搞定了 , 网上也有很多相关资料去查. @Options(useGeneratedKeys = true, k ...
随机推荐
- 织梦dedecms 用交叉栏目时arclist标签调用不出内容文章的问题(纯转载)
本文转自:http://www.cnblogs.com/cnteam/articles/4056702.html 最近用了交叉栏目发现当为手动指定交叉栏目ID时用arclist标签不能调出相关文章最后 ...
- Xen虚拟机磁盘镜像模板制作(一)—Windows Server 2008(2012)
这段时间一直在研究如何制作一个适合Xen虚拟化的Windows Server 2008(2012)磁盘镜像,中间虽然遇到了一些阻挠,不过最终还是顺利解决,成功制作出了Xen Windows Serve ...
- Eclipse 插件安装方法和插件加载失败解决办法
一:是利用Eclipse Software Update 添加网址,让Eclipse 自动的搜索下载最新的插件. 比如安装VE这个可视化编辑UI的插件,其步骤为 Help > Software ...
- eclipse debug (调试) 学习心得
eclipse debug (调试) 学习心得 进入debug模式: 1.设置断点 2.启动servers端的debug模式 3.运行程序,在后台遇到断点时,进入debug调试状态 ...
- 织梦dedecms模板调用标签大全-提高制作模板速度
关键描述调用标签: ——————————————————————————–模板路径调用标签: {dede:field name=’templeturl’/}—————————————————————— ...
- ZPPR001-(展bom)
************************************************************************ Title : ZPPR010 ** Applicat ...
- ZOJ 1045 HangOver
原题链接 题目大意:叠扑克牌,给出伸出长度,问最多需要几张扑克牌. 解法:循环累加.退出循环后向上取整输出. 参考代码: #include<iostream> using namespac ...
- 使用Spring Aop验证方法参数是否合法
先定义两个注解类ValidateGroup 和 ValidateFiled ValidateGroup .java package com.zf.ann; import java.lang.annot ...
- bzoj 1061 志愿者招募(最小费用最大流)
[Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 3792 Solved: 2314[Submit][Status][Di ...
- HDU-4747 Mex(线段树区间更新)
题目大意:给一个长度为n的整数序列,定义mex(i,j)表示区间[i,j]中没有出现过的最小非负整数,求sigma(mex(i,j)),即序列中所有连续非空子区间的mex之和. 题目分析: answe ...