mybaits 的批量入库操作(据说是性能最优的)
2023-09-27 14:22:12 时间
一 操作案例
1.1 工程
1.2 代码
1.service层
@Autowired
private SqlSessionFactory sqlSessionFactory;
@Override
public int addUser(UserDomain ud) {
return userDao.addUser(ud);
}
public int batchAddUser(){
SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
UserDao ud= session.getMapper(UserDao .class);
long start=System.currentTimeMillis();
int count=10;
for(int k=0;k<count;k++){
UserDomain userDomain=new UserDomain();
userDomain.setUserId(k+1);
userDomain.setUserName("u"+k);
userDomain.setPwd("123");
userDomain.setTel("123456780");
ud.addUser(userDomain);
}
session.commit();
long end = System.currentTimeMillis();
//批量:[预编译SQL一次==> 设置参数(一万次)==>执行(一次)] 耗时4598
//非批量:(预编译SQL==>设置参数==>执行) 三个步骤执行一万次 耗时10200
System.out.println("执行时长:" + (end-start));
} finally {
session.close();
}
return 1;
}
2.dao层
@Mapper
public interface UserDao {
public int addUser(UserDomain ud);
public List<UserDomain> queryUserList();
}
3.mapper
<?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.bonc.iplant.distributed.energy.dao.UserDao" >
<sql id="BASE_TABLE">
tb_user
</sql>
<sql id="BASE_COLUMN">
userId,userName,pwd,tel
</sql>
<insert id="addUser" parameterType="com.bonc.iplant.distributed.energy.model.UserDomain">
INSERT INTO
<include refid="BASE_TABLE"/>
<trim prefix="(" suffix=")" suffixOverrides=",">
userName,pwd,
<if test="tel != null">
tel,
</if>
</trim>
<trim prefix="VALUES(" suffix=")" suffixOverrides=",">
#{userName, jdbcType=VARCHAR},#{pwd, jdbcType=VARCHAR},
<if test="tel != null">
#{tel, jdbcType=VARCHAR},
</if>
</trim>
</insert>
<select id="queryUserList" resultType="com.bonc.iplant.distributed.energy.model.UserDomain">
SELECT
<include refid="BASE_COLUMN"/>
FROM
<include refid="BASE_TABLE"/>
</select>
</mapper>
4.controller
@RequestMapping("/batch")
@ResponseBody
public String addUserBatch(){
System.out.println("进入controoler........");
int flag=userService.batchAddUser();
System.out.println("controller返回状态........"+flag);
return "添加成功!!!,返回状态:"+flag+"";
}
5.进行访问
console:
结论:将所有的参数缓存起来,最后一次性执行,只执行一次sql。 批量操作是在session.commit()以后才发送sql语句给数据库进行执行的;