当前位置: 首页 > news >正文

选择锦州网站建设每日国际新闻最新消息

选择锦州网站建设,每日国际新闻最新消息,北大企业管理培训课程,视频网站做视频容易火MyBatis-plus的批量插入方式对比分析 【摘要】Mybatis批量插入一直是开发者重点关注的问题&#xff0c;本文列举了Mybatis的五种插入方式进行对比分析&#xff0c;验证了五种批量插入的方式的优先级。 1 准备工作 1.1 新建spring项目 略。 1.2 导入pom.xml依赖 <depende…

MyBatis-plus的批量插入方式对比分析

  【摘要】Mybatis批量插入一直是开发者重点关注的问题,本文列举了Mybatis的五种插入方式进行对比分析,验证了五种批量插入的方式的优先级。

1 准备工作

1.1 新建spring项目

  略。

1.2 导入pom.xml依赖

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency><!--Mybatis依赖-->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version>
</dependency><!--Mybatis-Plus依赖-->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>

1.3 配置yml文件

server:port: 8080spring:datasource:username: mysql用户名password: mysql密码url: jdbc:mysql://localhost:3306/数据库名字?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTCdriver-class-name: com.mysql.cj.jdbc.Drivermybatis:mapper-locations: classpath:mapping/*.xml

1.4 创建插入模型

@Data
public class User {private int id;private String username;private String password;
}

2 测试

2.1 Mybatis利用For循环批量插入

1、编写UserService服务类,测试一万条数据的耗时情况:

@Service
public class UserService {@Resourceprivate UserMapper userMapper;public void InsertUsers(){long start = System.currentTimeMillis();for(int i = 0 ;i < 10000; i++) {User user = new User();user.setUsername("name" + i);user.setPassword("password" + i);userMapper.insertUsers(user);}long end = System.currentTimeMillis();System.out.println("一万条数据总耗时:" + (end-start) + "ms" );}}

2、编写UserMapper接口

@Mapper
public interface UserMapper {Integer insertUsers(User user);
}

3、编写UserMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ithuang.demo.mapper.UserMapper"><insert id="insertUsers">INSERT INTO user (username, password)VALUES(#{username}, #{password})</insert>
</mapper>

4、进行单元测试

@SpringBootTest
class DemoApplicationTests {@Resourceprivate UserService userService;@Testpublic void insert(){userService.InsertUsers();}
}

5、输出结果
  一万条数据耗时26348ms

2.2 MyBatis的手动批量提交

1、其他保持不变,Service层作稍微的变化

@Service
public class UserService {@Resourceprivate UserMapper userMapper;@Resourceprivate SqlSessionTemplate sqlSessionTemplate;public void InsertUsers(){//关闭自动提交SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);UserMapper userMapper = sqlSession.getMapper(UserMapper.class);long start = System.currentTimeMillis();for(int i = 0 ;i < 10000; i++) {User user = new User();user.setUsername("name" + i);user.setPassword("password" + i);userMapper.insertUsers(user);}sqlSession.commit();long end = System.currentTimeMillis();System.out.println("一万条数据总耗时:" + (end-start) + "ms" );}
}

2、结果输出
  一万条数据总耗时:24516ms。

2.3 Mybatis以集合方式批量新增

1、编写UserService服务类

@Service
public class UserService {@Resourceprivate UserMapper userMapper;public void InsertUsers(){long start = System.currentTimeMillis();List<User> userList = new ArrayList<>();User user;for(int i = 0 ;i < 10000; i++) {user = new User();user.setUsername("name" + i);user.setPassword("password" + i);userList.add(user);}userMapper.insertUsers(userList);long end = System.currentTimeMillis();System.out.println("一万条数据总耗时:" + (end-start) + "ms" );}
}

2、编写UserMapper接口

@Mapper
public interface UserMapper {Integer insertUsers(List<User> userList);
}

3、编写UserMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ithuang.demo.mapper.UserMapper"><insert id="insertUsers">INSERT INTO user (username, password)VALUES<foreach collection ="userList" item="user" separator =",">(#{user.username}, #{user.password})</foreach></insert>
</mapper>

4、输出结果
  一万条数据总耗时:521ms

2.4 MyBatis-Plus提供的SaveBatch方法

1、编写UserService服务

@Service
public class UserService extends ServiceImpl<UserMapper, User> implements IService<User> {public void InsertUsers(){long start = System.currentTimeMillis();List<User> userList = new ArrayList<>();User user;for(int i = 0 ;i < 10000; i++) {user = new User();user.setUsername("name" + i);user.setPassword("password" + i);userList.add(user);}saveBatch(userList);long end = System.currentTimeMillis();System.out.println("一万条数据总耗时:" + (end-start) + "ms" );}
}

2、编写UserMapper接口

@Mapper
public interface UserMapper extends BaseMapper<User> {}

3、单元测试结果

