一、简单的 insert 方法

1.UserMapper.xml

            insert into sys_user(user_name,user_password,user_email,user_info,head_img,create_time)        values ( #{userName} , #{userPassword} , #{userEmail},        #{userInfo} , #{headImg, jdbcType=BLOB },        #{createTime, jdbcType= TIMESTAMP})    

1.指定特殊数据类型

(1)为了防止类型错误,对于 些特殊的数据类型,建议指定具体的 jdbcTypeheadimg 指定 BLOB 类型, createTime 指定 TIME STAMP 类型(2)BLOB 对应的类型是 ByteArrayinputStream ,就是二进制数据流由于数据库区分 date、time、datetime 类型,但是 Java 中一般都使用 jave.util.Date类型 因此为了保证数据类型的正确,需要手动指定日期类型, date、time datetime应的 JDBC 类型分别为 DATE、TIME、TIMESTAMP

2.<insert >元素,这个标签包含如下属性

id :命名空间中的唯 标识符,可用来代表这条语句parameterType :即将传入的语句参数的完全限定类名或别名 这个属性是可选的,因为 MyBatis 可以推断出传入语句的具体参数,因此不建议配置该属性flushCache :默认值为 true ,任何时候只要语句被调用,都会清空一级缓存和二级缓存timeout :设置在抛出异常之前,驱动程序等待数据库返回请求结果的秒数statementType :对于 STATEMENT PREPARED ALLABLE, MyBatis 会分别使用对应的 Statement PreparedStatement Callable tatement ,默认 值为PREPAREDuseGeneratedKeys :默认值为false ,如果设置为true, MyBatis 使用 JDBC getGeneratedKeys 方法来取出由数据库内部生成的主键keyProperty: MyBatis 通过 getGeneratedKeys 获取 键值后将要赋值的属性名如果希望得到多个数据库自动生成的列,属性值也可以是以逗号分隔的属性名称列keyColumn :仅对时INSERT和 UPDATE 有用 通过生成的键值设置 中的列名, 这个设置仅在某些数据库(如 PostgreSQL )中是必须的, 当主键列不是 中的第 列时要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表database Id :如果配置了 databaseidProvider会加载所有的不带 databaseId 的或匹配当前 databaseId 的语句 如果同时存在带databaseId 和不带 databaseid 的语句,后者会被忽略.

2.UserMapperTest

  @Test    public void testinsert() {        SqlSession sqlSession = getSqlSession();        try {            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);            SysUser user = new SysUser();            user.setUserName("test1");            user.setUserPassword("123456");            user.setUserEmail("test@mybatis.tk");            user.setUserInfo("test_info");            user.setHeadImg(new byte[]{1, 2, 3});            user.setCreateTime(new Date());            //只插入一条数据            int result=userMapper.insert(user);            Assert.assertEquals(1, result);            //id null ,没有给 id 赋佳,并且没有配置回写 id 的值            Assert.assertNotNull(user.getId());            System.out.println(user.getId());        } finally {            sqlSession.rollback();//          sqlSession.commit();            sqlSession.close();        }    }

1.只插入一条数据

Assert.assertEquals(1, result);

2.回滚(不写入数据库)

            sqlSession.rollback();//修改数据库 sqlSession.commit();

3.插入后判断是否为空(为空/不为空,抛异常)

Assert.assertNotNull(user.getId());Assert.assertNull(user.getId());

3.UserMapper

int insert(SysUser user);

二、返回主键自增的值

方法一:使用 JDBC 方式返回主键自增的值

useGeneratedKeys 设置为 true 后, MyBatis 会使用 JDBC getGeneratedKeys方 法来取出 由数据库内部生成的主键。获得主键值后将其赋值给 keyProperty 配置的 id 属性。 当需要设置多个属性时,使用逗号隔开,这种情况下通常还需要设置 keyCo lumn 属性 按顺 序指定数据库的列,这里列的值会和 keyProperty 配置的属性一一对应。由于要使用数据库 返回的主键值,所以 上下两部分的列中去掉了 id 列和对应的#{ id }属性。

方法二:使用 selectKey 返回主键的值

            SELECT LAST_INSERT_ID()        
1.selectKey 标签 keyColumn keyProperty 和上面 useGeneratedKeys 的用法含义相同 ,这 resultType 用于设置返回值类型 ,order 属性的设置和使用的数据库有关 MySQL 数据库中, order 属性设置的值是 AFTER,因为当前记录的主键值在 insert 语句 ,执行成功后才能获取 而在 Oracle 数据库中, order 的值要设置为 BEFORE ,这是因为 Oracl 中需要先从序列获取值,然后将值作为主键插入到数据库中.2.可以发现, selectKey 元素放置的位置和之前 MySQL 例子中的不同,其实这个元素放置的位置不会影响 selectKey 中的方法在 insert 前面或者后面执行的顺序,影响执行顺序 order 属性,这么写仅仅是为了符合实际的执行顺序,看起来更直观而已selectKey 元素中的内容。它内容就是一个独立的 SQL 语句,在 Oracle 示例中, SELECT SEQ_ ID.nextval from dual是一个获取序列的 SQL 语句。 MySQL 中的 SQL 语句 SELECT LAST_ INSERT_ ID ()用于获取数据库中最后插入的数据的 ID 以下是其他 些支持主键自增的数据库配置 electKey中回写主键的 SQL··DB2 使用 VALUES IDENTITY_VAL_LOCAL ()• MYSQL 使用 SELECT LAST_INSERT_ID ()• SQLSERVER 使用 SELECT SCOPE_IDENTITY ()。• CLOUDSCAPE 使用 VALUES IDENTITY_VAL_LOCAL ()• DERBY 使用 VALUES IDENTITY_VAL_LOCAL ()• HSQLDB 使用 CALL IDENTITY()SYBASE 使用 SELECT @@IDENTITY• DB2 MF 使用 SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMYl• FORMIX 使用 select dbinfo ('sqlea.sqlerrdl') from systables wheretabid=l