一、配置环境

配置jdbc驱动包:如Oracle数据库,在其安装目录下:D:\app\OracleRoot\product\12.2.0\dbhome_1\jdbc\lib

  1. 在java工程下建立一个文件夹,可以命名为lib,
  2. 将jdbc驱动包放到该文件夹中
  3. 在ecslipe或者其他IDE中将该驱动包(ojdbc8.jar)添加到编译路径中(Add Build Path);
  4. 新建包,在包中新建类即可;
    配置完毕;

二、java运行流程

Oracle JDBC 驱动程序:允许java程序中的JDBC语句访问Oracle数据库。
java中使用JDBC,必须将对应的JDBC包导入程序:import java.sql.*
java有两套jdbc包:
标准JDBC: 允许程序访问大多数数据库的基本功能
Oracle的扩展包: 允许程序访问所有特定于Oracle的功能和特定于Oracle的性能扩展

1. 注册Oracle JDBC驱动程序

第一种:java.lang.Class类中的forName()

//这两种好像都可以,可以仔细查一下两者的区别
Class.forName("oracle.jdbc.OracleDriver");
Class.forName("oracle.jdbc.driver.OracleDriver");

第二种:java.sql.DriverManager类中的registerDriver()

DriverManager.registerDriver(new oracle.jdbc.OracleDriver())

2. 连接数据库

第一种:使用DriverManager类中的getConnection()方法。
DriverManager.getConnection(URL, username, password):参数:数据库URL、数据库用户名、密码;返回一个JDBC Connetion对象。
如:

Connetion myConnection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL", store, store)

URL格式:driver_name:@driver_information
driver_name: 程序使用的OracleJDBC驱动程序名称
jdbc:oracle:thin 和 jdbc:oracle:oci
driver_information格式:取决于所使用的驱动程序。假如是thin,则格式为host_name:port:database_SID.
对于所有Oracle JDBC驱动程序,还可以使用比较通用的Oracle Net键值对指定:

(description=(address=(host=host_name)(protocol=tcp)(port=port))(connect_data=(sid=database_SID)))

第二种: 使用Oracle数据源连接数据库
Oracle数据源提供了一个比第一种方法更为标准化的方法;
步骤:

  • 创建oracle.jdbc.pool.OracleDataSource类的Oracle数据源对象;

    OracleDataSource myDataSource = new OracleDataSource();
    
  • 使用类中定义的set方法,设置Oracle数据源对象的属性;
    通过set方法设置各种属性值,通过get方法可以得到各种属性值。
    databaseName:数据库名称,OracleSID
    dataSourceName:底层数据源类的名称
    description:数据源的描述
    networkProtocol:通信的网络协议,仅应用于Oracle JDBC OCI驱动程序,默认为tcp。
    password:用户密码
    portNumber:端口,默认为1521
    serverName:计算机名,ip地址或DNS别名
    user:数据库用户
    driverType:所使用的JDBC驱动程序,如果使用的是服务器内部的驱动程序,设置为kprb。忽略属性的其他设置。
    url:用于指定Oracle数据库的url,也可以设置数据库的位置
    tnsEntryName:可用于指定Oracle Net TNSNAMES字符串,当使用OCI驱动程序时,也可用于指定数据库位置。
  • 使用getConnetion()方法,通过Oracle数据源对象连接数据库;
    Connetion myConnection = myDataSource.getConnection();
    

    该方法也可以传递账户与密码,可以覆盖上一步设置属性时的用户和密码。

    Connetion myConnection = myDataSource.getConnection("user", "passwd");
    

3. 注册和连接数据库后,创建JDBC Statement对象来执行具体的SQL语句

使用之前连接数据库后Connection类的对象方法createStatement()方法创建Statement对象。

Statement myStatement = myConnection.createStatement();

其有三种执行语句的方法:

  • executeQuery():如果执行SELECT语句
  • executeUpdate():如果执行INSERT、UPDATE、DELETE语句
  • execute():如果不清楚需要执行哪一类语句,也可以执行DDL语句

4. SELECT

由于select可能返回多行,因此将返回值存在result set中,使用java.sql.ResultSet类,再一次读取行;

  • 创建ResultSet类,并使用SELECT语句填充
ResultSet customerResultSet = myStatement.executQuery("SELECT customer_id, first_name, last_name, dob, phone "+"FROM customers " + whereClause);
  • 从结果中读取行
    由于Oracle与java数据类型相互兼容,因此不用太过于担心数据类型的问题;
