MyBatis操作mysql配置和获取插入记录的自增主键

来源:互联网 发布:sai中文版官方下载mac 编辑:程序博客网 时间:2024/05/19 08:26

转载自:http://my.oschina.net/kolbe/blog/512904

我们知道MySql中主键可以设成auto_increment,也就是自增主键,每当新增一条记录,主键值自动加1。

在MyBatis中,执行insert,返回值为受影响的语句行数,此操作跟JDBC一致。

但是如果应用中需要将插入的值的主键返回时,这时有两种方式:

第一种方式:在mapper的insert节点中添加useGeneratedKey和keyProperty属性

第二种方式:在mapper的insert节点下添加selectKey子节点的方式

下面是具体的使用方式举例:


一、MySql中mybatis数据库的users表结构 

[sql] view plain copy
  1. +----------+--------------+------+-----+---------+----------------+  
  2. | Field    | Type         | Null | Key | Default | Extra          |  
  3. +----------+--------------+------+-----+---------+----------------+  
  4. | id       | int(11)      | NO   | PRI | NULL    | auto_increment |  
  5. name     | varchar(50)  | YES  |     | NULL    |                |  
  6. password | varchar(255) | YES  |     | NULL    |                |  
  7. +----------+--------------+------+-----+---------+----------------+  

二、MyBatis配置文件 mybatis-config.xml

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  3.   
  4. <configuration>  
  5.       
  6.     <!-- 在properties节点下定义的属性可以在全局中进行引用,具体引用的方式是 ${属性名} -->  
  7.     <properties>  
  8.         <property name="driver" value="com.mysql.jdbc.Driver"/>  
  9.         <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>  
  10.         <property name="username" value="root"/>  
  11.         <property name="password" value="zzlibdmt"/>  
  12.     </properties>  
  13.       
  14.       
  15.       
  16.       
  17.     <!-- 为domain设置别名,注意:只能为javaBean设置别名,而不是mapper文件中的id -->  
  18.     <typeAliases>  
  19.         <package name="cn.kolbe.mybatis.domain"/>  
  20.     </typeAliases>  
  21.   
  22.   
  23.     <!-- environments下可以有多个environment节点,表示不同的开发环境,只要有一个与default匹配即可 -->  
  24.     <!-- 具体在开发中,可以在开发时使用development配置,上线时使用production配置等等 -->  
  25.     <environments default="development">  
  26.         <environment id="development">  
  27.             <!-- JDBC表示直接使用底层JDBC的事务管理 -->  
  28.             <transactionManager type="JDBC"></transactionManager>  
  29.               
  30.             <!-- 配置POOLED将使用MyBatis的自带的数据库连接池 -->  
  31.             <!-- 具体属性名字可以查看该类的setter方法 -->  
  32.             <!-- org.apache.ibatis.datasource.pooled.PooledDataSource -->  
  33.             <dataSource type="POOLED">  
  34.                 <property name="driver" value="${driver}"/>  
  35.                 <property name="url" value="${url}"/>  
  36.                 <property name="username" value="${username}"/>  
  37.                 <property name="password" value="${password}"/>  
  38.             </dataSource>  
  39.         </environment>  
  40.     </environments>  
  41.   
  42.     <mappers>  
  43.         <mapper resource="cn/kolbe/mybatis/domain/UserMapper.xml"/>  
  44.     </mappers>  
  45. </configuration>  

