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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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型,这里就不做展示了。