java基础练习(使用java实现跨库数据调度ETL)

简介

        本文写一篇关于java库与库之间的数据传输,现实生产中可能是通过其他方式完成,在没有架构的基础上使用java实现跨库的数据传送,非常不便利。但是作为练习我觉得确实非常有用,涉及的java知识点相对较多。本文以一个实列讲解,一个思考留给学习的粉丝就行后续实操锻炼。

实操准备

数据库表名链接url
数据源Oracle-19cdm.book
jdbc:oracle:thin:@//localhost:1521/ORCL
目标源postgresql-15.2main.book
jdbc:postgresql://10.0.0.199:6432/postgres

配置JDBC驱动

        通过dbeaver找到想要的驱动信息,也算是开发的一个小tips;        

通过dbeaver链接的对应的源库和目标库,如何能正常连接,使用dbeaver连接的JDBC驱动就好了。

        点击编辑驱动,

        记住这里的类名和url模板。然后点击库,会出现一些JDBC包

将以上的jar复制到idea当前所创建的project下的lib目录中

 

此时JDBC依赖包就创建完成了

创建测试数据

        在源数据中创建一个有数据的表,用于将数据调度到postgresql数据库中去

create table dm.book(ID varchar2(50), name varchar2(50), author varchar2(50), 	price number(10,3), public_inc varchar2(50));INSERT INTO dm.book
(ID, name, author, price, public_inc)
VALUES('0A2H3IW92I3JQU10S83OQ8O3B4IS8U4H', '镜花缘', '李汝珍', 29.4, '人民文学出版社');
INSERT INTO dm.book
(ID, name, author, price, public_inc)
VALUES('N4H1KS83HSI3HQ9DH33EBSSDIDCJ32C3', '山海经', '厚朴', 56.9, '古文出版社');
INSERT INTO dm.book
(ID, name, author, price, public_inc)
VALUES('B3JSI38AU4JD94KWIW9SHERF3FEV39SD', '玉观音', '海岩', 54.3, '广东文旅出版集团');
INSERT INTO dm.book
(ID, name, author, price, public_inc)
VALUES('11afb0ddf43a4ee59aadf380c1f15ad5', '活着', '余华', 23.43, '中华书局');
INSERT INTO dm.book
(ID, name, author, price, public_inc)
VALUES('6d14bb33654a46e686be7e49d4fae396', '三国演义', '罗贯中', 126.81, '人民文学出版社');
INSERT INTO dm.book
(ID, name, author, price, public_inc)
VALUES('0364d4b04387497a917e5e1dd6d8c96c', '红楼梦', '曹雪芹', 133.54, '人民文学出版社');
INSERT INTO dm.book
(ID, name, author, price, public_inc)
VALUES('044a980718124da894fdd70f37006d13', '水浒传', '施耐庵', 98.64, '上海美术出版社');

编辑代码

        为了完成以上的代码业务需求,我们代码分成三个文件完成

1,创建一个实体类,在java中用于存储表结构的数据,

2,核心逻辑代码,也就整个完成主体调度ETL的主题代码。

3,调用代码

一 ,创建实体类


public class book {private String id ;private String name;private String author;private double price;private String public_inc;//以下代码都是自动生成的,只需要把以上的代码编辑完成,然后生成getter,setter。public book(String id, String name, String author, double price, String public_inc) {this.id = id;this.name = name;this.author = author;this.price = price;this.public_inc = public_inc;}public book() {}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public String getPublic_inc() {return public_inc;}public void setPublic_inc(String public_inc) {this.public_inc = public_inc;}
}

 实体类中创建了变量的数据类型就需要自动生成其然后生成getter,setter以及构造方法和无参构造方法

 依次点击构造方法,getter and setter.

         构造方法创建两个,一个无参,一个有参。

        完成这两个操作之后,我们的实体类就创建完成了。

实体类的三大特点:

        属性封装:实体类通常会使用private修饰符来保护属性不被直接访问,只通过提供的getter和setter方法来获取或设置属性的值。
        数据操作:实体类通常会包含一些数据操作的方法,如插入、删除、修改等,以便在业务逻辑中进行数据处理。
        对象实例化:使用实体类可以方便地创建业务模型中的对象实例。
        实体类主要适用于存储数据库多行多列的表结构数据。