三、MyBatis的mapper映射文件 UserMapper.xml

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/mybatis-3-mapper.dtd">  
  3. <mapper namespace="cn.kolbe.mybatis.domain.UserMapper">  
  4.       
  5.     <insert id="getGeneratedKey1" parameterType="cn.kolbe.mybatis.domain.User">  
  6.         insert into users(name, password) values(#{name}, #{password})    
  7.     </insert>  
  8.       
  9.     <!-- useGeneratedKeys默认值为false,keyProperty的值对应的是User类中的主键名 -->  
  10.     <insert id="getGeneratedKey2" parameterType="cn.kolbe.mybatis.domain.User" useGeneratedKeys="true" keyProperty="id">  
  11.         insert into users(name, password) values(#{name}, #{password})    
  12.     </insert>  
  13.   
  14.     <insert id="getGeneratedKey3" parameterType="cn.kolbe.mybatis.domain.User">  
  15.         <!-- 使用这种方式要注意,resultType是要设置的,否则将抛异常,该值对应的User类中的主键类型 -->  
  16.         <!-- keyProperty对应的是User类中的主键名,假设取名为user_id,则这边也要改成user_id -->  
  17.         <selectKey keyProperty="id" resultType="int">  
  18.             select LAST_INSERT_ID()  
  19.         </selectKey>  
  20.         insert into users(name, password) values(#{name}, #{password})    
  21.     </insert>  
  22.   
  23. </mapper>  

四、普通的Java实体类User

[java] view plain copy
  1. package cn.kolbe.mybatis.domain;  
  2.   
  3. public class User {  
  4.   
  5.     private Integer id;  
  6.     private String name;  
  7.     private String password;  
  8.       
  9.     public User(String name, String password) {  
  10.         this.name = name;  
  11.         this.password = password;  
  12.     }  
  13.       
  14.     public Integer getId() {  
  15.         return id;  
  16.     }  
  17.     public void setId(Integer id) {  
  18.         this.id = id;  
  19.     }  
  20.     public String getName() {  
  21.         return name;  
  22.     }  
  23.     public void setName(String name) {  
  24.         this.name = name;  
  25.     }  
  26.     public String getPassword() {  
  27.         return password;  
  28.     }  
  29.     public void setPassword(String password) {  
  30.         this.password = password;  
  31.     }  
  32.     @Override  
  33.     public String toString() {  
  34.         return "User [id=" + id + ", name=" + name + ", password=" + password + "]";  
  35.     }  
  36.       
  37. }  


五、测试代码

[java] view plain copy
  1. package cn.kolbe.mybatis;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.InputStream;  
  6.   
  7. import org.apache.ibatis.session.SqlSession;  
  8. import org.apache.ibatis.session.SqlSessionFactory;  
  9. import org.apache.ibatis.session.SqlSessionFactoryBuilder;  
  10. import org.junit.Before;  
  11. import org.junit.Test;  
  12.   
  13. import cn.kolbe.mybatis.domain.User;  
  14.   
  15. public class MyBatisTest {  
  16.       
  17.     /** 
  18.      * 普通的插入操作 
  19.      *  
  20.      * @throws FileNotFoundException 
  21.      */  
  22.     @Test  
  23.     public void testGetGeneratedKey1() throws FileNotFoundException {  
  24.         SqlSession session = factory.openSession();  
  25.         String statement = "cn.kolbe.mybatis.domain.UserMapper.getGeneratedKey1";  
  26.         User user = new User("User_01","123456");  
  27.         int result = session.update(statement, user);       // result为受影响的行数  
  28.         session.commit();  
  29.         System.out.println(user);               // 输出 User [id=null, name=User_02, password=123456]  
  30.         System.out.println("result:" + result);                 // 输入 result: 1  
  31.           
  32.     }  
  33.       
  34.     /** 
  35.      * 在insert中添加了 useGeneratedKeys="true" keyProperty="id" 属性的插入操作 
  36.      *  
  37.      * @throws FileNotFoundException 
  38.      */  
  39.     @Test  
  40.     public void testGetGeneratedKey2() throws FileNotFoundException {  
  41.         SqlSession session = factory.openSession();  
  42.         String statement = "cn.kolbe.mybatis.domain.UserMapper.getGeneratedKey2";  
  43.         User user = new User("User_02","123456");  
  44.           
  45.         // 此时MyBatis不仅返回了受影响的行数,还将自增的id赋值给了传进去的user  
  46.         // 这时可以看到user打印出来的id是有值的!!!  
  47.         int result = session.update(statement, user);       // 受影响的行数  
  48.         session.commit();  
  49.         System.out.println(user);                               // 输出 User [id=2, name=User_02, password=123456]  
  50.         System.out.println("result:" + result);                 // 输出 result: 1  
  51.     }  
  52.       
  53.     /** 
  54.      * 在insert中添加子节点<selectKey>子节点的插入操作 
  55.      * <selectKey order="AFTER" keyProperty="id"> 
  56.      *      select select last_insert_id() 
  57.      * </selectKey> 
  58.      *  
  59.      * @throws FileNotFoundException 
  60.      */  
  61.     @Test  
  62.     public void testGetGeneratedKey3() throws FileNotFoundException {  
  63.         SqlSession session = factory.openSession();  
  64.         String statement = "cn.kolbe.mybatis.domain.UserMapper.getGeneratedKey3";  
  65.         User user = new User("User_03""123456");  
  66.           
  67.         // 此时MyBatis不仅返回了受影响的行数,还将自增的id赋值给了传进去的user  
  68.         // 这时可以看到user打印出来的id是有值的!!!  
  69.         int result = session.update(statement, user);       // 受影响的行数  
  70.         session.commit();  
  71.         System.out.println(user);                               // 输出 User [id=3, name=User_03, password=123456]  
  72.         System.out.println("result:" + result);                 // 输出 result: 1  
  73.     }  
  74.       
  75.     /** 
  76.      * 初始化SessionFactory 
  77.      * @throws Exception 
  78.      */  
  79.     @Before  
  80.     public void init() throws Exception {  
  81.         InputStream in = new FileInputStream("src/main/java/mybatis-config.xml");  
  82.         factory = new SqlSessionFactoryBuilder().build(in);  
  83.     }  
  84.       
  85.     private SqlSessionFactory factory;  
  86. }  

注:

1)使用selectKey的方式获取主键,相当于调用了MySql的LAST_INSERT_ID()函数,意思是查询最后一次插入的ID,相当于执行了两条语句

2)两种方式的主键获取方式都是通过MyBatis为我们自动将id值赋值给传入的javaBean,而不是通过update语句返回,也就是update返回的同jdbc一致(影响的行数),获取id的方式是执行完update后调用user.getId()方法,具体可参看上面的例子。


原创粉丝点击