php链接oracle乱码,尝试把一个php的项目转成java,


最近有个新需求,OA上的考勤信息确认,开始的时候搞了个php的版本,莫名其妙的数据库会乱码(oracle)(等有时间再写一篇php链接oracle数据库)折腾了将近一个周,乱码莫名其妙的出现,代码啥也不动,多请求两遍又正常了。准备搞个java来替换php,在gpt的协助下,搞成了。上代码

连接数据库:

private static final String DB_URL = "jdbc:oracle:thin:@**.**.**.**:1521:***";private static final String DB_USER = "****";private static final String DB_PASSWORD = "****";

发起网络请求,,获取数据:

//使用OkHttp发起网络请求
OkHttpClient client = new OkHttpClient().newBuilder().connectTimeout(300, TimeUnit.SECONDS).readTimeout(300, TimeUnit.SECONDS).build();MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");RequestBody body = RequestBody.create(mediaType, "***=**&****=**&*****=**&*****="+******);Request request = new Request.Builder().url("http://******/***/**/*************").method("POST", body).addHeader("Content-Type", "application/x-www-form-urlencoded").addHeader("Cookie", "****************************").build();Response response = client.newCall(request).execute();

处理数据考勤数据:

  // json化数据ObjectMapper objectMapper = new ObjectMapper();Map<String, Object> data = objectMapper.readValue(responseBody, Map.class);JsonArray resultArray = new JsonArray();//定义一个json  取data中data的值for (Map<String, Object> employee : (List<Map<String, Object>>) data.get("data")) {// 计算日期Calendar calendar = Calendar.getInstance();calendar.add(Calendar.MONTH, -1);calendar.set(Calendar.DAY_OF_MONTH, 1);Date firstDayOfPreviousMonth = calendar.getTime();calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));Date lastDayOfPreviousMonth = calendar.getTime();JsonObject employeeData = new JsonObject();// 给employeeData绑定值employeeData.addProperty("*****", (String) employee.get("****"));employeeData.addProperty("****", (String) employee.get("*****"));employeeData.addProperty("*****", (String) employee.get("****"));employeeData.addProperty("****", (String) employee.get("*****"));****************JsonArray attendanceDetailsArray = new JsonArray();calendar.setTime(firstDayOfPreviousMonth);//处理考勤信息json 获取需要的数据 1-31  格式{"Date":16,"Text":"√"}while (firstDayOfPreviousMonth.compareTo(lastDayOfPreviousMonth) <= 0) {// 考勤信息原始的date数据格式在这里SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");String fullDateKey = dateFormat.format(firstDayOfPreviousMonth);int dayKey = calendar.get(Calendar.DAY_OF_MONTH);JsonObject attendanceDetails = new JsonObject();//是否包含指定的键值if (employee.containsKey(fullDateKey)) {String attendanceText = (String) ((Map<String, Object>) employee.get(fullDateKey)).get("text");attendanceDetails.addProperty("Date", dayKey);attendanceDetails.addProperty("Text", attendanceText);} else {attendanceDetails.addProperty("Date", dayKey);attendanceDetails.addProperty("Text", "");}// 赋值给attendanceDetailsArrayattendanceDetailsArray.add(attendanceDetails);// 清除天数calendar.add(Calendar.DAY_OF_MONTH, 1);firstDayOfPreviousMonth = calendar.getTime();}//处理完成的考勤数据 [{Date=1.0, Text=√}, {Date=2.0, Text=√}, {Date=3.0, Text=年假 年假}, {Date=4.0, Text=休息}, {Date=5.0, Text=√}, {Date=6.0, Text=事假 事假}, {Date=7.0, Text=√}, {Date=8.0, Text=√}, {Date=9.0, Text=√}, {Date=10.0, Text=事假 事假}, {Date=11.0, Text=√}, {Date=12.0, Text=√}, {Date=13.0, Text=√}, {Date=14.0, Text=√}, {Date=15.0, Text=√}, {Date=16.0, Text=√}, {Date=17.0, Text=年假 年假}, {Date=18.0, Text=休息}, {Date=19.0, Text=√}, {Date=20.0, Text=√}, {Date=21.0, Text=事假 事假}, {Date=22.0, Text=√}, {Date=23.0, Text=√}, {Date=24.0, Text=√}, {Date=25.0, Text=√}, {Date=26.0, Text=休息}, {Date=27.0, Text=年假 年假}, {Date=28.0, Text=√}, {Date=29.0, Text=√}, {Date=30.0, Text=√}]employeeData.add("attendanceDetails", attendanceDetailsArray);resultArray.add(employeeData);}//打印jsonString看一下数据是否完整String jsonString = new Gson().toJson(resultArray);System.out.println("new"+jsonString);