二,核心逻辑代码

//在下问代码编辑中会提示生成所需的import,只需要点击即可。
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
//创建类名,自定义,本文使用的text
public class text {
//创建main方法public static int main(String[] args) {
//定义目标数据据的urlString pgurl= "jdbc:postgresql://10.0.0.199:6432/postgres" ;
//创建一个名为ResultSql,数据类型为自定义的book的变量,用于装在表的结构化数据,其表的数据类型必须是自定义实体类book所有的List<book> ResultSql = new ArrayList<>();//定义一个源数据库oracle的urlString orclusrl="jdbc:oracle:thin:@//localhost:1521/ORCL";try {//第一步加载源数据库的urlClass.forName("oracle.jdbc.driver.OracleDriver");//使用JDBC的DriverManager类的getConnection()方法建立到指定数据库的连接Connection connection = DriverManager.getConnection(orclusrl, "system", "system");//使用Connection对象的createStatement()方法创建一个新的Statement对象。这个对象可以用来执行各种类型的SQL语句,包括查询、更新、删除等。Statement statement = connection.createStatement();
//使用Statement对象的executeQuery()方法执行SQL查询语句,并将结果集存储在ResultSet对象rs中。ResultSet rs = statement.executeQuery("select id, name, author, price, public_inc from dm.book");//while(rs.next()){是一个while循环,它会一直重复,直到结果集中没有更多的行。每次迭代都会使光标向下移动一行,以便读取下一组数据while(rs.next()){//它们创建了一个新的Book对象,book A = new book();//并通过ResultSet的getString()和getDouble()方法将每一列的数据提取出来,分别赋值给Book对象的属性。A.setId(rs.getString("id"));A.setName(rs.getString("name"));A.setAuthor(rs.getString("author"));A.setPrice(rs.getDouble("price"));A.setPublic_inc(rs.getString("public_inc"));//将这个Book对象添加到了ResultSql集合中。ResultSql.add(A);}//关闭Statement对象statement.close();//关闭链接connection.close();} catch (SQLException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}//定义变量i用于接受下文executeUpdate方法的返回值int i = 0;try {//加载postgresql的JDBC驱动Class.forName("org.postgresql.Driver");//创建与postgresql的数据库链接Connection connection = DriverManager.getConnection(pgurl, "readywrite", "readywrite");//使用Connection对象的prepareStatement()方法创建一个PreparedStatement对象。这里的sql参数表示要执行的SQL语句,可以带有占位符,String sql="insert into main.book(id, name, author, price, public_inc) values (?,?,?,?,?)";//使用Connection对象的prepareStatement()方法创建一个PreparedStatement对象。这里的sql参数表示要执行的SQL语句PreparedStatement preparedStatement = connection.prepareStatement(sql);//是一个for-each循环,它会对ResultSql集合中的每个元素进行迭代。直到结果集中没有更多的行。每次迭代都会使光标向下移动一行,以便读取下一组数据for (book A:ResultSql){//在循环体内。它们将当前Book对象的每个属性的值设置到PreparedStatement对象对应的占位符上。// 这里的setString()和setDouble()方法是用来设置非二进制类型的数据;// 对于二进制类型的数据,则需要使用setBinaryStream()、setBlob()、setBytes()、setCharacterStream()、// setClob()、setNCharacterStream()、setNClob()、setObject()、setRef()、setRowId()、setSQLXML()等方法。preparedStatement.setString(1,A.getId());preparedStatement.setString(2,A.getName());preparedStatement.setString(3,A.getAuthor());preparedStatement.setDouble(4,A.getPrice());preparedStatement.setString(5,A.getPublic_inc());//使用PreparedStatement对象的executeUpdate()方法执行SQL插入语句,返回受影响的行数。//此处一个是一个循环,所以每一此执行的都是一行,变量I的值也就是1.i = preparedStatement.executeUpdate();}preparedStatement.close();connection.close();} catch (SQLException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return i;}
}

关键字讲解

在定义一个实体类属性的变量的时候 

固定格式:List<实体类名>  变量名 = new ArrayList<>();

line47    int i = 0;