Oracle JAVE
CHAR String
VARCHAR2 String
DATA java.sql.Data、java.sql.Time、java.sql.Timestamp
INTEGER short int long
NUMBER float double java.math.BigDecimal

使用next()函数从结果中定位一行,也就是说,返回数据集后必须先执行一次next();
然后再使用get方法可以从ResultSet对象中获得行的数据;
getInt(); getString(); getDate();
为获得某一列,get方法可以提供一个参数,可以是一个列数的索引(从1开始),也可以是列名(字符串),后者的可读性更强;
如getInt(1) 或 getInt(“customer_id”)

由于ResultSet对象的结果往往包含多行,因此,需要使用JDBC提供的next()方法,next方法可以理解为读取当前行后并移动到下一行。如果没有内容了,将返回false;在通过使用get方法取数据时,是否在列中移动,待验证!!!!!

  • 关闭ResultSet对象
    使用方法close();

5. INSERT

尤其要注意时间的写入,必须首先使用TO_DATE()内置数据库函数,把日期转化为数据库可以理解的格式。如:

myStatemet.executeUpdate("INSERT INTO "+"(customers, first_name, last_name, dob, phone) VALUES (" + costomerId +...+"TO_DATA("+dob+", 'YYYY,MM,DD'), ...")

特别注意格式问题,字符串的引号等。可以实践一下。

6. UPDATE

7. DELETE

8. 处理数字需要注意的点

Oracle数据库可以存储精度最大为38位的数字,在数字表示中,精度指的是在数字计算机内存中浮点数字所表示的精度。

java中,
存储数字时,可以使用short, int, long, java.math.BigInteger类型,
存储浮点数时,可以使用float, double, java.math.BigDecimal类型

除此以外,还可以使用Oracle JDBC扩展类型之一:oracle.sql.NUMBER类型来存储整型数或浮点数,其允许的最大精度为38位。

9. 处理数据库的NULL

在定义数据库列时,列可以定义为NULL或NOT NULL,前者表示可以存储NULL, 后者表示不可以包含NULL;
在java读取时,对于是对象的变量而言,返回null值非常正常,但是如果变量类型是数字、逻辑和位类型,则数据库中的null就会被存为0;而数据库中0和null是完全不同的,null表示没有内容,而0是具体的内容。

解决方案:

  • 可以使用ResultSet中的wasNull()方法;
  • 使用java包装类;

默认情况下,java对数据库的操作语句都是自动提交模式
自动提交模式的缺点:
所有语句被当成单个事务,这往往是一个错误的假设;
导致SQL语句的执行时间增加,因为每个语句都要提交;
可以通过Connection类的setAutoCommit()方法更改提交模式;

myConnection.setAutoCommit(false); //关闭自动提交模式
myConnection.commit();  //手动提交
myConnection.rollback();  //手动取消更改

同时,如果关闭了自动提交模式后,如果没有显示提交,在关闭Connection对象时会执行隐式提交。

执行DDL语句

DDL:由CREATE, ALTER, DROP, TRUNCATE, RENAME等组成;
注意: 执行DDL语句会导致隐式提交,因此,如果在执行DDL语句之前执行了没有提交的DML语句,这些DML语句也会被提交。

最后需要关闭数据库的对象

需要依次关闭ResultSet对象、Statement对象、Connection对象。
通常会在finally子句中关闭Statement对象、Connection对象,

预备SQL语句

为什么:
向数据库发送SQL语句时,数据库软件读取SQL语句,并检验他是否正确,这成为解析SQL语句;然后数据库软件建立一个计划,这称为执行计划,实际运行语句。相当于使用Statement对象运行SQL时,由于没有语句都是不同的,因此每次都需要建立执行计划运行语句,而在实际操作中,往往会连续执行同一语句,只是变量值不一样而已,这就大大降低了效率。
可以使用JDBC PreparedStatement对象执行相同的语句,但为语句的实际执行提供不同的数据,如此便知需要建立一个执行计划即可。

PrepareStatement myPrepareStatement = myConnection.prepareStatement("INSERT INTO products " + "(customers, first_name, last_name, dob, phone) VALUES (" + "?, ?, ?, ?, ?)");
for (int counter = 0; counter < productArray.length; counter++){myPrepareStatement.setInt(1, productArray[counter].productId);myPrepareStatement.setInt(2, productArray[counter].productTypeId);myPrepareStatement.setInt(3, productArray[counter].name);myPrepareStatement.setInt(4, productArray[counter].description);myPrepareStatement.setInt(5, productArray[counter].price);myPrepareStatement.execute();
}