创建数据库链接,更新数据:

   try (Connection connection = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) {// 根据id查询一下主表的idString selectSql = "SELECT id FROM (SELECT id FROM " + formName + " WHERE ********= ? ORDER BY id DESC) WHERE ROWNUM = 1";try (PreparedStatement selectStatement = connection.prepareStatement(selectSql)) {selectStatement.setString(1, requestId);try (ResultSet resultSet = selectStatement.executeQuery()) {if (resultSet.next()) {//获取的json  考勤信息System.out.println("123789"+resultSet);//查询的主表的id更新附表时要用哪个int mainId = resultSet.getInt("id");System.out.println("mainId");System.out.println(mainId);//拼接sqlString updateSql = "UPDATE " + formName + "_dt1 " +"SET ***= ?, bymqts = ?, *** = ?, kqs = ?, ***= ?, ***= ?, ****= ?, ****= ?, " +"****= ?, ****= ?, ****= ?, ****= ?, ****= ?, ****= ?, ****= ?, *****= ?, ****= ?,                         ****= ?, *****= ?"; for (int i = 1; i <= 31; i++) {String columnName = getColumnName(i);updateSql += ", " + columnName + " = CASE WHEN ? = " + i + " THEN ? ELSE " + columnName + " END";}updateSql += " WHERE ****= ? AND ****= ?";try (PreparedStatement updateStatement = connection.prepareStatement(updateSql)) {System.out.println("  System.out.println(resultArray);"+resultArray);List<Map<String, Object>> resultJson = new Gson().fromJson(resultArray, new TypeToken<List<Map<String, Object>>>() {}.getType());for (Map<String, Object> employee : resultJson) {// Set parameters for the prepared statementupdateStatement.setString(1, (String) employee.get("****"));updateStatement.setString(2, (String) employee.get("****"));updateStatement.setString(3, (String) employee.get("****"));updateStatement.setString(4, (String) employee.get("****"));updateStatement.setString(5, (String) employee.get("****"));updateStatement.setString(6, (String) employee.get("****"));List<Map<String, Object>> attendanceDetails = (List<Map<String, Object>>) employee.get("attendanceDetails");//日期类型 必须要用linkedHashMap 不然1会到15后面导致15号之前的更新不成功Map<Double, String> attendanceMap = new LinkedHashMap<>();for (Map<String, Object> record : attendanceDetails) {Double date = (Double) record.get("Date");String text = (String) record.get("Text");attendanceMap.put(date, text);}System.out.println("    System.out.println(attendanceMap1);");System.out.println(attendanceMap);// 补全缺失的日期  都到31号for (double i = 1; i <= 31; i++) {if (!attendanceMap.containsKey(i)) {attendanceMap.put(i, "");}}System.out.println("    System.out.println(attendanceMap2);");System.out.println(attendanceMap);int parameterIndex = 20;// 打印结果for (Map.Entry<Double, String> entry : attendanceMap.entrySet()) {Object dateValue = entry.getKey();Object textValue = entry.getValue();String dateString;if (dateValue instanceof Double) {dateString = String.valueOf(((Double) dateValue).intValue());} else {dateString = (String) dateValue;}updateStatement.setString(parameterIndex++, dateString);updateStatement.setString(parameterIndex++, (String) textValue);System.out.println("Date: " + entry.getKey() + ", Text: " + entry.getValue());}updateStatement.setString(parameterIndex++, String.valueOf(*****));updateStatement.setString(parameterIndex++, (String) employee.get("*****"));System.out.println("Executing SQL statement: " + updateStatement.toString());String generatedSql = buildGeneratedSql(updateSql, resultJson.get(0));          }return "{\"status\": \"0\", \"message\": \"SUCCESS\", \"data\": \"\"}";}}}}} catch (SQLException e) {e.printStackTrace(); // Handle the exception based on your application's requirements}

完工,部署的时候又遇到了jdk和数据库驱动不匹配的问题,升级了jdk,按照下面的链接部署服务,测试正常。

https://blog.csdn.net/SmallCat0912/article/details/127426885

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/226059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis环境的搭建

1.创建 Maven 工程 打开idea新建一个项目File → Project Structure → Project&#xff0c;build system中选择maven &#xff08;1&#xff09;由于 IDEA 中集成了 Maven&#xff0c;所以我们就不需要下载了&#xff0c;直接使用 IDEA 默认的 Maven 进行项目构建。 &#…

【NSX-T】10. 搭建NSX-T环境 —— 使用 BGP 配置 Tier-0 网关

目录 10.1 创建上行链路网段10.2 创建 Tier-0 网关&#xff08;1&#xff09;设置 Interface 信息&#xff08;2&#xff09;设置 BGP添加 BGP 邻居 &#xff08;3&#xff09;设置 BGP 路由重分发设置路由重新分发 10.3 连接 Tier-0 和 Tier-1 网关10.4 使用网络拓扑验证 Tier…

VLAN间的通讯---三层交换

一.三层交换 1.概念 使用三层交换技术实现VLAN间通信 三层交换二层交换 三层转发 2.基于CEF的MLS CEF是一种基于拓补转发的模型 转发信息库&#xff08;FIB&#xff09;临接关系表 转发信息库&#xff08;FIB&#xff09;可以理解为路由表 邻接关系表可以理解为MAC地址表…

Facebook广告系统结构

Facebook广告系统是一个复杂的大型系统&#xff0c;由多个组件和子系统相互配合工作&#xff0c;实现了广告的投放、拍卖、个性化推荐和效果评估等功能。下面小编讲讲Facebook广告系统的结构。 1、广告管理界面 广告管理界面是广告主与Facebook进行交互的入口&#xff0c;广告…

猿人学19题(原比赛平台)

这道题给我搞得有点懵了&#xff0c;我现在还没发现他到底要考察什么&#xff0c;这边我直接协商我的sessionid请求是直接就成功的。&#x1f602; 依旧是分析请求方式&#xff0c;抓包到返回数据的位置 现在可以知道这些数据是ajax返回的&#xff0c;请求的参数是page&#x…

企业AI助理:数字助理嵌入更多应用场景

随着科技的快速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经成为现代企业不可或缺的一部分。数字助理作为AI的一种形式&#xff0c;正在越来越多地嵌入到企业的各个应用场景中&#xff0c;为企业提供更加智能化、高效化的服务。本文将探讨企业AI助理的发展趋势、应…

Spark RDD、DataFrame、DataSet比较

在Spark的学习当中&#xff0c;RDD、DataFrame、DataSet可以说都是需要着重理解的专业名词概念。尤其是在涉及到数据结构的部分&#xff0c;理解清楚这三者的共性与区别&#xff0c;非常有必要。 RDD&#xff0c;作为Spark的核心数据抽象&#xff0c;是Spark当中不可或缺的存在…

MacOS下C,C++编译器路径与源码位置(附 bits/stdc++.h)

categories: [C_C] tags: C 写在前面 在下面的位置中写入(先mkdir bits) stdc.h文件内容: 参考 gcc 源码 gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/precompiled/stdc%2B%2B.h; // C includes used for precompiling -*- C -*-// Copyright (C) 2003-2023 Free …

Linux(操作系统)面经——part2

1、请你说说进程和线程的区别 1.进程是操作系统资源分配和调度的最小单位&#xff0c;实现操作系统内部的并发&#xff1b;线程是进程的子任务&#xff0c;cpu可以识别、执行的最小单位&#xff0c;实现程序内部的并发。 2.一个进程最少有一个线程或有多个&#xff0c;一个线程…

C语言写的 mini版的 http 服务器 , 很详细

文章目录 效果展示整体架构流程技术细节完整代码 效果展示 例如&#xff1a;htpp://192.168.23.140/home.html -> 正确的请求格式 home.html 这个资源是放在我们服务器里面的 , 并不是随便访问的资源,当然我们可以放很多的资源进去. 整体架构流程 整个实现的流…

无心剑英译朱自清《匆匆》

匆匆 Vanished in Haste 朱自清 By Zhu Ziqing 燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:现在又到了哪里呢? Sw…

如何使用Docker进行容器的备份和恢复

一 简介&#xff1a; 在使用Docker进行应用程序的容器化部署时&#xff0c;我们经常需要对容器进行备份和恢复操作。备份容器可以保证数据的安全性&#xff0c;而恢复操作可以帮助我们快速恢复出现问题的容器。本文将介绍如何使用Docker进行容器的备份和恢复&#xff0c;同时提…

Buck电源设计常见的一些问题(二)MOS管炸机问题

MOS管炸机问题 1.概述2.MOS管的相关参数3.过电压失效4.过电流失效5.静电放电和热失效1.概述 在我们做电源产品或者电机控制器时候,经常会坏MOS管。我相信90%以上的硬件工程师在职场生涯中都会遇到这类问题。然而这类问题也总是让人防不胜防。经常我们都会开玩笑的说,没烧过管…

【JavaWeb】用注解代替配置文件

WebServlet("/query") public class QueryServlet extends HttpServlet {...}在Servlet类上写WebServlet("query"),就相当于在配置文件里写了↓ <servlet><servlet-name>query</servlet-name><servlet-class>QueryServlet</se…

Spring MVC与Spring Boot简单理解

假设你要制作一份披萨&#xff0c;那么可以将整个过程类比为开发一个Web应用程序。 Spring MVC比喻为制作披萨的过程&#xff1a; 摊饼皮&#xff1a;在制作披萨时&#xff0c;首先需要摊开饼皮作为基础。 准备配料&#xff1a;接下来&#xff0c;你会选择各种配料&#xff0…

【数据结构第 6 章 ④】- 用 C 语言实现图的深度优先搜索遍历和广度优先搜索遍历

目录 一、深度优先搜索 1.1 - 深度优先搜索遍历的过程 1.2 - 深度优先搜索遍历的算法实现 二、广度优先搜索 2.1 - 广度优先搜索遍历的过程 2.2 - 广度优先搜索遍历的算法实现 和树的遍历类似&#xff0c;图的遍历也是从图中某一顶点出发&#xff0c;按照某种方法对图中所…

壹基金瑞金东升社区儿童服务站上演“甜蜜冬日”亲子DIY蛋糕秀

12月9日上午&#xff0c;一场温情满溢的亲子DIY蛋糕活动&#xff0c;在壹基金瑞金东升社区儿童服务站拉开了帷幕&#xff0c;空气里有香甜的奶油味道&#xff0c;浓浓的温馨气息感染着在场的每一个人。 自己动手做的&#xff0c;才有意义&#xff0c;蛋糕DIY是一项很好的亲子活…

油封在机械系统中不可或缺的作用

油封是众多机械系统中的基本组件。但我们到底为什么要使用油封呢?本文旨在阐明油封所发挥的关键作用及其广泛使用背后的原因。 油封的主要作用&#xff1a; 油封的主要功能是充当屏障。它可以防止润滑油从机器和轴承内部的缝隙中泄漏&#xff0c;确保机械部件的平稳运行。同…

Mysql的聚簇索引(聚集索引)和非聚簇索引的区别

MySQL中的索引分为两种主要类型&#xff1a;聚簇索引&#xff08;Clustered Index&#xff09;和非聚簇索引&#xff08;Non-clustered Index&#xff09;。这两种索引的主要区别在于它们如何组织数据和索引的方式。 聚簇索引&#xff08;Clustered Index&#xff09; 聚簇索…

Linux GPIO 应用编程

Linux GPIO 应用编程 嵌入式Linux应用开发中&#xff0c;系统经常会通过GPIO接入按键、各种感应开关等传感器&#xff0c;或控制电源开关、继电器等设备。 要在Linux应用层控制GPIO有两种方式&#xff1a; 通过sysfs控制通过API控制 通过sysfs控制GPIO 为了用户空间运行的…