使用JAVA运行SQL

您所在的位置:网站首页 java中sql语句怎么写 使用JAVA运行SQL

使用JAVA运行SQL

2023-12-04 16:02| 来源: 网络整理| 查看: 265

一、配置环境

配置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数据类型相互兼容,因此不用太过于担心数据类型的问题; OracleJAVECHARStringVARCHAR2StringDATAjava.sql.Data、java.sql.Time、java.sql.TimestampINTEGERshort int longNUMBERfloat 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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3