jdbctemplate中的批量更新使用,BigDecimal与造型的联系和区别

 1 //jdbctemplate批量新增的使用MENU_ID_LIST是前端页面传递到后端控制层,再由控制层传到实现层的List
 2
 3 //JdbcTemplate是spring jdbctemplate通过注解实例化得到的
 4
 5 public int insertEmpMenu(final String EMP_ID_, final List<String> MENU_ID_LIST, Map<String, Object> operator) {
 6         if (MENU_ID_LIST == null || MENU_ID_LIST.size() == 0) {//常见的判断方式
 7             return 0;
 8         }
 9
10         String sql = "insert into OM_EMPMENU(ID_, EMP_ID_, MENU_ID_) values (?, ?, ?)";
11         BatchPreparedStatementSetter batch = new BatchPreparedStatementSetter() {
12             public void setValues(PreparedStatement ps, int i) throws SQLException {
13                 ps.setString(1, BaseUtils.getUuid());
14                 ps.setString(2, EMP_ID_);
15                 ps.setString(3, MENU_ID_LIST.get(i));
16             }
17
18             public int getBatchSize() {
19                 return MENU_ID_LIST.size();
20             }
21         };
22         return JdbcTemplate.batchUpdate(sql, batch).length;
23     }

BigDecimal : Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处 理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用 java.math.BigDecimal。

当从数据库中取出的数是BigDecimal,需要对数据进行BigDecimal造型,然后调用相关方法,取得值,常见方法doubleValue(),intValue()。String类型可以直接造型

Double AVL_AMOUNT_ = ((BigDecimal) matYearPlanSum.get("AMOUNT_")).doubleValue();

(String) matMonthPlan.get("MAT_DESC_")

而如果是自己对取得的数据再进行计算获得新值时,从Map里取就不需要再使用BigDecimal,而是使用自己为其设定的类型

 1 for (Map<String, Object> matYearPlanSum : matYearPlanSumList) {
 2                 AVL_AMOUNT_ = ((BigDecimal) matYearPlanSum.get("AMOUNT_")).doubleValue();
 3                 matYearPlanSum.put("AVL_AMOUNT_", AVL_AMOUNT_);
 4                 for (Map<String, Object> matMonthPlanHis : matDeptMonthPlanSpentBudget) {
 5                     if (matYearPlanSum.get("MAT_NO_").equals(matMonthPlanHis.get("MAT_NO_"))) {
 6                         if (matYearPlanSum.get("AMOUNT_") != null && matMonthPlanHis.get("SPENT_AMOUNT_") != null) {
 7                             AVL_AMOUNT_ = ((BigDecimal) matYearPlanSum.get("AMOUNT_")).doubleValue() - ((BigDecimal) matMonthPlanHis.get("SPENT_AMOUNT_")).doubleValue();
 8                         }
 9                         matYearPlanSum.put("AVL_AMOUNT_", AVL_AMOUNT_);
10                         break;
11                     }
12                 }
13             }
14 for (Map<String, Object> matMonthPlan : matMonthPlanList) {
15                 for (Map<String, Object> matYearPlanSum : matYearPlanSumList) {
16                     if (matMonthPlan.get("MAT_NO_").equals(matYearPlanSum.get("MAT_NO_"))) {
17                         if (matYearPlanSum.get("ENABLE_AMOUNT_") != null && matMonthPlan.get("AMOUNT_") != null) {
18                             ENABLE_AMOUNT_ = ((BigDecimal) matMonthPlan.get("AMOUNT_")).doubleValue();
19                             ENABLE_AMOUNT_ = (Double) matYearPlanSum.get("ENABLE_AMOUNT_") + ENABLE_AMOUNT_;//例如此处的Double
20                         }
21                         matMonthPlan.put("ENABLE_AMOUNT_", ENABLE_AMOUNT_);
22                         break;
23                     }
24                 }
25             }

常见报错:Caused by: java.sql.SQLException: ORA-00911: 无效字符 是因为拼接的SQL语句后面多了一个分号。使用spring jdbctemplate不需要在SQL语句后加分号

to_date() 作用将字符类型按一定格式转化为日期类型:
具体用法:to_date(‘‘2004-11-27‘‘,‘‘yyyy-mm-dd‘‘),前者为字符串,后者为转换日期格式,注意,前后两者要以一对应。
如;to_date(‘‘2004-11-27 13:34:43‘‘, ‘‘yyyy-mm-dd hh24:mi:ss‘‘) 将得到具体的时间

