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;
    }    
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值