使用JAVA运行SQL

一、配置环境

配置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数据类型相互兼容,因此不用太过于担心数据类型的问题;
OracleJAVE
CHARString
VARCHAR2String
DATAjava.sql.Data、java.sql.Time、java.sql.Timestamp
INTEGERshort int long
NUMBERfloat 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数据库的借口;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值