时间: 2024-12-07 05:16:11

jdbctemplate中的批量更新使用,BigDecimal与造型的联系和区别的相关文章

Statement和PreparedStatement批量更新

优势:1.节省传递时间. 2.并发处理. PreparedStatement: 1) addBatch()将一组参数添加到PreparedStatement对象内部. 2) executeBatch()将一批参数提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组. Statement: 1) addBatch(String sql)方法会在批处理缓存中加入一条sql语句. 2) executeBatch()执行批处理缓存中的所有sql语句. 注意:PreparedStatemen

MySQL批量更新死锁案例分析--转载

问题描述 在做项目的过程中,由于写SQL太过随意,一不小心就抛了一个死锁异常,如下: [java] view plaincopyprint? com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction at sun.reflect.GeneratedConstructorAccessor24

MySQL批量更新不同表中的数据

今天翻到以前写的批量更新表中的数据的存储过程,故在此做一下记录. 当时MySQL中的表名具有如下特征,即根据需求将业务表类型分为了公有.私有和临时三种类型,即不同的业务对应三张表,而所做的是区分出是什么类型(公有.私有.临时)的业务表对数据的固定字段做统一规律的处理. 下面为当时所编写的存储过程: BEGIN DECLARE done INT; DECLARE v_table_name VARCHAR(100); DECLARE v_disable VARCHAR(100); DECLARE v

spring jdbcTemplate批量更新数据

方法:先实现BatchPreparedStatementSetter接口,然后再调用JdbcTemplate的batchUpdate(sql,setter)操作,参数sql是预编译语句 ,setter是BatchPreparedStatementSetter的一个实例.或者使用内部匿名类方式. BatchPreparedStatementSetter接口 public interface BatchPreparedStatementSetter{ public int getBatchSize(

.Net中批量更新数据(没有数据就添加)

方法一:使用SqlBulkCopy实现批量更新或添加数据. SqlBulkCopy类一般只能用来将数据批量插入打数据库中,如果数据表中设置了主键,出现重复数据的话会报错,如果没有设置主键,那么将会添加同样的数据,导致数据重复.这里有两种方案可实行方案,实现批量将数据更新到数据表中.如果数据存在,就更新数据:如果不存在,则添加一条新的数据 这两种方案都需要添加一个新的用作临时存储数据的表,假如有两个表 BatchTableTemp和BatchTable, SqlBulkCopy类先批量将数据添加到

LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新

原文:LINQ To SQL在N层应用程序中的CUD操作.批量删除.批量更新 0. 说明 Linq to Sql,以下简称L2S.    以下文中所指的两层和三层结构,分别如下图所示: 准确的说,这里的分层并不是特别明确:(1) 生成的DataContext(Linq t0 SQL Runtime)和Entity是放在一个文件中的,物理上不能切割开来:上图只是展示逻辑上的结构.(2) 拿上图右边的三层结构来说,鉴于第(1)点,UI层就可以跨越BusinessLogic层,直接访问L2S层,这可能

十几万条数据的表中,基于帝国cms 。自己亲身体验三种批量更新数据的方法,每一种的速度是什么样的

需求是 上传Excel 读取里面的数据.根据Excel中某一个字段,与数据表中的一个字段的唯一性.然后把 Excel表中数据和数据库表中数据一次更改.本次测试一次更新31条数据. 本次测试基于帝国cms 方法1 用一个for徐循环把读取的数据放在一个数组中然后在十几万条的数据表中逐条查询更改,用时35s: $numArr = count($arr);$m = ceil($numArr/10000);for($i=1;$i<=$numArr;$i++){ $n = $i*10000; $j = $

python中使用excutemany执行update语句,批量更新

python中使用excutemany执行update语句,批量更新 # coding:utf8 import pymysql import logging connection = pymysql.connect(host=HOST, port=3306, user=USER, password=PASSWORD, db=DATABASE,charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor) cursor = connection.

oracle和mysql中update联表批量更新数据的区别

之前碰到一个sql语句,在oracle中可以运行,在mysql上就不行,后来查了好久,发现了他们两个联表批量更新数据的区别如下: (借鉴一下别人的例子) update :单表的更新不用说了,两者一样,主要说说多表的更新复制代码 代码如下: Oracle> Oracle的多表更新要求比较严格,所以有的时候不是很好写,我们可以试试Oracle的游标 update ( select t.charger_id_ new_charger_id_ from t_cus_year_status t left