问号的位置很重要,第几个问号就是在set中提供索引号位置,从1开始。

Oracle JDBC扩展

Oracle扩展包:

  • oracle.sql:包含支持Oracle类型的类;
  • oracle.jdbc:包含支持访问Oracle数据库的借口;

使用JAVA运行SQL相关推荐

  1. java jdbc脚本_关于java:使用MySQL和JDBC运行.sql脚本

    我开始使用MySQL和JDBC. Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnectio ...

  2. .java 运行文件暗掉_Eclipse的暗色方案[关闭]

    回答(20) 2 years ago 已经发布了一些相关问题,我正在开发一个简单的交叉编辑器颜色主题管理插件: 它仍在进行中,但已经支持许多编辑器和一些暗色主题 . 2 years ago 我已经创建 ...

  3. JAVA运行时异常及检查式异常

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  4. jooq sql_用jOOQ用Java编写SQL

    jooq sql jOOQ是"数据库优先"类型的安全SQL API,使您可以直观地用Java编写SQL,就像Java编译器本身支持SQL语言一样. 所有数据库模式,表,列,过程和其 ...

  5. 用jOOQ用Java编写SQL

    jOOQ是"数据库优先"的类型安全的SQL API,使您可以直观地用Java编写SQL,就像Java编译器本身支持SQL语言一样. 所有数据库模式,表,列,过程和其他对象均作为Ja ...

  6. java sql server连接字符串_关于Java:SQL Server的等效jdbc连接字符串

    我目前正在使用以下连接字符串连接到数据库(该数据库与ServerIP在同一服务器上): String constr ="Data Source=ServerIP,1433;Network L ...

  7. java 防止sql注入_Java中SQL注入以及如何轻松防止它

    java 防止sql注入 什么是SQL注入? (What is SQL Injection?) SQL Injection is one of the top 10 web application v ...

  8. 数据库运行sql文件

    sql数据库文件',点击'开始'.navicat是一套快速.可靠并价格相当便宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设.它的设计符合数据库管理员.开发人员及中小企业的需要.navi ...

  9. 【java毕业设计】基于java+Eclipse +SQL Server的工厂进销存管理系统设计与实现(毕业论文+程序源码)——工厂进销存管理系统

    基于java+Eclipse +SQL Server的工厂进销存管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Eclipse +SQL Server的工厂进销存管理系统 ...

最新文章

  1. 用 .NET Memory Profiler 跟踪.net 应用内存使用情况--基本应用篇
  2. Gartner:2019十大战略技术趋势
  3. IntelliJ IDEA 的 project 和 module 区别与关系
  4. 金融反欺诈和金融构建信用评分或者金融预测特征抽取案例
  5. [云炬创业基础笔记]第四章测试24
  6. 精通jQuery选择器使用 转一篇
  7. p50会搭载鸿蒙吗,华为Mate40和华为P50也会搭载鸿蒙,华为Mate30跌至白菜价让路
  8. 为什么“how to say”是错的?
  9. 通过layout进行适配遇到的一点小问题及解决方案
  10. gitee提交突然报错remote: Incorrect username or password ( access token )
  11. ERP项目实施记录02
  12. php可以在dw中吗,php新手求助,为什么在DW中设计里能看到运行php程序的结果,但…...
  13. Python XML读写(xml.etree.ElementTree模块)(转载)
  14. 美国卡内基梅隆大学计算机排名,美国卡内基梅隆大学世界排名情况
  15. C# Form窗体显示不完整
  16. C#编程,DateTime使用方法,时间转字符方法总结
  17. doctrine-orm基础(单用doctrine避坑指南)
  18. js打印线程id_泥瓦匠聊并发编程:线程与多线程必知必会(基础篇)
  19. 邀请码:20111221235047_092555,有效期至2011-12-21 23:50:45
  20. python游戏背景音乐循环播放_9.2 播放背景音乐_师傅带徒弟学:Python视频课程之游戏开发引擎Cocos2d-Python_Python视频-51CTO学院...

热门文章

  1. 【pngquant】使用Python压缩图片,降低网页加载时间
  2. C实现SSDP协议的设备发现及设备搜索
  3. linux下最大连接数
  4. Soul源码分析–soul-admin入门
  5. 哈希碰撞攻击与防范机制
  6. 加载本地gradle配置
  7. 机器学习中三个典型的非线性函数
  8. PIXHAWK飞机侧翻原因
  9. 朋友,请不要轻易秀恩爱
  10. 电动吸吮式自动清洗过滤器