本章节将介绍怎样使用 <insert> 插入一条数据到数据库,然后返回生成的数据主键 ID。
如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),那么你可以在 <insert> 标签中设置 useGeneratedKeys="true",然后再把 keyProperty 设置为目标属性就 OK 了。例如:
<insert id="save" useGeneratedKeys="true" keyProperty="userId">
INSERT INTO `user`(
`name`, `sex`, `age`
) VALUES (
#{name,jdbcType=VARCHAR},
#{sex,jdbcType=INTEGER},
#{age,jdbcType=VARCHAR}
)
</insert>上面实例中,useGeneratedKeys="true" 将会告诉 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据(比如:像 MySQL和 SQL Server 这样的数据库管理系统的自动递增字段)内部生成的主键;而 keyProperty="userId" 表示将使用 JavaBean 中的 userId 属性来存放数据库内部生成的主键;更多 insert 属性请阅读“insert 标签介绍”
上面介绍怎样对支持自动生成主键的数据库插入数据,且返回数据库生成的ID。下面将介绍对那些不支持自动生成主键的数据库,如:Oracle。实例:
<insert id="insert06" useGeneratedKeys="false">
<!-- 生成自定义的主键,这里使用当前时间毫秒数和0到 99999999的随机数 -->
<selectKey keyProperty="userId" resultType="int" order="BEFORE">
SELECT (UNIX_TIMESTAMP(NOW()) + FLOOR(RAND()*99999999)) FROM DUAL
</selectKey>
INSERT INTO `user`(
`user_id`, `name`, `sex`, `age`
) VALUES (
#{userId, jdbcType=INTEGER},
#{name, jdbcType=VARCHAR},
#{sex, jdbcType=VARCHAR},
#{age, jdbcType=INTEGER}
)
</insert>上面实例使用 <selectKey> 标签实现自动生成主键。其中:
order 属性表示该语句是在插入语句之前还是之后执行(BEFORE - 之前;AFTER - 之后)
resultType 定义结果集类型
keyProperty 主键属性名称
(1)MyBatis 配置文件 mybatis-cfg.xml 内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="database.properties"/>
<environments default="MySqlDatabase" >
<environment id="MySqlDatabase" >
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/hxstrive/mybatis/insert/demo3/UserMapper.xml" />
</mappers>
</configuration>(2)Mapper 接口定义如下:
package com.hxstrive.mybatis.insert.demo3;
public interface UserMapper {
int save(UserBean userBean);
}(3)Mapper XML 文件定义如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hxstrive.mybatis.insert.demo3.UserMapper">
<insert id="save" useGeneratedKeys="true" keyProperty="userId">
INSERT INTO `user`(
`name`, `sex`, `age`
) VALUES (
#{name,jdbcType=VARCHAR},
#{sex,jdbcType=INTEGER},
#{age,jdbcType=VARCHAR}
)
</insert>
</mapper>(4)JavaBean 代码如下:
package com.hxstrive.mybatis.insert.demo3;
public class UserBean {
private Integer userId;
private String name;
private String sex;
private Integer age;
// 忽略 getter 和 setter
@Override
public String toString() {
return "UserBean{" +
"userId=" + userId +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}(5)客户端代码:
package com.hxstrive.mybatis.insert.demo3;
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 java.io.InputStream;
public class InsertDemo3 {
public static void main(String[] args) throws Exception {
String cfgName = "com/hxstrive/mybatis/insert/demo3/mybatis-cfg.xml";
InputStream input = Resources.getResourceAsStream(cfgName);
SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlFactory = factoryBuilder.build(input);
SqlSession sqlSession = sqlFactory.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
UserBean user = new UserBean();
user.setName("Name-" + System.currentTimeMillis());
user.setSex("female");
user.setAge(25);
int result = userMapper.save(user);
System.out.println("result=" + result);
System.out.println("user id is " + user.getUserId());
}
}