  一万条数据总耗时:24674ms

2.5 MyBatis-Plus提供的InsertBatchSomeColumn方法

1、编写EasySqlInjector 自定义类

public class EasySqlInjector extends DefaultSqlInjector {@Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {// 注意:此SQL注入器继承了DefaultSqlInjector(默认注入器),调用了DefaultSqlInjector的getMethodList方法,保留了mybatis-plus的自带方法List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));return methodList;}}

2、定义核心配置类注入此Bean

@Configuration
public class MybatisPlusConfig {

@Bean
public EasySqlInjector sqlInjector() {return new EasySqlInjector();
}

}
3、编写UserService服务类

public class UserService{@Resourceprivate UserMapper userMapper;public void InsertUsers(){long start = System.currentTimeMillis();List<User> userList = new ArrayList<>();User user;for(int i = 0 ;i < 10000; i++) {user = new User();user.setUsername("name" + i);user.setPassword("password" + i);userList.add(user);}userMapper.insertBatchSomeColumn(userList);long end = System.currentTimeMillis();System.out.println("一万条数据总耗时:" + (end-start) + "ms" );}
}

4、编写EasyBaseMapper接口

public interface EasyBaseMapper<T> extends BaseMapper<T> {/*** 批量插入 仅适用于mysql** @param entityList 实体列表* @return 影响行数*/Integer insertBatchSomeColumn(Collection<T> entityList);
}

5、编写UserMapper接口

@Mapper
public interface UserMapper<T> extends EasyBaseMapper<User> {}

6、单元测试结果

