Java實現Oracle連接的DbHelper及相關異常
Java中使用DbHeplper來連接Oracle數據庫時,一般可以分爲以下幾個步驟:
第一步,導入sql包;
第二步,將Oracle中的Java驅動包添加到項目下,並生成路徑,Java驅動包存放在路徑:F:\oracle\product\10.2.0\db_1\jdbc\lib之下;
第三步,加載驅動;
第四步,使用驅動管理器獲取數據庫連接對象;
第五步,編寫sql語句(事先在數據庫中編譯通過的正確的sql語句);
第六步,創建語句對象;
第七步,執行sql語句,返回ResultSet結果集對象;
第八步,關閉對象,Connection,PreparedStatement,ResultSet。
代碼如下:
package jdbcDemo1;
/**
* jdbc
* @author 阿達
*
*/
//第一步 導入SQL包
import java.sql.*;
public class Test1 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//第二步:將驅動包放到項目下
//第三步:加載驅動
Class.forName("oracle.jdbc.driver.OracleDriver");
//第四步 :驅動管理器獲取數據庫連接對象
//url:數據庫服務器地址:jdbc:oracle:thin:@主機IP:數據庫端口:數據庫實例
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "a");
//測試:是否獲取到連接對象
System.out.println(conn.getClass().getName());
//第五步:編寫SQL語句
String sql="select * from emp";
//第六步:創建語句對象(將 SQL 語句發送到數據庫)
Statement stmt=conn.createStatement();
//第七步:執行sql語句,返回ResultSet結果集對象
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()){//判斷下一行是否有數據
System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.getInt(4)+"\t");
//如果SQL語句中的字段順序發生改變,則需要對結果集進行重新編號
}
//第七步:關閉流對象,釋放內存
//關閉對象
//關閉結果集對象
rs.close();
//關閉語句對象
stmt.close();
//關閉連接對象;
conn.close();
}
}
常見異常有:
1.java.sql.SQLException: Io 異常: The Network Adapter could not establish the connection
原因:Oralce數據庫的主服務和監聽服務沒有開啓,在服務中開啓OracleServiceORCL和OracleOraDb10g_home1TNSListener服務即可。
2." java.lang.ClassNotFoundException: oracle.jdbc.driver.OarcleDriver
原因:1.沒有將驅動包放到項目下 2.Class 類中的 forName 方法出錯。
3. java.sql.SQLException: No suitable driver found for jdbc:orale:thin:@127.0.0.1:1521:orcl
原因:驅動管理器獲取數據庫連接對象出錯,正確應爲:jdbc:oracle:thin:@127.0.0.1:1521:orcl。
4.ExceptionInInitializerError
原因:forName方法所激發的初始化失敗
5.java.sql.SQLException: ORA-00900: 無效 SQL 語句
原因:SQL 語句不正確,建議sql語句先在Oracle中運行無誤後再寫入代碼中。
附:爲了便於平時的使用,我們可以對DbHelper進行封裝處理.首先創建一個db.properties文件存儲的驅動信息和數據庫連接對象時所要使用到的信息,
再自定義一個單例模式的MyProperties類繼承Properties,調用db.properties中存儲的驅動信息和數據庫連接對象時所要使用到的信息。最後DbHelper調用MyProperties獲取所需信息。
MyProperties.java的代碼如下:
package jdbcDemo2;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 自定義MyProperties類繼承Properties,當前類擁有Properties公共屬性和方法
* @author 阿達
* 整個系統只需要創建一個對象
* 設計成單例模式
*/
public class MyProperties extends Properties{
private static MyProperties myProperties ;
private MyProperties() throws IOException{
InputStream in=MyProperties.class.getClassLoader().getResourceAsStream("jdbcDemo2/db.properties");
this.load(in); //從輸入流中讀取屬性列表(鍵和元素對)
}
public static MyProperties getInstance() throws IOException {
if(null==myProperties){
myProperties=new MyProperties();
}
return myProperties;
}
}
db.properties的代碼如下:
driverName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
user=scott
password=a
DbHelper.java的代碼如下:
package jdbcDemo2;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DbHelper4 {
private Connection conn=null;
private PreparedStatement pstmt=null;
private ResultSet rs=null;
//加載驅動
static{
try {
Class.forName(MyProperties.getInstance().getProperty("driverName"));
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//獲取數據庫連接對象
public Connection getConn(){
try {
//getConnection(url,properties)
conn=DriverManager.getConnection(MyProperties.getInstance().getProperty("url"),MyProperties.getInstance() );
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
// 關閉對象
public void closeAll(Connection conn,PreparedStatement pstmt,ResultSet rs){
if(null!=rs){//關閉結果集
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(null!=pstmt){//關閉語句對象
try {
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(null!=conn){//關閉連接對象
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/*
* 設置參數
* @param pstmt 預編譯對象
* @param params 外部傳入的參數值 添加值時順序一樣要和?對應值得順序一致
*
*/
public void setparams(PreparedStatement pstmt,List<Object> params) throws SQLException{
if(null!=params&¶ms.size()>0){
for(int i=0;i<params.size();i++){
pstmt.setObject(i+1, params.get(i));//設置?值
}
}
}
//獲取結果集中的所有列表
private List<String> getAllColumnName(ResultSet rs2) throws SQLException {
// TODO Auto-generated method stub
List<String> columnNames=new ArrayList<String>();
ResultSetMetaData dd=rs.getMetaData();
for(int i=1;i<=dd.getColumnCount();i++){
columnNames.add(dd.getColumnName(i));
}
return columnNames;
}
// 查看操作:sql語句可以查看多條記錄
public List<Map<String,Object>> findMultObject(String sql,List<Object>params) throws SQLException{
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
Map<String,Object> map=null;
try {
conn=this.getConn();
pstmt=conn.prepareStatement(sql);
this.setparams(pstmt, params);
rs=pstmt.executeQuery();
//獲取結果集中的所有列名
List<String> columnNames=getAllColumnName(rs);
while(rs.next()){
map=new HashMap<String,Object>();
for(String name:columnNames){
map.put(name, rs.getObject(name));
}
list.add(map);
}
} finally {
this.closeAll(conn, pstmt, rs);
}
return list;
}
//查詢操作,select * from emp where id=? 只有一條結果
public Map<String,Object> findSingleOBject(String sql,List<Object> params) throws SQLException{
Map<String,Object> map=null;
try {
conn=this.getConn();
pstmt=conn.prepareStatement(sql);
this.setparams(pstmt, params);
rs=pstmt.executeQuery();
//獲取結果集中的所有列名
List<String> columnNames=getAllColumnName(rs);
if(rs.next()){
map=new HashMap<String,Object>();
for(String name:columnNames){
map.put(name, rs.getObject(name));
}
}
} finally {
// TODO: handle finally clause
this.closeAll(conn, pstmt, rs);
}
return map;
}
//單條sql語句 更新操作:增 刪 改
public int doUpdate(String sql,List<Object> params) throws SQLException{
int result=0;
try {
conn=this.getConn();
pstmt=conn.prepareStatement(sql);
//設置參數
this.setparams(pstmt, params);
result =pstmt.executeUpdate();
} finally {
// TODO: handle finally clause
this.closeAll(conn, pstmt, null);
}
return result;
}
/**
* 多條語句的更新操作 批處理 注意:這些sql語句執行的結果要麼一起成功要麼一起失敗
* @param sqls
* @param params 對應每一條sql語句所需要的參數集合
* @return
* @throws SQLException
*/
public int doUpdate(List<String> sqls,List<List<Object>> params) throws SQLException{
int result=0;
try {
conn=this.getConn();
//設置事物提交方式爲手動提交
conn.setAutoCommit(false);
if(null!=sqls&&sqls.size()>0){
//對sql語句進行循環
for(int i=0;i<sqls.size();i++){
String sql=sqls.get(i);
pstmt=conn.prepareStatement(sql);
this.setparams(pstmt, params.get(i));//第幾條sql語句對應list集合中的第一個list
result=pstmt.executeUpdate();
}
}
conn.commit();//手動提交事物
} catch (Exception e) {
// TODO: handle exception
conn.rollback();//事物回滾
}finally{
conn.setAutoCommit(true);//回覆事物
this.closeAll(conn, pstmt, rs);
}
return result;
}
//聚合函數
public double getCount(String sql,List<Object>params) throws SQLException{
double result=0;
try {
conn=this.getConn();
pstmt=conn.prepareStatement(sql);
setparams(pstmt,params);
rs=pstmt.executeQuery();
if(rs.next()){
result=rs.getDouble(1); //獲取第一列的值
}
} finally {
// TODO: handle finally clause
this.closeAll(conn, pstmt, rs);
}
return result;
}
}
第一步,導入sql包;
第二步,將Oracle中的Java驅動包添加到項目下,並生成路徑,Java驅動包存放在路徑:F:\oracle\product\10.2.0\db_1\jdbc\lib之下;
第三步,加載驅動;
第四步,使用驅動管理器獲取數據庫連接對象;
第五步,編寫sql語句(事先在數據庫中編譯通過的正確的sql語句);
第六步,創建語句對象;
第七步,執行sql語句,返回ResultSet結果集對象;
第八步,關閉對象,Connection,PreparedStatement,ResultSet。
代碼如下:
package jdbcDemo1;
/**
* jdbc
* @author 阿達
*
*/
//第一步 導入SQL包
import java.sql.*;
public class Test1 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//第二步:將驅動包放到項目下
//第三步:加載驅動
Class.forName("oracle.jdbc.driver.OracleDriver");
//第四步 :驅動管理器獲取數據庫連接對象
//url:數據庫服務器地址:jdbc:oracle:thin:@主機IP:數據庫端口:數據庫實例
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "a");
//測試:是否獲取到連接對象
System.out.println(conn.getClass().getName());
//第五步:編寫SQL語句
String sql="select * from emp";
//第六步:創建語句對象(將 SQL 語句發送到數據庫)
Statement stmt=conn.createStatement();
//第七步:執行sql語句,返回ResultSet結果集對象
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()){//判斷下一行是否有數據
System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.getInt(4)+"\t");
//如果SQL語句中的字段順序發生改變,則需要對結果集進行重新編號
}
//第七步:關閉流對象,釋放內存
//關閉對象
//關閉結果集對象
rs.close();
//關閉語句對象
stmt.close();
//關閉連接對象;
conn.close();
}
}
常見異常有:
1.java.sql.SQLException: Io 異常: The Network Adapter could not establish the connection
原因:Oralce數據庫的主服務和監聽服務沒有開啓,在服務中開啓OracleServiceORCL和OracleOraDb10g_home1TNSListener服務即可。
2." java.lang.ClassNotFoundException: oracle.jdbc.driver.OarcleDriver
原因:1.沒有將驅動包放到項目下 2.Class 類中的 forName 方法出錯。
3. java.sql.SQLException: No suitable driver found for jdbc:orale:thin:@127.0.0.1:1521:orcl
原因:驅動管理器獲取數據庫連接對象出錯,正確應爲:jdbc:oracle:thin:@127.0.0.1:1521:orcl。
4.ExceptionInInitializerError
原因:forName方法所激發的初始化失敗
5.java.sql.SQLException: ORA-00900: 無效 SQL 語句
原因:SQL 語句不正確,建議sql語句先在Oracle中運行無誤後再寫入代碼中。
附:爲了便於平時的使用,我們可以對DbHelper進行封裝處理.首先創建一個db.properties文件存儲的驅動信息和數據庫連接對象時所要使用到的信息,
再自定義一個單例模式的MyProperties類繼承Properties,調用db.properties中存儲的驅動信息和數據庫連接對象時所要使用到的信息。最後DbHelper調用MyProperties獲取所需信息。
MyProperties.java的代碼如下:
package jdbcDemo2;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 自定義MyProperties類繼承Properties,當前類擁有Properties公共屬性和方法
* @author 阿達
* 整個系統只需要創建一個對象
* 設計成單例模式
*/
public class MyProperties extends Properties{
private static MyProperties myProperties ;
private MyProperties() throws IOException{
InputStream in=MyProperties.class.getClassLoader().getResourceAsStream("jdbcDemo2/db.properties");
this.load(in); //從輸入流中讀取屬性列表(鍵和元素對)
}
public static MyProperties getInstance() throws IOException {
if(null==myProperties){
myProperties=new MyProperties();
}
return myProperties;
}
}
db.properties的代碼如下:
driverName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
user=scott
password=a
DbHelper.java的代碼如下:
package jdbcDemo2;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DbHelper4 {
private Connection conn=null;
private PreparedStatement pstmt=null;
private ResultSet rs=null;
//加載驅動
static{
try {
Class.forName(MyProperties.getInstance().getProperty("driverName"));
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//獲取數據庫連接對象
public Connection getConn(){
try {
//getConnection(url,properties)
conn=DriverManager.getConnection(MyProperties.getInstance().getProperty("url"),MyProperties.getInstance() );
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
// 關閉對象
public void closeAll(Connection conn,PreparedStatement pstmt,ResultSet rs){
if(null!=rs){//關閉結果集
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(null!=pstmt){//關閉語句對象
try {
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(null!=conn){//關閉連接對象
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/*
* 設置參數
* @param pstmt 預編譯對象
* @param params 外部傳入的參數值 添加值時順序一樣要和?對應值得順序一致
*
*/
public void setparams(PreparedStatement pstmt,List<Object> params) throws SQLException{
if(null!=params&¶ms.size()>0){
for(int i=0;i<params.size();i++){
pstmt.setObject(i+1, params.get(i));//設置?值
}
}
}
//獲取結果集中的所有列表
private List<String> getAllColumnName(ResultSet rs2) throws SQLException {
// TODO Auto-generated method stub
List<String> columnNames=new ArrayList<String>();
ResultSetMetaData dd=rs.getMetaData();
for(int i=1;i<=dd.getColumnCount();i++){
columnNames.add(dd.getColumnName(i));
}
return columnNames;
}
// 查看操作:sql語句可以查看多條記錄
public List<Map<String,Object>> findMultObject(String sql,List<Object>params) throws SQLException{
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
Map<String,Object> map=null;
try {
conn=this.getConn();
pstmt=conn.prepareStatement(sql);
this.setparams(pstmt, params);
rs=pstmt.executeQuery();
//獲取結果集中的所有列名
List<String> columnNames=getAllColumnName(rs);
while(rs.next()){
map=new HashMap<String,Object>();
for(String name:columnNames){
map.put(name, rs.getObject(name));
}
list.add(map);
}
} finally {
this.closeAll(conn, pstmt, rs);
}
return list;
}
//查詢操作,select * from emp where id=? 只有一條結果
public Map<String,Object> findSingleOBject(String sql,List<Object> params) throws SQLException{
Map<String,Object> map=null;
try {
conn=this.getConn();
pstmt=conn.prepareStatement(sql);
this.setparams(pstmt, params);
rs=pstmt.executeQuery();
//獲取結果集中的所有列名
List<String> columnNames=getAllColumnName(rs);
if(rs.next()){
map=new HashMap<String,Object>();
for(String name:columnNames){
map.put(name, rs.getObject(name));
}
}
} finally {
// TODO: handle finally clause
this.closeAll(conn, pstmt, rs);
}
return map;
}
//單條sql語句 更新操作:增 刪 改
public int doUpdate(String sql,List<Object> params) throws SQLException{
int result=0;
try {
conn=this.getConn();
pstmt=conn.prepareStatement(sql);
//設置參數
this.setparams(pstmt, params);
result =pstmt.executeUpdate();
} finally {
// TODO: handle finally clause
this.closeAll(conn, pstmt, null);
}
return result;
}
/**
* 多條語句的更新操作 批處理 注意:這些sql語句執行的結果要麼一起成功要麼一起失敗
* @param sqls
* @param params 對應每一條sql語句所需要的參數集合
* @return
* @throws SQLException
*/
public int doUpdate(List<String> sqls,List<List<Object>> params) throws SQLException{
int result=0;
try {
conn=this.getConn();
//設置事物提交方式爲手動提交
conn.setAutoCommit(false);
if(null!=sqls&&sqls.size()>0){
//對sql語句進行循環
for(int i=0;i<sqls.size();i++){
String sql=sqls.get(i);
pstmt=conn.prepareStatement(sql);
this.setparams(pstmt, params.get(i));//第幾條sql語句對應list集合中的第一個list
result=pstmt.executeUpdate();
}
}
conn.commit();//手動提交事物
} catch (Exception e) {
// TODO: handle exception
conn.rollback();//事物回滾
}finally{
conn.setAutoCommit(true);//回覆事物
this.closeAll(conn, pstmt, rs);
}
return result;
}
//聚合函數
public double getCount(String sql,List<Object>params) throws SQLException{
double result=0;
try {
conn=this.getConn();
pstmt=conn.prepareStatement(sql);
setparams(pstmt,params);
rs=pstmt.executeQuery();
if(rs.next()){
result=rs.getDouble(1); //獲取第一列的值
}
} finally {
// TODO: handle finally clause
this.closeAll(conn, pstmt, rs);
}
return result;
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.