java与数据库oracle连接学习之jdbc(6)改进读取信息的方法

15 篇文章 0 订阅
12 篇文章 0 订阅

公共类

package com.librarySystem;

import java.sql.*;

/**
 * JDBC的工具类:
 * 加载驱动:只需要加载一次
 * 建立连接:
 * 释放资源:
 */

public class JDBCUTILS {
    private static final String DRIVER = "oracle.jdbc.OracleDriver";
    // 主机地址 连接本机 localhost  或者127.0.0.1
    // 端口号 Oracle 数据库默认端口号 1521
    // 实例名 安装全的是orcl,没有安装全的是XE
    private static String URL = "jdbc:oracle:thin:@localhost:1521:orcl";   // jdbc:oracle:thin: @主机地址 :  端口号 : 实例名
    private static String USER = "cc";
    private static String PASSWORD = "ccpassword";
    static {//因为驱动只需要加载一次,所以在静态语句中进行
        try {
            Class.forName(DRIVER);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    /**
     *建立与数据库的连接
     * @return 连接好的连接
     */
    public static Connection getConnection(){
        try {
            Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
           return  connection;
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return null;
    }

    /**
     * 释放资源
     * @param resultSet 结果集
     * @param statement 语句对象
     * @param connection 连接
     */
    public static void close(ResultSet resultSet, Statement statement, Connection connection){//查询时
        try
        {
            if (resultSet != null && !resultSet.isClosed())
                resultSet.close();
        }
        catch(SQLException ex)
        {
            ex.printStackTrace();
        }
        finally
        {
            try
            {
                if (statement != null && !statement.isClosed())
                    statement.close();
            }
            catch (SQLException ex)
            {
                ex.printStackTrace();
            }
            finally
            {
                try
                {
                    if (connection != null && !connection.isClosed())
                        connection.close();
                }
                catch(SQLException ex)
                {
                    ex.printStackTrace();;
                }
            }
        }
    }

    /**
     * 释放资源
     * @param statement 语句对象
     * @param connection 连接
     */
    public static void close(Statement statement, Connection connection){//增删改
        close(null,statement,connection);
    }
}

改进读取的公共类

package com.librarySystem;

import java.sql.*;
import java.util.*;

/**
 * 通用的DAO,可以对任意表做增删改
 */
public     class CommonDao<T> extends JDBCUTILS {
    /**
     * 对任意表做增删改,根据增删改的字符串或数字不同操作
     * @return
     */

    public static int executeUpdate(String sql,Object ...params){
        Connection conn =null;
        PreparedStatement preparedStatement =null;
        int i=0;
        try {
            //获取连接
            conn = getConnection();
            //创建语句对象
            preparedStatement = conn.prepareStatement(sql);
            if(params!=null && params.length>0){//判断需要占位符
                for(int j=0;j<params.length;j++){
                    //设置占位符
                    preparedStatement.setObject(j+1,params[j]);
                }
            }
             i = preparedStatement.executeUpdate();//成功为1
        }catch(SQLException e){
            e.printStackTrace();
        }finally {//释放资源
            close(preparedStatement,conn);
        }
        return i;
    }

    public List<Map<String,Object>> queryBeenList(String sql, Object ...paramas){
        Connection connection=null;
        PreparedStatement preparedStatement=null;
        ResultSet resultSet=null;
        List<Map<String,Object>>lst =new ArrayList<>();
        Map<String,Object>map =null;
        try{
            //获取连接
            connection = getConnection();
            //创建语句对象
            preparedStatement = connection.prepareStatement(sql);
            if(paramas!=null&&paramas.length>0){//需要设置占位符
                for(int i=0;i<paramas.length;i++){
                    preparedStatement.setObject(i+1,paramas[i]);
                }
            }
            //执行SQL语句
            resultSet = preparedStatement.executeQuery();
            //处理结果集
            //通过metaData获取元数据个数
            ResultSetMetaData resultSetMetaData =resultSet.getMetaData();
            int columnCont = resultSetMetaData.getColumnCount();
            String[]columnNames =new String[columnCont];//元数据名称数组
            for(int i=0;i<columnCont;i++){
                columnNames[i]=resultSetMetaData.getColumnName(i+1);
            }
            while(resultSet.next()){
                map =new HashMap<>();
                for(int i=0;i<columnCont;i++){
                    String columnName = columnNames[i];
                    map.put(columnNames[i],resultSet.getObject(columnName));
                }
                lst.add(map);
            }
        }
        catch(SQLException e){
            e.printStackTrace();
        }
        finally {
           close(resultSet,preparedStatement,connection);
        }
        return lst;
    }

    public Map<String,Object> queryBeen(String sql,Object ...params){
       List< Map<String,Object>>lst= queryBeenList(sql,params);
       if(lst.size()>0){
           return lst.get(0);
       }
       return null;
    }

}

实验类

//学习链接: https://www.bilibili.com/video/BV14E411Q7wJ?p=2
package com.librarySystem;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

class Reader {
    private String rno;
    private String rname;
    private String rsex;
    private int rage;
    private String rboss;
    private String raddress;

    public String getRno() {
        return rno;
    }

    public String getRname() {
        return rname;
    }

    public String getRsex() {
        return rsex;
    }

    public int getRage() {
        return rage;
    }

    public String getRaddress() {
        return raddress;
    }

    public String getRboss() {
        return rboss;
    }

    public void setRno(String rno) {
        this.rno = rno;
    }

    public void setRname(String rname) {
        this.rname = rname;
    }

    public void setRsex(String rsex) {
        this.rsex = rsex;
    }

    public void setRage(int rage) {
        this.rage = rage;
    }

    public void setRboss(String rboss) {
        this.rboss = rboss;
    }

    public void setRaddress(String raddress) {
        this.raddress = raddress;
    }

    public String toString() {
        return rno + " " + rname + " " + rsex + " " + rage + " " + rboss + " " + raddress;
    }
}

public class ConnnectDatabase extends CommonDao<Reader> {
    /**
     * 查询数据库中资源对象
     *
     * @return 对象集合
     */

    public static int doInsert(Reader reader) {
        String sql = "Insert into reader values('R011','George','男',?,null,?)";
        return executeUpdate(sql, reader.getRage(), reader.getRaddress());
    }

    public static int doDelete(String rno) {
        String sql = "Delete from reader where rno=?";
        return executeUpdate(sql, rno);
    }

    public static int doUpdate(Reader reader) {
        String sql = "Update reader set rname=?,rage=? where rno=?";
        return executeUpdate(sql, reader.getRname(), reader.getRage(), reader.getRno());
    }

    public static void main(String args[])
    {
        Map<String,Object>map = new ConnnectDatabase().queryByRno("R001");
        System.out.println(map);
    }


    public List<Map<String,Object>> queryAll() {
        String sql = "Select * from reader";
        return queryBeenList(sql);
    }

    public Map<String,Object>queryByRno(String rno) {
        String sql = "Select * from reader where rno=?";
        return queryBeen(sql, rno);
    }
}



/*
遍历列表
List<Reader> lst = queryALL();
        Iterator<Reader>it = lst.iterator();
        String tmp =null;
        while(it.hasNext()){
            tmp = ((Reader)it.next()).rname;
            System.out.println(tmp);
        }

 queryALL().forEach(str->
                {System.out.println(str);});
 */
Oracle官方11g 最新版jdbc驱动。 新特性:   1、支持JDK6,支持JDBC 4.0,新的java.sql.SQLXML类型没有被支持,是使用ojdbc6.jar来支持。J2SE 5.0 和 JDBC 3.0 全面支持使用ojdbc5.jar。   2.不再支持oracle.jdbc.driver。从9.0.1开始的每个release都推荐使用oracle.jdbc。这一天终于到来,在11g中,引用oracle.jdbc.driver不再通过编译。   3.j2se 1.2,1.3,1.4不再支持。11R1不再包括这些版本的jar和zip,如果仍然使用这些版本,可以继续使用10gR2的jdbc。   4.11gR1 Thin driver支持AES加密算法,SHA1 hash算法,RADIUS, KERBEROS,SSL认证机制.   5.支持ANYDATE和ANYTYPE类型。这两种类型自9i引入,11R1前,程序员只能通过PL/SQL操作。   6.高级队列支持。11R1提供了访问AQ的高性能接口。   7.支持数据库变更通知。   8.Thin和OCI的数据库启动和关闭。11R1提供了这样的方法来启动和关闭数据库。   9.新的工厂方法Oracle JDBC 11R1 oracle.jdbc.OracleConnection提供了创建Oracle对象的工厂方法。   包括ARRAY, BFILE, DATE, INTERVALDS, NUMBER, STRUCT, TIME,TIMESTAMP,TIMESTAMP等。   ojdbc5.jar: 适用于jdk5   ojdbc6.jar: 适用于jdk6   ***_g.jar 只是用javac -g编译,生成所有调试信息,其它全一样   ---------------------------------------------------   总体讲新版本的JDBC驱动 性能强、很多bug被发现并已解决。   我遇到的,之前使用ojdbc14.jar(不记得哪个版本了)批量插入10万条,实际只插入了3万多条,其它的丢失了,换ojdbc6.jar后,一次commit批量插入100万条也OK了。   尽量使用和数据库版本一致的驱动,有bug时,换高版本的JDBC驱动试试 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值