浅入浅出MyBatis(05):插入数据

January 14th 2015  | Tags: MyBatis, orm

2015-01-14

该文章是《专题:浅入浅出MyBatis》系列文章的一篇。点击进入该专题目录

工具与环境:Intellij IDEA 14,JDK 1.7,MyBatis 3.2,MySQL 5.5。

浅入浅出MyBatis(01):查询id为1的用户的信息的基础上,我们看一下该如何实现。

代码

修改letian.mybatis.dao下的UserMapper.java

将其内容修改为:

package letian.mybatis.dao;

import letian.mybatis.bean.User;

public interface UserMapper {

    User findById(int id);
    void insertUser1(User user);
    void insertUser2(User user);

}

新增加了两个增加用户的方法。

修改letian.mybatis.mapper下的UserMapper.xml

<?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="letian.mybatis.dao.UserMapper">

    <select id="findById" parameterType="Integer" resultType="letian.mybatis.bean.User">
        select *
        from blog_db.user where id=#{id}
    </select>

    <insert id="insertUser1" parameterType="letian.mybatis.bean.User" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO `blog_db`.`user` ( `name`, `email`, `password`)
        VALUES (#{name}, #{email}, #{password})
    </insert>

    <parameterMap id="insertUser2ParamsMap" type="letian.mybatis.bean.User">
        <parameter property="name"/>
        <parameter property="email" />
        <parameter property="password" />
    </parameterMap>

    <insert id="insertUser2" parameterType="letian.mybatis.bean.User" parameterMap="insertUser2ParamsMap" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO `blog_db`.`user` ( `name`, `email`, `password`)
        VALUES (?, ?, ?)
    </insert>

</mapper>

<insert id="insertUser1">对应UserMapper接口中的void insertUser1(User user);方法。parameterType和方法insertUser1的参数类型一致。我们的SQL语句,只插入了User的name、email、password,主键id依靠数据库的自动生成。在官方文档Mapper XML 文件中如下介绍useGeneratedKeys和keyProperty属性:

useGeneratedKeys:(仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。

keyProperty: (仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。

通过设置useGeneratedKeys和keyProperty属性,可以将生成的id注入到被保存的user对象中。

<insert id="insertUser2">使用了占位符?,所以要设置一下输入参数映射。<insert id="insertUser2">通过parameterMap属性引用了<parameterMap id="insertUser2ParamsMap">对应的参数映射配置。

修改Main.java

将其内容修改为:

import java.io.IOException;

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 letian.mybatis.bean.User;
import letian.mybatis.dao.UserMapper;


public class Main {

    public static void main(String[] args) throws IOException {

        SqlSessionFactory sessionFactory;
        sessionFactory = new SqlSessionFactoryBuilder()
                .build(Resources.getResourceAsReader("mybatis-config.xml"));

        SqlSession sqlSession = sessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        User user1 = new User();
        user1.setName("xiaowei");
        user1.setEmail("xiaowei@111.com");
        user1.setPassword("456");

        userMapper.insertUser1(user1);
        sqlSession.commit();  // 一定要有的。
        System.out.println(user1);

    }
}

运行结果是:

User{id=6, name='xiaowei', email='xiaowei@111.com', password='456'}

在数据库中也能看到这条记录。(请不要在意id的不连贯,这是我多次调试代码造成的。)

如果再执行一次Main.java,由于user表的name字段是unique的,所以会报错:

Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'xiaowei' for key 'name_unique'
### The error may involve letian.mybatis.dao.UserMapper.insertUser1-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO `blog_db`.`user` ( `name`, `email`, `password`)         VALUES (?, ?, ?)
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'xiaowei' for key 'name_unique'

下面尝试使用insertUser2方法插入数据,修改Main.java:

import java.io.IOException;

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 letian.mybatis.bean.User;
import letian.mybatis.dao.UserMapper;


public class Main {

    public static void main(String[] args) throws IOException {

        SqlSessionFactory sessionFactory;
        sessionFactory = new SqlSessionFactoryBuilder()
                .build(Resources.getResourceAsReader("mybatis-config.xml"));

        SqlSession sqlSession = sessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        User user2 = new User();
        user2.setName("xiaohu");
        user2.setEmail("xiaohu@111.com");
        user2.setPassword("456");

        userMapper.insertUser2(user2);
        sqlSession.commit();
        System.out.println(user2);

    }
}

执行结果如下:

User{id=9, name='xiaohu', email='xiaohu@111.com', password='456'}

(完)