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&&params.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;

    }    

}

标签