定义了一个变量i,用于接受后面执行insert后的返回值,其返回值是0或者1;

思考:

        如何让这个变量I变成一个累计值。

line 54 

String sql="insert into main.book(id, name, author, price, public_inc) values (?,?,?,?,?)";

在定义一个SQL语句变量的时候里面使用了“?”,这个问号是一个占位符,用于

preparedStatement.setString方法的定位。

调用代码

import java.util.List;public class dy {public static void main(String[] args) {//在text的main方法的属性设置中,应为viod替换成了static int, 而这个int必须与代码中retrun I 返回值数据类型相同。//调用代码中设置了一个int类型的bk变量,用于接收text.main调用的返回值I。int bk = text.main(new String[]{"开始调用"});System.out.println(bk);}
}

         点击运行调用脚本

        到目标数据库中查看效果。 

        数据库展示正常。 

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

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

相关文章

HTTP 协议详解-上(Fiddler 抓包演示)

文章目录 HTTP 协议HTTP 协议的工作过程HTTP 请求 (Request)认识URL关于 URL encode认识 "方法" (method)GET 方法POST 方法其他方法请求 "报头" (header)请求 "正文" (body) HTTP 响应详解状态码响应 "报头" (header) HTTP 协议 HTT…

服务器数据恢复—云服务器mysql数据库表被truncate的数据恢复案例

云服务器数据恢复环境&#xff1a; 阿里云ECS网站服务器&#xff0c;linux操作系统mysql数据库。 云服务器故障&#xff1a; 在执行数据库版本更新测试时&#xff0c;在生产库误执行了本来应该在测试库执行的sql脚本&#xff0c;导致生产库部分表被truncate&#xff0c;还有部…

python 视频硬字幕去除 内嵌字幕去除工具 vsr

项目简介 开源地址&#xff1a;https://github.com/YaoFANGUK/video-subtitle-remover Video-subtitle-remover (VSR) 是一款基于AI技术&#xff0c;将视频中的硬字幕去除的软件。 主要实现了以下功能&#xff1a; 无损分辨率将视频中的硬字幕去除&#xff0c;生成去除字幕后…

大模型的实践应用5-百川大模型(Baichuan-13B)的模型搭建与模型代码详细介绍,以及快速使用方法

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用5-百川大模型(Baichuan-13B)的模型搭建与模型代码详细介绍,以及快速使用方法。 Baichuan-13B 是由百川智能继 Baichuan-7B 之后开发的包含 130 亿参数的开源可商用的大规模语言模型,在权威的中文和英文 benchmark 上均…

25期代码随想录算法训练营第十天 | 栈与队列 part 1

目录 232.用栈实现队列225. 用队列实现栈 232.用栈实现队列 链接 相当于用两个stack将队列的元素顺序颠倒了一遍。 class MyQueue:def __init__(self):self.stack_in []self.stack_out []def push(self, x: int) -> None:self.stack_in.append(x)def pop(self) -> in…

three.js 航拍全景图(+陀螺仪)

右上角陀螺仪也可点击,需要https的环境,手动下载DeviceOrientationControls.js文件 后台包含打点功能 <template><div id"quanjing" style"width: 100vw; height: 100vh; overflow: hidden"><spanid"tip"style"position: ab…

【刷题篇】动态规划(三)

文章目录 1、第 N 个泰波那契数2、三步问题3、使用最小花费爬楼梯4、解码方法5、不同路径6、不同路径 II 1、第 N 个泰波那契数 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2 给你整数 n&#xff0c;请返回第 n 个泰波…

【数学】 4、向量的内积、外积、模长

文章目录 一、向量点乘&#xff08;内积&#xff09;1.1 几何意义1.2 点乘的代数定义&#xff0c;推导几何定义&#xff08;用于求向量夹角&#xff09;1.2.1 余弦定理 1.3 程序计算 二、向量叉乘&#xff08;外积&#xff09;2.1 几何意义 三、通俗理解内积和外积四、向量的模…

【网络编程】传输层——TCP协议

文章目录 TCP协议TCP协议格式窗口大小六个标志位确认应答机制超时重传机制连接管理机制三次握手四次挥手 流量控制滑动窗口拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结基于TCP的应用层协议TCP与UDP的对比 TCP相关实验CLOSE_WAIT状态实验TIME_WAIT状态实验TI…

gitlab数据备份和恢复

gitlab数据备份 sudo gitlab-rake gitlab:backup:create备份文件默认存放在/var/opt/gitlab/backups路径下&#xff0c; 生成1697101003_2023_10_12_12.0.3-ee_gitlab_backup.tar 文件 gitlab数据恢复 sudo gitlab-rake gitlab:backup:restore BACKUP1697101003_2023_10_12_…

Texlive安装

下载4.8G的iso文件 解压 或 装载后&#xff0c;以管理员身份运行(.bat)文件。 运行以下两句代码进行Texlive相关升级 tlmgr option repository otan tlmgr update --self --all 运行以下三行代码&#xff0c;检查是否安装成功 latex -v xelatex -v pdflatex -v 如果有异常…

Hundred Finance 攻击事件分析

背景知识 Hundred Finance 是 fork Compound 的一个借贷项目&#xff0c;在2023/04/15遭受了黑客攻击。攻击者在发起攻击交易之前执行了两笔准备交易占据了池子&#xff0c;因为发起攻击的前提是池子处于 empty 的状态&#xff08;发行的 hToken 数量为 0&#xff09;。 准备交…

技术分享 | 使用 cURL 发送请求

cURL 是一个通过 URL 传输数据的&#xff0c;功能强大的命令行工具。cURL 可以与 Chrome Devtool 工具配合使用&#xff0c;把浏览器发送的真实请求还原出来&#xff0c;附带认证信息&#xff0c;脱离浏览器执行&#xff0c;方便开发者重放请求、修改参数调试&#xff0c;编写脚…

【GO】项目import第三方的依赖包

目录 一、导入第三方包 1.执行命令 2.查看go环境变量参数 3.查看go.mod文件的变化情况 二、程序里如何import 1. import依赖包 2. 程序编写 本次学习go如果依赖第三方的包&#xff0c;并根据第三方的包提供的接口进行编程&#xff0c;这里需要使用go get命令。下面将go…

个性化联邦学习-综述

介绍阅读的三篇个性化联邦学习的经典综述文章 Three Approaches for Personalization with Applications to Federated Learning 论文地址 文章的主要内容 介绍了用户聚类&#xff0c;数据插值&#xff0c;模型插值三种个性化联邦学习的方法。 用户聚类&#xff1a; 目的&a…

快速解决mfc140u.dll丢失问题,找不到mfc140u.dll修复方法分享

在计算机使用过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是某些dll文件丢失。最近&#xff0c;我就遇到了一个关于mfc140u.dll丢失的问题。mfc140u.dll是Microsoft Foundation Class&#xff08;MFC&#xff09;库中的一个动态链接库文件&#xff0c;它包…

Tomcat,jdk下载配置(发布项目)

Tomcat&#xff0c;jdk下载&#xff0c; 远程连接 启动以下服务 高级设置 允许别人连接进来 网上搜索jdk下载即可 双击下一步即可 下一步 输入java&#xff0c;看有没有安装成功 这是安装成功的 Tomcat就可以安装了 和以上操作一样&#xff0c;在网上下载安装包&#xff0c;…

手把手教你搭建属于自己的服务器

最近总是想搭建自己的网站&#xff0c;奈何皮夹里空空如也&#xff0c;服务器也租不起&#xff0c;更别说域名了。于是我就寻思能否自己搭建个服务器&#xff0c;还不要钱呢&#xff1f; 还真行&#xff01;&#xff01;&#xff01; 经过几天的冲浪&#xff0c;我发现有两个…

SpringBoot文件上传

SpringBoot文件上传 上传文件是互联网中常常应用的场景之一&#xff0c;最典型的情况就是上传头像等&#xff0c;今天就带着带着大家做一个 Spring Boot 上传文件的小案例。 1、pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xml…

pytest中的pytest.ini

[pytest] filterwarnings ignore::DeprecationWarning addopts -v -s markers uat:1 smok:2 log_cli1 xfail_strict True filterwarnings ignore::DeprecationWarning 这个的功能就是 test_login.py::Test_login::test_login_correct_password PASSEDwarnings summary …