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型,这里就不做展示了。

标签: java, Mybatis

添加新评论