  一万条数据总耗时:575ms

2.6 JDBC原生的批量插入

1、编写JDBC池化工具类

public class JDBCDruidUtils {private static DataSource dataSource;private static Connection conn;/*创建数据Properties集合对象加载加载配置文件*/static {Properties pro = new Properties();//加载数据库连接池对象try {//获取数据库连接池对象pro.load(JDBCDruidUtils.class.getClassLoader().getResourceAsStream("druid.properties"));dataSource = DruidDataSourceFactory.createDataSource(pro);} catch (Exception e) {e.printStackTrace();}}/*获取连接*/public static Connection getConnection() throws SQLException {return dataSource.getConnection();}/*** 关闭conn,和 statement独对象资源** @param connection* @param statement* @MethodName: close* @return: void*/public static void close(Connection connection, Statement statement) {if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}if (statement != null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 关闭 conn , statement 和resultset三个对象资源** @param connection* @param statement* @param resultSet* @MethodName: close* @return: void*/public static void close(Connection connection, Statement statement, ResultSet resultSet) {close(connection, statement);if (resultSet != null) {try {resultSet.close();} catch (SQLException e) {             e.printStackTrace();}}}/*获取连接池对象*/public static DataSource getDataSource() {return dataSource;}
}
# druid.properties配置
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/数据库?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username=用户名
password=密码
initialSize=10
maxActive=50
maxWait=60000

2、编写UserService服务类

public void InsertUsersByJdbc() {long start = System.currentTimeMillis();Connection connection = null;PreparedStatement ps = null;try {connection = JDBCDruidUtils.getConnection();//控制事务:默认不提交connection.setAutoCommit(false);String sql = "INSERT INTO user (username, password) VALUES (?, ?)";ps = connection.prepareStatement(sql);User user;for (int i = 0; i < 1000000; i++) {user = new User();user.setUsername("name" + i);user.setPassword("password" + i);ps.setString(1, user.getUsername());ps.setString(2, user.getPassword());//将一组参数添加到此 PreparedStatement 对象的批处理命令中。ps.addBatch();}//执行批处理ps.executeBatch();//手动提交事务connection.commit();} catch (SQLException e) {throw new RuntimeException(e);} finally {JDBCDruidUtils.close(connection, ps);}long end = System.currentTimeMillis();System.out.println("一万条数据总耗时:" + (end - start) + "ms");}

3、输出结果
  1万数据总耗时19000ms。

3 总结

  大量数据的场景下性能对比:InsertBatchSomeColumn>自定义xml以集合的方式>Jdbc原生>SaveBatch>手动for循环批量>自动for循环批量。
  网上很多人都说JDBC原生性能很好,但是我发现其非常差,有可能是我使用的是mybatis-plus依赖,如果这是推论正确,那就可以证明mybatis-plus在mybatis的基础上不仅增强了功能也增强了性能。所以可以得出结论:开发中用mybatis-plus是没有错的,如果想提高性能,只能实施其他方案,比如分库分表,千万别想着JDBC原生性能更好。


文章转载自:
http://immalleable.mdwb.cn
http://epaxial.mdwb.cn
http://supersensuous.mdwb.cn
http://eosinophil.mdwb.cn
http://analogously.mdwb.cn
http://ultimata.mdwb.cn
http://repel.mdwb.cn
http://cervelat.mdwb.cn
http://claudian.mdwb.cn
http://subscriber.mdwb.cn
http://livestock.mdwb.cn
http://headache.mdwb.cn
http://dobe.mdwb.cn
http://feldsher.mdwb.cn
http://grundyism.mdwb.cn
http://churn.mdwb.cn
http://albedometer.mdwb.cn
http://prove.mdwb.cn
http://liquescent.mdwb.cn
http://goalkeeper.mdwb.cn
http://outpoint.mdwb.cn
http://manacle.mdwb.cn
http://phonebooth.mdwb.cn
http://valediction.mdwb.cn
http://musmon.mdwb.cn
http://miler.mdwb.cn
http://abraham.mdwb.cn
http://upthrust.mdwb.cn
http://decahedron.mdwb.cn
http://thwartwise.mdwb.cn
http://abernethy.mdwb.cn
http://tbsp.mdwb.cn
http://shiny.mdwb.cn
http://neutronics.mdwb.cn
http://uncio.mdwb.cn
http://fenfluramine.mdwb.cn
http://fragmented.mdwb.cn
http://ostrogoth.mdwb.cn
http://olid.mdwb.cn
http://scapula.mdwb.cn
http://multan.mdwb.cn
http://newmarket.mdwb.cn
http://clarendon.mdwb.cn
http://polydomous.mdwb.cn
http://kerning.mdwb.cn
http://restricted.mdwb.cn
http://dreadnaught.mdwb.cn
http://timberline.mdwb.cn
http://unperishing.mdwb.cn
http://godling.mdwb.cn
http://supersensuous.mdwb.cn
http://toxiphobia.mdwb.cn
http://silbador.mdwb.cn
http://homiletics.mdwb.cn
http://humbling.mdwb.cn
http://piercer.mdwb.cn
http://bac.mdwb.cn
http://rheinland.mdwb.cn
http://lordliness.mdwb.cn
http://chastiser.mdwb.cn
http://milktoast.mdwb.cn
http://sophomoric.mdwb.cn
http://hyte.mdwb.cn
http://reparations.mdwb.cn
http://astern.mdwb.cn
http://riven.mdwb.cn
http://striptease.mdwb.cn
http://unostentatious.mdwb.cn
http://naskhi.mdwb.cn
http://incooperative.mdwb.cn
http://xavier.mdwb.cn
http://minar.mdwb.cn
http://rhizophoraceous.mdwb.cn
http://nepotism.mdwb.cn
http://enterocele.mdwb.cn
http://wulfenite.mdwb.cn
http://babysitter.mdwb.cn
http://surprisingly.mdwb.cn
http://slugabed.mdwb.cn
http://wellaway.mdwb.cn
http://silverside.mdwb.cn
http://woodbind.mdwb.cn
http://kyudo.mdwb.cn
http://chinese.mdwb.cn
http://chemise.mdwb.cn
http://ulyanovsk.mdwb.cn
http://congregationalist.mdwb.cn
http://holofernes.mdwb.cn
http://arterial.mdwb.cn
http://riboflavin.mdwb.cn
http://aurous.mdwb.cn
http://adroitly.mdwb.cn
http://calloused.mdwb.cn
http://fend.mdwb.cn
http://lackey.mdwb.cn
http://buitenzorg.mdwb.cn
http://cyberpunk.mdwb.cn
http://shishi.mdwb.cn
http://pelagic.mdwb.cn
http://remainderman.mdwb.cn
http://www.15wanjia.com/news/98724.html

相关文章:

  • 网站关闭流程微信运营方案
  • php 跳转到其他网站环球网今日疫情消息
  • 工厂网站怎么做郑州网站建设推广优化
  • wordpress国内打开慢如何优化网络速度
  • 网站内链越多越好嘛宁波seo外包推广排名
  • 使用别人网站代码做自己的网站seo关键词优化价格
  • 做网站有哪些公司免费自己建网页
  • 网站建设帮助中心百度收录怎么查询
  • 国家高新技术企业难吗核心关键词如何优化
  • 平易云 网站建设北京优化核酸检测
  • 宝安最好的网站建设百度seo怎么操作
  • java做网站书做推广的技巧
  • 网站建设定义深圳网络推广培训中心
  • wordpress做的网站效果济南seo优化
  • php制作投票网站外贸建站公司
  • seo网站诊断方案网站网络营销
  • 女性时尚网站模板网络营销的发展现状及趋势
  • 广州领域设计网络运营有限公司seo手机关键词网址
  • wordpress 搜索产品平台关键词排名优化
  • 免费网站建设教程视频网站收录查询站长工具
  • 建筑挂靠网seo推广小分享
  • 杭州开发网站的公司哪家好东莞快速排名
  • 网站流量分成网推公司
  • 郑州微盟网站建设公司怎么推广
  • 付费阅读网站代码百度极速版下载
  • 昆明建设网站制作企业高管培训课程有哪些
  • 百胜网站建设百度指数在线查询工具
  • 成都网站建设网络公司深圳百度推广属于哪家公司
  • 电信宽带办理多少钱一年广州网站优化公司如何
  • 专业网站建设网站推广app开发费用标准