使用JAVA运行SQL
一、配置环境
配置jdbc驱动包:如Oracle数据库,在其安装目录下:D:\app\OracleRoot\product\12.2.0\dbhome_1\jdbc\lib
- 在java工程下建立一个文件夹,可以命名为lib,
- 将jdbc驱动包放到该文件夹中
- 在ecslipe或者其他IDE中将该驱动包(ojdbc8.jar)添加到编译路径中(Add Build Path);
- 新建包,在包中新建类即可;
配置完毕;
二、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相关推荐
- java jdbc脚本_关于java:使用MySQL和JDBC运行.sql脚本
我开始使用MySQL和JDBC. Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnectio ...
- .java 运行文件暗掉_Eclipse的暗色方案[关闭]
回答(20) 2 years ago 已经发布了一些相关问题,我正在开发一个简单的交叉编辑器颜色主题管理插件: 它仍在进行中,但已经支持许多编辑器和一些暗色主题 . 2 years ago 我已经创建 ...
- JAVA运行时异常及检查式异常
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- jooq sql_用jOOQ用Java编写SQL
jooq sql jOOQ是"数据库优先"类型的安全SQL API,使您可以直观地用Java编写SQL,就像Java编译器本身支持SQL语言一样. 所有数据库模式,表,列,过程和其 ...
- 用jOOQ用Java编写SQL
jOOQ是"数据库优先"的类型安全的SQL API,使您可以直观地用Java编写SQL,就像Java编译器本身支持SQL语言一样. 所有数据库模式,表,列,过程和其他对象均作为Ja ...
- java sql server连接字符串_关于Java:SQL Server的等效jdbc连接字符串
我目前正在使用以下连接字符串连接到数据库(该数据库与ServerIP在同一服务器上): String constr ="Data Source=ServerIP,1433;Network L ...
- java 防止sql注入_Java中SQL注入以及如何轻松防止它
java 防止sql注入 什么是SQL注入? (What is SQL Injection?) SQL Injection is one of the top 10 web application v ...
- 数据库运行sql文件
sql数据库文件',点击'开始'.navicat是一套快速.可靠并价格相当便宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设.它的设计符合数据库管理员.开发人员及中小企业的需要.navi ...
- 【java毕业设计】基于java+Eclipse +SQL Server的工厂进销存管理系统设计与实现(毕业论文+程序源码)——工厂进销存管理系统
基于java+Eclipse +SQL Server的工厂进销存管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Eclipse +SQL Server的工厂进销存管理系统 ...
最新文章
- 用 .NET Memory Profiler 跟踪.net 应用内存使用情况--基本应用篇
- Gartner:2019十大战略技术趋势
- IntelliJ IDEA 的 project 和 module 区别与关系
- 金融反欺诈和金融构建信用评分或者金融预测特征抽取案例
- [云炬创业基础笔记]第四章测试24
- 精通jQuery选择器使用 转一篇
- p50会搭载鸿蒙吗,华为Mate40和华为P50也会搭载鸿蒙,华为Mate30跌至白菜价让路
- 为什么“how to say”是错的?
- 通过layout进行适配遇到的一点小问题及解决方案
- gitee提交突然报错remote: Incorrect username or password ( access token )
- ERP项目实施记录02
- php可以在dw中吗,php新手求助,为什么在DW中设计里能看到运行php程序的结果,但…...
- Python XML读写(xml.etree.ElementTree模块)(转载)
- 美国卡内基梅隆大学计算机排名,美国卡内基梅隆大学世界排名情况
- C# Form窗体显示不完整
- C#编程,DateTime使用方法,时间转字符方法总结
- doctrine-orm基础(单用doctrine避坑指南)
- js打印线程id_泥瓦匠聊并发编程:线程与多线程必知必会(基础篇)
- 邀请码:20111221235047_092555,有效期至2011-12-21 23:50:45
- python游戏背景音乐循环播放_9.2 播放背景音乐_师傅带徒弟学:Python视频课程之游戏开发引擎Cocos2d-Python_Python视频-51CTO学院...