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

研究生做家教什么网站wordpress 文字插件下载

研究生做家教什么网站,wordpress 文字插件下载,广州自来水公司网页设计,页面设计原则Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 前言 在前两篇文章已经…Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 前言 在前两篇文章已经介绍过在使用Spring Data JPA时DAO层的Respository通过继承JPARepository自动提供了基本的CRUD接口。以下为JPARepository提供的接口。 通过接口的名字能够很直观的了解到JPA提供的批量插入的接口为saveAll()。 saveAll()批量更新 saveAll()方法的使用很简单接收一个集合对象。在Service层中调用repository.saveAll()即可。返回插入的集合。 Overridepublic int batchUpdate1(ListProductEntity list) {return productRepository.saveAll(list).size();} 以下为saveAll()的源码实现在SimpleJpaRepository TransactionalOverridepublic S extends T ListS saveAll(IterableS entities) {Assert.notNull(entities, Entities must not be null!);ListS result new ArrayList();// 遍历集合for (S entity : entities) {// 调用save()方法保存对象result.add(save(entity));}return result;}TransactionalOverridepublic S extends T S save(S entity) {Assert.notNull(entity, Entity must not be null.);// 如果数据的新的则执行persist()插入数据if (entityInformation.isNew(entity)) {em.persist(entity);return entity;} else {// 否则的话执行merge()该方法相当于hibernate中session的saveOrUpdate()方法// 用于实体的插入和更新操作return em.merge(entity);}} 从源码可以看出saveAll()方法不仅支持数据的批量保存还执行批量更新。使用起来会非常方便。 但是看了这个源码是否有些疑惑为何是轮询集合然后调用save()方法这会不会有问题理想中的批量操作应该是一批次访问一次数据库减少数据库的访问提升数据更新的效率。调用上面的方法执行10001条数据的更新后打开druid截图如下 什么情况执行了10001次事务这说明此批量操作并非理想中的批量操作它只是帮忙封装了一个for遍历而已。而为了解决真正的批量操作可以使用强大的javax.persistence.EntityManager来实现在save()方法中的persist()、merge()方法也是EntityManager中的方法。在上一篇 Spring Data JPA Criteria查询、部分字段查询-CSDN博客 部分字段查询也是用的EntityManager。 EntityManager Java Persistence APIJPA中的EntityManager是一个接口在JPA规范中EntityManager扮演着执行持久化操作的关键角色。普通Java对象只有被EntityManager持久化之后才能转变为持久化对象保存到数据库中。它不仅可以管理和更新Entity对象还可以基于主键查询Entity对象通过JPQL语句进行Entity查询甚至通过原生SQL语句进行数据库更新及查询操作。 EntityManager提供以下功能 1创建、更新和删除数据EntityManager中的persist()、merge()和remove()方法分别用于插入、更新和删除数据库记录 2查询数据EntityManager的find()和createQuery()方法用于查询数据 3管理实体的生命周期EntityManager的flush()方法用于将持久性上下文同步到基础数据库进行持久化操作 4事务管理EntityManager的getTransaction()方法用于获取当前事务可以对事务进行提交或回滚 5执行原生SQLEntityManager的createNativeQuery()方法用于执行原生SQL。对于原生SQL需要考虑不同数据库的各自实现 6创建CriteriaBuilderEntityManager的getCriteriaBuilder()方法用于获取CriteriaBuilder。通过CriteriaBuilder实现使用Criteria API查询数据 EntityManager提供了一种抽象的方式来管理数据库操作使得开发者可以更多专注于业务逻辑的开发而不需要关心底层的SQL语句。 以下将要介绍的数据库数据的批量新增以及修改使用的就是EntityManager执行原生SQL实现的。 MySQL数据批量新增及修改 使用EntityManager执行MySQL原生SQL实现时需要先修改spring.database.url的配置 spring:datasource:url: jdbc:mysql://localhost:3306/test?useUnicodetruecharacterEncodingutf8serverTimezoneGMT%2B8useSSLfalseallowMultiQueriestrue 在url中要加上 allowMultiQueriestrue 另外如果一次传输的数据太多还需要在MySQL数据库中进行配置windows修改配置文件my.iniLinux修改配置文件my.cnf在配置中添加group_concat_max_len的设置。该值默认值为1024个字节。 [mysqld] group_concat_max_len 102400   如果有使用第三方的数据库中间件也可能需要进行配置否则可能被当作SQL注入攻击。如使用druid需要如下配置 spring:datasource:druid:filters: stat,wallfilter:wall:config: #支持单个事物多条sql语句执行multi-statement-allow: truenone-base-statement-allow: trueenabled: true 批量新增及修改代码如下 package com.jingai.jpa.service.impl;import com.jingai.jpa.dao.entity.ProductEntity; import com.jingai.jpa.service.ProductService; import org.apache.logging.log4j.util.Strings; import org.hibernate.query.criteria.internal.OrderImpl; import org.springframework.data.domain.*; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; import org.springframework.util.StringUtils;import javax.annotation.Resource; import javax.persistence.EntityManager; import javax.persistence.Query; import javax.persistence.TypedQuery; import java.util.ArrayList; import java.util.List;Service public class ProductServiceImpl implements ProductService {Resourceprivate EntityManager entityManager;/*** 批量插入数据*/TransactionalOverridepublic int batchInsert(ListProductEntity list) {int batchSize 2000;if(list.isEmpty()) {return 0;}// 单次批量插入条数StringBuffer sb new StringBuffer();String insertSql insert into tb_product(name, delivery_no, customer, security_code, create_time, validate_num) values ;sb.append(insertSql);SimpleDateFormat format new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);int index 0;for(ProductEntity entity : list) {index ;// 拼接sql字符串sb.append(().append(entity.getName()).append(,).append(entity.getDeliveryNo()).append(,).append(entity.getCustomer()).append(,).append(entity.getSecurityCode()).append(,).append(format.format(entity.getCreateTime())).append(, 0),);if(index % batchSize 0) {Query query entityManager.createNativeQuery(sb.substring(0, sb.length() - 1) ;);int rs query.executeUpdate();if(rs ! batchSize) {TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();return 0;}sb sb.replace(0, sb.length(), insertSql);index 0;}}if(index 0) {Query query entityManager.createNativeQuery(sb.substring(0, sb.length() - 1) ;);int rs query.executeUpdate();if(rs ! list.size() % batchSize) {TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();return 0;}}return list.size();}/*** 批量修改*/ TransactionalOverridepublic int batchUpdate3(ListProductEntity list) {if(list.isEmpty()) {return 0;}StringBuffer sb new StringBuffer();String updateSql update tb_product set ;for(int i 0 ; i list.size() ; i ) {ProductEntity entity list.get(i);sb.append(updateSql).append(name ).append(entity.getName()).append(, customer ).append(entity.getCustomer()).append( where pid ).append(entity.getPid()).append(;);if(i 0 i % 2000 0) {Query query entityManager.createNativeQuery(sb.toString());int rs query.executeUpdate();if(rs 0) {TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();return 0;}sb sb.replace(0, sb.length(), Strings.EMPTY);}}if(sb.length() 0) {Query query entityManager.createNativeQuery(sb.toString());int rs query.executeUpdate();if(rs 0) {TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();return 0;}}return list.size();} }执行上面的batchUpdate3的接口修改10000条记录druid中的记录如下 相比上面使用的saveAll()方法实现的批量修改时间少了1900ms而实际的访问体验相差好几秒。因为这个执行时间只记录了在数据库中执行的时间而saveAll()要访问10000次的数据库而batchUpdate3()只需要访问5次数据库。 Oracle数据批量新增及修改 Oracle数据库并不支持多语句操作。在Oracle数据库中需要使用存储过程的begin...end语句块该语句块由一组一起执行的SQL语句组成。 /*** 批量新增*/Transactionalpublic int batchInsert(ListVarinst list) {if(list.isEmpty()) {return 0;}// 单次批量插入条数int batchSize 2000;StringBuffer sb new StringBuffer();String insertSql insert into tb_product(name, delivery_no, customer, security_code, create_time, validate_num) values ;sb.append(begin\r\n);SimpleDateFormat format new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);int index 0;for(Varinst entity : list) {index ;sb.append(().append(entity.getName()).append(,).append(entity.getDeliveryNo()).append(,).append(entity.getCustomer()).append(,).append(entity.getSecurityCode()).append(,TO_DATE().append(format.format(entity.getCreateTime())).append(, SYYYY-MM-DD HH24:MI:SS), 0),);if(index % batchSize 0) {sb.append(end;);Query query entityManager.createNativeQuery(sb.toString());int rs query.executeUpdate();if(rs 0) {TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();return 0;}sb sb.replace(0, sb.length(), Strings.EMPTY);index 0;sb.append(begin\r\n);}}if(index 0) {sb.append(end;);Query query entityManager.createNativeQuery(sb.toString());int rs query.executeUpdate();if(rs 0) {TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();return 0;}}return list.size();}/*** 批量修改*/Transactionalpublic int batchUpdateOracle(ListProductEntity list) {StringBuffer sb new StringBuffer();sb.append(begin\r\n);String updateSql update ACT_HI_VARINST set ;for(int i 0 ; i list.size() ; i ) {ProductEntity entity list.get(i);sb.append(updateSql).append(name ).append(entity.getName()).append(, customer ).append(entity.getCustomer()).append( where pid ).append(entity.getPid()).append(;);if(i 0 i % 2000 0) {sb.append(end;);Query query entityManager.createNativeQuery(sb.toString());int rs query.executeUpdate();if(rs 0) {TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();return 0;}sb sb.replace(0, sb.length(), Strings.EMPTY);sb.append(begin\r\n);}}if(list.size() % 2000 ! 0) {sb.append(end;);Query query entityManager.createNativeQuery(sb.toString());int rs query.executeUpdate();if(rs 0) {TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();return 0;}}return list.size();} 结尾 Spring Data JPA的知识点还有很多限于篇幅本篇先分享到这里。 关于本篇内容你有什么自己的想法或独到见解欢迎在评论区一起交流探讨下吧。
http://www.dnsts.com.cn/news/96089.html

相关文章:

  • 江苏网络公司网站建设php网站开发视频教程
  • 温州住房与城乡建设部网站网站商城建设基本流程
  • 宜昌网站建设市场qq网站登录
  • 无锡网站建设哪家做的比较好seo优化推广公司
  • 餐饮行业做网站有什么好处知乎设计国外网站有哪些
  • 购买天猫店铺网站网站制度建设存在的问题
  • 找网站公司制作网站哪些网上订餐的网站做的好
  • 网站换域名影响吗wordpress应用的主题修改教程
  • 申请一个网站需要怎么做手机网页设计公司
  • 做好网站 怎么要版权消防设备网站建设
  • 嵌入字体的网站做景观设计比赛的网站
  • 做爰视频免费观看网站深圳安居房最新房源
  • 网站建设案例信息wordpress设置固定连接失败
  • 哈尔滨网站设计公司地址wordpress主题检测
  • 公司网站要多大空间教做吃的网站
  • 大众点评网站团购怎么做济南川芎网站建设
  • 网站首页跳出弹窗化妆品网站建设规划书范文
  • 外链网盘网站iis 发布网站 500
  • 网站域名空间续费合同深圳网站制作的公司哪家好
  • 做微网站需要域名吗注册网站好的平台
  • 网站右侧广告站外推广网站
  • 一级a做爰片不卡免费网站房地产公司起名字大全免费
  • wordpress网站怎样google浏览器官方下载
  • 营销网站售后调查harmonyos开发语言
  • 苏州新闻seo sem是什么职位
  • 假淘宝网站怎么做室内设计学校有哪些
  • 企业网站设计服务wordpress 两边
  • 住房城乡与建设厅网站邮政企业微信app下载
  • 济南最好的网站建设公司做的好的营销型网站有哪些
  • q版设计网站企业官网建站联系我们