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