zl程序教程

您现在的位置是:首页 >  其他

当前栏目

mybaits 的批量入库操作(据说是性能最优的)

批量性能 操作 最优 入库 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语句给数据库进行执行的;