mysql数据库插入数据获取自增主键的三种方式(jdbc PreparedStatement方式、mybatis useGeneratedKeys方式、mybatis selectKey方式)
通常来说对于mysql数据库插入数据获取主键的方法是采用selectKey的方式,特别是当你持久层使用mybatis框架的时候。
本文除此之外介绍其它两种获取主键的方式。
为了方便描述我们先建一张mysql数据库的表:
CREATE TABLE `company_01` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='company_01';
一、 jdbc PreparedStatement方式
首先介绍一种jdbc获取主键的方式,其它两种方式也是对它的封装的实现,方便我们使用mybatis框架的时候获取主键值。
代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle; public class InformationSchema { private static Connection con=null;
private static PreparedStatement ps=null;
private static ResultSet rs=null; static{
ResourceBundle resourceBundle = ResourceBundle.getBundle("jdbc");
String driverName = resourceBundle.getString("jdbc.driverClassName");
String jdbc = resourceBundle.getString("jdbc.url");
String user = resourceBundle.getString("jdbc.username");
String password = resourceBundle.getString("jdbc.password");
try {
Class.forName(driverName);
con=DriverManager.getConnection(jdbc, user, password);
} catch (Exception e) {
e.printStackTrace();
} } public static void insertTable(String sql) {
try {
//Statement.RETURN_GENERATED_KEYS,为必传参数
ps = con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
int count = ps.executeUpdate();
rs= ps.getGeneratedKeys();
rs.next();
System.out.println(rs.getInt(1)); } catch (Exception e) {
e.printStackTrace();
} } public static void main(String[] args) {
String sql = "INSERT INTO company_01 (`name`) VALUES ('阿里巴巴')";
insertTable(sql);
} }
以上这种方式,使用了 PreparedStatement 的getGeneratedKeys()方法,在插入的执行之后,获取主键值。
二,mybatis useGeneratedKeys方式
这种方式主要使用了<insert id="insertCompany_01" useGeneratedKeys="true" keyProperty="id"></insert>标签的这两个属性给传进来的map的key或者对象的id属性进行赋值(若为对象,keyProperty的值须跟属性名进行对应)
spring和mybatis集成的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 注册属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/> <!-- 阿里 druid数据库连接池 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- 数据库基本信息配置 -->
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="driverClassName" value="${jdbc.driverClassName}" /> <!-- 初始化连接大小 -->
<property name="initialSize" value="${jdbc.initialSize}"></property>
<!-- 连接池最大数量 -->
<property name="maxActive" value="${jdbc.maxActive}"></property>
<!-- 连接池最大空闲 -->
<property name="maxIdle" value="${jdbc.maxIdle}"></property>
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${jdbc.minIdle}"></property>
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="${jdbc.maxWait}"></property>
</bean> <!-- 配置mybatis -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!-- mapper扫描 -->
<property name="mapperLocations">
<array>
<value>classpath*:mapper/*.xml</value>
</array>
</property>
</bean> <!-- 配置映射扫描配置器 -->
<!-- 可以帮助我们扫描dao包下的所有接口生成代理实现类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<property name="basePackage" value="com.opensource.dao" />
</bean> </beans>
mybatis的sql配置文件
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.opensource.dao.CompanyDao"> <insert id="insertCompany_01" useGeneratedKeys="true" keyProperty="id">
INSERT INTO `company_01` (`name`) VALUES (#{name})
</insert>
</mapper>
dao的接口:
import java.io.Serializable;
public interface CompanyDao {
    /**
     * 这里传参使用Serializable 是为了同时兼容map和实体类的情况
     * @param serializable
     * @return
     */
    public int insertCompany_01(Serializable serializable);
}
实体类:
import java.io.Serializable;
public class Company01 implements Serializable{
    private Integer id;
    private String name;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
测试类:
public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"spring/spring-mybatis.xml"});
        CompanyDao companyDao = context.getBean(CompanyDao.class);
        //声明这里要用Hashmap,可序列化的
        HashMap<String,Object> map = new HashMap<String, Object>();
        map.put("name", "阿里巴巴");
        companyDao.insertCompany_01(map);
        System.out.println(map.get("id"));
        Company01 c01 = new Company01();
        c01.setName("腾讯");
        companyDao.insertCompany_01(c01);
        System.out.println(c01.getId());
    }
