Java连接Oracle数据库及封装JDBC
Java连接Oracle数据库及封装JDBC
如果你点开看到了这篇文章,说明你已经或多或少地通过学校学习亦或是自学了解了 oracle 数据库的基本用法。但是实际在开发程序的时候,我们是不可能手动地去操作sql语句的,而是由程序去调用。这个时候,就需要使用上编程语言了。本文主要介绍的是Java连接数据库的技术 —— JDBC。
文章目录
一、JDBC???
JDBC的全称是Java Data Base Connectivity, Java与各大数据库相连接都是使用这门技术。各种数据库的API各不相同,Java是如何实现统一的呢?这是因为sun公司制定了一套标准,各大数据库厂商依据这个标准开发出数据库驱动程序。我们只需要使用这些驱动即可操作数据库。
在oracle安装目录之下可以找到这些驱动程序
那么多个驱动程序,该选择哪个?
Oracle版本 | jdk版本 | 推荐jar包 | 备注 |
---|---|---|---|
Oracle 8i | JDK 1.1.x | classes111.zip | |
Oracle 8i | JDK 1.1.x | classes12.zip | |
Oracle 9i | JDK 1.1.x | classes111.jar或者 classes111.zip | |
Oracle 9i | JDK 1.2 and JDK 1.3 | classes12.jar 或者 classes12.zip | |
Oracle 9i | JDK 1.4 | ojdbc14.jar | |
Oracle 9i | JDK 1.5 | ojdbc5.jar | |
Oracle 9i | JDK 1.6 | ojdbc6.jar | |
Oracle 10g | JDK 1.2 and JDK 1.3. | classes12.jar | |
Oracle 10g | JDK 1.4 and 5.0 | ojdbc14.jar | |
Oracle 11g | jdk5 | ojdbc5.jar | |
Oracle 11g | jdk6 | ojdbc6.jar |
按照oracle版本和jdk版本选择,这里的表格仅作参考。
二、连接!!!
说的太多也没用,直接上一段程序体验一下。只需要准备一个IDE(eclipse、IDEA等)和上面所说的驱动程序即可。
创建项目
首先,创建一个普通的Java项目,引入jar包。(我这里是放在了jbdc_oracle目录下)最后把鼠标移到ojdbc.jar,右键,bulild path,add to build path。
IDEA创建的项目同理(Add to libary),会使用Maven的也可以创建Maven项目,在pom文件引入依赖即可。
编写代码
import java.sql.*;
public class Main {
public static void main(String[] args) {
try {
// 1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2.获取连接
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//127.0.0.1:1521/orcl","scott","tiger");
System.out.println(connection.getMetaData());
// 3.创建Statement对象(可以执行sql的对象)
PreparedStatement preparedStatement = connection.prepareStatement("select * from dept");
// 4.获取结果集
ResultSet resultSet = preparedStatement.executeQuery();
// 5.对数据进行处理
while(resultSet.next()) {
Integer id = resultSet.getInt("DEPTNO");
String dname = resultSet.getString("DNAME");
String location = resultSet.getString("LOC");
System.out.println(id+" "+dname+" "+location);
}
// 6.关闭连接 先调用的最后关闭 关闭前判断是否存在
if(resultSet != null) {
resultSet.close();
}
if(preparedStatement != null) {
preparedStatement.close();
}
if(connection != null) {
connection.close();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
接下来对以上代码进行一一说明
-
加载驱动,这里是固定写法,包名不要写错
Class.forName("oracle.jdbc.driver.OracleDriver");
其实写法不止这一种,只是比较推荐这种。感兴趣的可以看看官方的写法:
-
获取连接
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//127.0.0.1:1521/orcl","scott","tiger");
getConnection()里面的三个参数分别是url地址,用户名和密码
jdbc:oracle:thin:固定写法,其中thin表示连接数据库的一种方式,想进一步了解的话,文末有参考地址
127.0.0.1:ip地址,这里表示本机
1521:oracle的端口地址,一般安装后默认为1521
orcl:数据库的实例名称,一般安装后默认有一个orcl
JDBC常见的对象
注:以下方法都省略了函数的参数
Connection
意如其名,就是表示数据库和Java之间的一个连接,所有的数据库操作都与其密切相关。
prepareStatement();//PreparedStatement对象
createStatement();//Statement对象
commit(); //提交
rollback(); //回滚
prepareCall(); //存储过程
Statement
executeQuery(); //查询,返回ResultSet
executeUpdate(); //增加、删除、更新,返回受影响的行数
/* @return <code>true</code> if the first result is a <code>ResultSet</code>
* object; <code>false</code> if it is an update count or there are
* no results
*/
execute();//增删改查都可以进行,不建议使用
PreparedStatement
PreparedStatement是Statement的子类,PreparedStatement对象可以对sql语句进行预编译,并且可以通过占位符的方式方便我们进行参数的拼接:
PreparedStatement preparedStatement = connection.prepareStatement("select * from dept where deptno=?");
preparedStatement.setInt(1,10); //int对应deptno的类型,1代表第1个问号,
ResultSet
查询后获得的结果集
getXXX(数据库的列名/第几列) //其中XXX可以是Int,Array,Boolean等
/*
第几列对应的是sql中的第几列,
如select deptno,loc,dname from dept;
写法:getInt(1) / getInt("deptno")
select loc,dname,deptno from dept;
写法:getInt(3) / getInt("deptno");
这几个对象多调用几次就知道如何使用了,总的使用流程是
连接数据库(获取Connection对象) -> 创建Statement对象(Statement/PreparedStatement) -> 用Statement对象执行语句(execute/executeUpdate/executeQuery) -> 利用返回值(execute返回true/false,executeUpdate返回受影响行数,executeQuery返回ResultSet)判断执行的结果 -> 关闭对象
多多使用就对了!
三、封装
仅供参考,建议先熟悉以上操作后再根据实际情况使用。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtil {
private final static String DRIVER = "oracle.jdbc.driver.OracleDriver";
private final static String URL = "jdbc:oracle:thin:@//127.0.0.1:1521/orcl";
private final static String USERNAME = "scott";
private final static String PWD = "tiger";
public static Connection connection = null;
static Statement stmt = null;
public static PreparedStatement pstmt = null;
private static ResultSet rs;
static {
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//单例模式返回数据库连接对象
public static Connection getConnection() throws Exception
{
if(connection==null)
{
connection = DriverManager.getConnection(URL, USERNAME,PWD);
return connection;
}
return connection;
}
public static Statement getStatement() throws Exception {
Connection conn = getConnection();
try {
if(conn!=null) {
stmt = conn.createStatement();
}
}catch(Exception e) {
e.printStackTrace();
}
return stmt;
}
//查询总数
public static int getTotalCount(String sql) { //select count(1) from student
int count = -1 ;
try {
pstmt = createPreParedStatement(sql, null );
rs = pstmt.executeQuery() ;//88
if(rs.next()) {
count = rs.getInt(1) ;
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}finally {
closeAll(rs, pstmt, connection);
}
return count;
}
//通用的增删改
public static boolean executeUpdate(String sql,Object[] params) {//{"zs",1}
try {
pstmt = createPreParedStatement(sql,params);
int count = pstmt.executeUpdate() ;
if(count>0)
return true ;
else
return false ;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return false ;
} catch (SQLException e) {
e.printStackTrace();
return false ;
}catch (Exception e) {
e.printStackTrace();
return false ;
}
finally {
closeAll(null,pstmt,connection);
}
}
//Statement
public static void closeAll(ResultSet rs,Statement stmt,Connection connection)
{
try {
if(rs!=null)rs.close();
if(pstmt!=null)pstmt.close();
if(connection!=null)connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static PreparedStatement createPreParedStatement(String sql,Object[] params) throws Exception {
pstmt = getConnection() .prepareStatement(sql) ;
if(params!=null ) {
for(int i=0;i<params.length;i++) {
pstmt.setObject(i+1, params[i]);
}
}
return pstmt;
}
//通用的查:通用表示适合于 任何查询
public static ResultSet executeQuery(String sql,Object[] params) {
try {
pstmt = createPreParedStatement(sql,params);
rs = pstmt.executeQuery() ;
return rs ;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null ;
} catch (SQLException e) {
e.printStackTrace();
return null ;
}catch (Exception e) {
e.printStackTrace();
return null ;
}
}
}
使用示例
public class Main {
public static void main(String[] args) throws SQLException {
// 查询示例1
ResultSet rs1 = DBUtil.executeQuery("select * from dept where deptno = ?", new Object[] {10});
if(rs1.next()) {
System.out.println(rs1.getInt(1)+" "+rs1.getString(2)+" "+rs1.getString(3));
}
// 更新示例1
boolean rs2 = DBUtil.executeUpdate("update dept set loc = ? where deptno = ?", new Object[] {"Japan",10});
if(rs2) {
System.out.println("更新成功!");
}
}
}
参考资料:
上一篇: CSS笔记1
下一篇: WinXP系统电脑该如何启用光标浏览功能