Mybatis映射器之insert-update-delete
insert元素的配置
| 元素 | 说明 | 备注 | 
|---|---|---|
| id | 他和mapper的命名空间组合起来必须是唯一的,提供给mybatis调用 | 如果命名空间和id组合起来不唯一,mybatis将会抛异常 | 
| paramterType | 入参类型可以是类的全命名,也可以使类的别名(必须是在mybatis中定义好的) | 可以选择javabean,map等复杂类型传递参数给sql | 
| parameterMap | 废弃 | 废弃 | 
| flushCache | 在调用sql后,是否清空之前查询的本地缓存和二级缓存 | 取值为布尔类型,true/false | 
| timeout | 设置超时参数,等待超时将抛出异常,单位为秒 | 默认值是jdbc驱动或连接池设置的秒数 | 
| statementType | 选择一种statement,取值为STATEMENT,PREPARED,CallableStatement | 默认为PREPARED | 
| databaseId | 标识数据库厂商 | 提供多种数据库支持 | 
| keyProperty | 表示以哪一列作为属性的主键,不能和keyColumn同时使用 | 联合主键可以用逗号隔开 | 
| useGeneratedKeys | 这会令Myabatis使用JDBC的getGeneratedKeys方法来取出有数据库内部生成的主键,例如mysql和sqlserver的自增字段,oracle的序列。使用这个必须配合使用keyProperty或keyColumn。 | 取值为true/false,默认为false | 
| keyColumn | 指明第几列是主键,不能和keyProperty共同使用,只能接受整形参数 | 联合主键可以用逗号分割 | 
| lang | 自定义语言,可使用第三方语言,使用较少 | - | 
主键回填和自定义
现实中,数据表可能拥有自增字段,或者我们需要给一个字段插入特定值,而mybatis提供了实现的方法。
首先可以用keyProperty属性指定哪个是主键字段,同时使用useGeneratedKeys属性告诉mybatis这个主键是否使用数据库内置策略生成。
这里我们举两个例子,一个是使用mysql的自增功能,另一个是通过sql设置主键。
这个例子代码文件格式和Mybatis映射器之insert,完整代码参考这篇文章。
src/main/java/
--------------/MybatisInsertUpdateDeleteMain.java
--------------/com/gavinzh/mybatis/
----------------------------------/modal/MyInfo.java
----------------------------------/MyInfoMapperCopy.java
src/main/resources/
------------------/mybatis_insert_update_delete.xml
------------------/xxx/mybatis_mapper_insert_update_delete.xml
mapper配置文件mybatis_mapper_insert_update_delete.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="com.gavinzh.mybatis.MyInfoMapperCopy">
    <insert id="insertByAuto" parameterType="com.gavinzh.mybatis.modal.MyInfo" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO test.my_info(user_name,user_age) VALUES (#{userName},#{userAge})
    </insert>
    <insert id="insertBySql" parameterType="com.gavinzh.mybatis.modal.MyInfo" useGeneratedKeys="true" keyProperty="id">
        <selectKey keyProperty="id" resultType="int" order="BEFORE">
            SELECT if(max(id) is NULL ,1 ,max(id)+1) as newId FROM test.my_info
        </selectKey>
        INSERT INTO test.my_info(user_name,user_age) VALUES (#{userName},#{userAge})
    </insert>
</mapper>mapper接口MyInfoMapperCopy.java:
package com.gavinzh.mybatis;
import com.gavinzh.mybatis.modal.MyInfo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
 * @author gavin
 * @version V1.0
 */
public interface MyInfoMapperCopy {
    int insertByAuto(MyInfo myInfo);
    int insertBySql(MyInfo myInfo);
}
main方法MybatisInsertUpdateDeleteMain.java:
import com.alibaba.fastjson.JSON;
import com.gavinzh.mybatis.MyInfoMapperCopy;
import com.gavinzh.mybatis.modal.MyInfo;
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.IOException;
import java.io.InputStream;
/**
 * @author gavin
 * @version V1.0
 */
public class MybatisInsertUpdateDeleteMain {
    public static void main(String[] args) throws IOException {
        //配置
        String resource = "mybatis_insert_update_delete.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // mapper获取
        MyInfoMapperCopy myInfoMapperCopy = sqlSession.getMapper(MyInfoMapperCopy.class);
        //入参
        MyInfo myInfo = new MyInfo();
        // 自增主键
        myInfo.setUserName("test1");
        myInfo.setUserAge("11");
        myInfoMapperCopy.insertByAuto(myInfo);
        System.out.println(JSON.toJSONString(myInfo));
        // 通过sql获得指定主键
        myInfo.setUserName("test2");
        myInfo.setUserAge("22");
        myInfoMapperCopy.insertBySql(myInfo);
        System.out.println(JSON.toJSONString(myInfo));
    }
}
update和delete
这两者和insert差不多,返回的都是影响的行数int型,这里就不做展示了。