三、mybatis selectKey方式
这种方式大家用的最多,就不再过多描述了,具体的测试方法同上
<insert id="insertCompany_01">
INSERT INTO `company_01` (`name`) VALUES (#{name})
<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
SELECT LAST_INSERT_ID();
</selectKey>
</insert>
有必要提出一点的是,order有两个值,AFTER或BEFORE,获取自增id时须用AFTER,BEFORE是用来给map的key或者对象的id属性进行赋值的,用的不多。
最后说一点,我们作为程序员,研究问题还是要仔细深入一点的。当你对原理了解的有够透彻,开发起来也就得心应手了,很多开发中的问题和疑惑也就迎刃而解了,而且在面对其他问题的时候也可做到触类旁通。当然在开发中没有太多的时间让你去研究原理,开发中要以实现功能为前提,可等项目上线的后,你有大把的时间或者空余的时间,你大可去刨根问底,深入的去研究一项技术,为觉得这对一名程序员的成长是很重要的事情。
mysql数据库插入数据获取自增主键的三种方式(jdbc PreparedStatement方式、mybatis useGeneratedKeys方式、mybatis selectKey方式)的更多相关文章
- mysql数据库表的自增主键号不规律,重新排列
		
mysql数据库表的自增主键ID乱了,需要重新排序. 原理:删除原有的自增ID,重新建立新的自增ID. 1.删除原有主键: ALTER TABLE `table_name` DROP `id`; 2. ...
 - Mysql数据库表的自增主键ID号乱了,需要重新排列。
		
Mysql数据库表的自增主键ID号乱了,需要重新排列. 原理:删除原有的自增ID,重新建立新的自增ID. 1,删除原有主键:ALTER TABLE `table_name` DROP `id`; 2, ...
 - 关于mybatis用mysql时,插入返回自增主键的问题
		
公司决定新项目用mybatis,虽然这个以前学过但是一直没用过都忘得差不多了,而且项目比较紧,也没时间去系统点的学一学,只好很粗略的百度达到能用的程度就行了. 其中涉及到插入实体要求返回主键id的问题 ...
 - mysql数据库单表只有一个主键自增id字段,ibatis实现id自增
		
mysql数据库单表只有一个主键自增id字段,ibatis实现id自增 <insert id="autoid"> insert into user_id ...
 - MySQL 插入与自增主键值相等的字段 与 高并发下保证数据准确的实验
		
场景描述: 表t2 中 有 自增主键 id 和 字段v 当插入记录的时候 要求 v与id 的值相等(按理来说这样的字段是需要拆表的,但是业务场景是 只有某些行相等 ) 在网上搜的一种办法是 先获取 ...
 - MYSQL获取自增主键【4种方法】
		
通常我们在应用中对mysql执行了insert操作后,需要获取插入记录的自增主键.本文将介绍java环境下的4种方法获取insert后的记录主键auto_increment的值: 通过JDBC2.0提 ...
 - Mybatis批量插入返回自增主键(转)
		
我们都知道Mybatis在插入单条数据的时候有两种方式返回自增主键: 1.对于支持生成自增主键的数据库:useGenerateKeys和keyProperty. 2.不支持生成自增主键的数据库:< ...
 - MYSQL获取自增主键【4种方法】(转)
		
转自:http://blog.csdn.net/ultrani/article/details/9351573 作者已经写的非常好了,我不废话了,直接转载收藏: 通常我们在应用中对mysql执行了in ...
 - mysql数据库表操作-表的主键索引和普通索引
		
数据库索引就象书的目录一样,如果在字段上建立了索引,那么以索引列为查询条件时可以加快查询数据的速度.查询数据库,按主键查询是最快的,每个表只能有一个主键列,但是可以有多个普通索引列,主键列要求列的所有 ...
 
随机推荐
- Power Strings(KMP)
			
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 45008 Accepted: 18794 D ...
 - BOM对象
			
每一个frames都有自己的window对象,也就是每个frames都有自己的全局对象,它们之前是相互独立的,包括各自独立的本地对象,top.Object !== top.frames[0].Obje ...
 - JavaScript系列----函数(Function)篇(4)
			
1.什么是函数? 在W3C中函数的定义是这么说的:函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. 诚然,从这种抽象的定义中我们得不到什么有价值的东西.下面,举例来列举出函数的几种定义 ...
 - selenium元素定位
			
在网页自动化测试中,我们要让程序自动模拟我们的点击.输入.悬浮.拖动等操作,完成我们的测试用例组. 输入.点击.打开这样的动词,已经包含在了selenium的方法中,可以直接调用(当然你也可以自己写) ...
 - elasticsearch 基础语句
			
1. doucument id 的两种生成方式 自动生成document id自动生成的id,长度为20个字符,URL安全,base64编码,GUID,分布式系统并行生成时不可能会发生冲突 POST ...
 - js 切换全屏
			
公司有一个需求就是点击某一个按钮实现全屏切换功能,然后呢我就在网上扒了段代码.封装了一下.使用的小伙伴们可以看看哦! 切换全屏代码 <!DOCTYPE html> <html> ...
 - javascript正则多次调用test 结果交替出现
			
现在需要一个正则验证小数点后保留一到三位数,小数点前只能两位或一位整数的这么一个数. 正则如: var reg = /^\d{,}\.\d{,}$/g; 验证如下: 因为我们用1.23符合规则的数据去 ...
 - Python 标准库 urllib2 的使用细节(转)
			
http://www.cnblogs.com/yuxc/archive/2011/08/01/2123995.html http://blog.csdn.net/wklken/article/deta ...
 - python变量命名规则
			
在Python中使用变量时,需要遵守一些规则和指南.违反这些规则将引发错误,而指南旨在让你编写的代码更容易阅读和理解.请务必牢记下述有关变量的规则.  变量名只能包含字母.数字和下划线.变量名可以字 ...
 - Altera FIFO IP核时序说明
			
ALTERA在LPM(library of parameterized mudules)库中提供了参数可配置的单时钟FIFO(SCFIFO)和双时钟FIFO(DCFIFO).FIFO主要应用在需要数据 ...