zoukankan      html  css  js  c++  java
  • JDBC之简介

    5、JDBC的API

    java.sql包和javax.sql包

    DriverManager类(驱动管理器),它可以创建连接,它本身就是一个创建Connection的工厂(Factory)。

    Driver接口  入口

    Connection接口,会根据不同的驱动产生不同的连接

    Statement接口,发送sql语句

    ResultSet接口(结果集),是用来接收select语句返回的查寻结果的。其实质类似于集合。  

    以上的资源都需要释放,释放的是数据库的资源

    JDBC应用步骤

    1,注册加载一个driver驱动

    2,创建数据库连接(Connection)

    3,创建一个Statement(发送sql)

    4,执行sql语句

    5,处理sql结果(select语句)

    6,关闭Statement

    7,关闭连接Connection。

    注意:6,7两个步骤势必须要做的,因为这些资源是不会自动释放的,必须要自己关闭

    访问Oracle的数据库的驱动名字叫o加到环境变量PATH中。

    jdbc14.jar,这个jar文件中出访的驱动程序的.class文件

    要使用这个驱动程序,要先将他

    一,注册加载驱动driver,也就是强制类加载

        1Class.forName(driver);

           driver = "oracle.jdbc.driver.OracleDriver";

        2Driver d=new Driver();

           Driver d = new oracle.jdbc.driver.OracleDriver();

           DriverManager.registerDriver(d);

           

        3、编译时利用虚拟机的系统属性

           java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver 类名(文件)       

        oracleDriver的全名oracle.jdbc.driver.OracleDriver

        mysqlDriver的全名com.mysql.jdbc.Driver

        SQLServerDriver的全名com.microsoft.jdbc.sqlserver.SQLServerDriver

    二,创建连接

        DriverManager.getConnection(String url,String username,String password);

        Connection连接是通过DriverManager的静态方法getConnection(.....)来得到的,这个方法的实质是把参数传到实际的Driver中的connect()方法中来获得数据库连接的。

        oracleURL值是由连接数据库的协议和数据库的IP地址及端口号还有要连接的库名(DatebaseName

        oracle URL的格式

        jdbc:oracle:thin:(协议)@XXX.XXX.X.XXX:XXXXIP地址及端口号):XXXXXXX(所使用的库名)

        例:jdbc:oracle:thin:@192.168.0.39:1521:TARENADB

        MySql URL的写法

        例: jdbc:mysql://192.168.8.21:3306/test

        SQLServer URL的写法

        例:jdbc:microsoft:sqlserver://192.168.8.21:1433

        java -Djdbc.drivers=驱动全名 类名

        使用系统属性名,加载驱动 -D表示为系统属性赋值

        

        使用Connection对象获得一个StatementStatement中的executeQuery(String sql) 方法可以使用select语句查询,并且返回一个结果集 ResultSet通过遍历这个结果集,

        可以获得select语句的查寻结果,ResultSetnext()方法会操作一个游标从第一条记录的前边开始读取,直到最后一条记录。

        executeUpdate(String sql) 方法用于执行DDLDML语句,可以updatedelete操作。

    注意:要按先ResultSet结果集,后Statement,最后Connection的顺序关闭资源,因为Statement和ResultSet是需要连接是才可以使用的,

          所以在使用结束之后有可能起他的Statement还需要连接,所以不能现关闭Connection  

          

    作业:修改StudentDao的设计以及实现和测试程序,来完成从命令行传递学生的信息。

    第二季

    一、提问

    如何进行代码复用

       继承复用、组合复用

       私有复用:一个方法在一个类的内部使用

       工具方法:使用静态方法,使用类名直接调用                                    

       

    二、Statement  

    execute(sql); 当不知道执行的SQL语句是什么类型的时候执行 ,返回值是boolean

    executeQuery(sql); 执行查询语句

    executeUpdate(sql); 执行更新语句

    三、PreparedStatement

    可以使用参数替代sql语句中的某些参数使用 "?"代替,他先将带参数的sql语句发送到数据库,进行编译,然后PreparedStatement会将参数发送给数据库。

    在使用PreparedStatement时,在设置相应参数时,要指明参数的位置和类型,以及给出参数值

    根据不同的参数类型使用不同的setXXX(参数的位置,参数值)来设置参数

    例:

    public void insert(Student s){

            Connection con=ConnectionFactory.getConnection();//建立连接

            String sql="insert into student(id,name) values(?,?)";

            PreparedStatement ps=null;

            try {

                ps=con.prepareStatement(sql);//创建一个PreparedStatement

          int index=1;

                ps.setInt(index++,s.getStuId());  //为参数赋值

                ps.setString(index++,s.getName());

                ps.executeUpdate();

            } catch (SQLException e) {

                e.printStackTrace();

            }finally{

                if(ps!=null)

                    try {

                        ps.close();

                    } catch (SQLException e) {

                        e.printStackTrace();

                    }

                    if(con!=null)

                        try {

                            con.close();

                        } catch (SQLException e) {

                            e.printStackTrace();

                        }

            }

        }

    CallableStatement是可以用非sql语句来访问数据库,他是通过调用存储过程(PL/SQL)来访问数据库的。可以直接使用连接来调用 prepareCall(...)方法,来执行这个存储过程,"..."是存储过程的名字。

    对于系统时间要去数据库时间

    TimeStamp  Date都可以保存时间

    TimeStamp可以保存时、分、秒的数据,Date只保存日期年月的信息。

    SQLException是检查异常必须处理要么throws ,要么try{}catch(){}

    getErrorCode()可以获得错误码,可以对错误进行查询。

    四、源数据

    JDBC中有两种源数据,一种是数据库源数据,另一种是ResultSet源数据。

    源数据就是描述存储用户数据的容器的数据结构。

    ResultSet rs=ps.executeQuery(sql);

    ResultSetMetaData m=rs.getMetaData();

    getColumnCount(),获得实际列数

    getColumnName(int colnum),获得指定列的列名

    getColumnType(int colnum),获得指定列的数据类型

    getColumnTypeName(int colnum),获得指定列的数据类型名

    //打印结果集

    public static void printRS(ResultSet rs)throws SQLException{

        ResultSetMetaData rsmd = rs.getMetaData();

        while(rs.next()){

           for(int i = 1 ; i < = rsmd.getColumnCount() ; i++){

              String colName = rsmd.getColumnName(i);

              String colValue = rs.getString(i);

              if(i>1){

                 System.out.print(",");

              }

              System.out.print(name+"="+value);

           }

           System.out.println();

        }

    }

    五、数据库源数据

    DatabaseMetaData

    getURL(),获得连接数据库的URL

    getDatabaseProductName() 获得数据库产品的名称

    getDriverVersion() 获得JDBC驱动程序的String形式的版本号

    getTables()获得数据库中该用户的所有表

    getUserName() 获得数据库用户名。

    六、事务(Transaction)

    事务是针对原子操作的,要求原子操作不可再分,要求原子操作必须同时成功同时失败。

    事务是捆绑的原子操作的边界。

    JDBC中使用事务,先要使用连接调用setAutoCommite(false)方法,把自动提交(commit)置为false。打开事务就要关闭自动提交。不用事务是要把setAutoCommite(true)

    在处理事务时,在发送sql语句后执行成功并确认时,就在try块中使用连接调用commit()方法来发送提交信息,

    在发送sql语句后执行失败时,会在catch语句块中使用连接调用rollback()方法来发送回滚信息,也可以在需要时做回滚操作(主观原因)。

    七、JDBC事务并发产生的问题和事务隔离级别

    1,脏读(dirty read),读取到了没有提交的数据。

    2,不可重复读(UnPrpeatable Read),两次读取到了不同的数据,就是要保持在同一时间点上两次读取到的数据相同,

       不能够使查询数据时进行改变。

    3,幻读(phantom),在两次查询同一时间点数据时,数据数量发生改变,要保持在同一时间点上两次读取到的数据相同。

    事务隔离级别

    TRANSACTION_NONE不使用事务。

    TRANSACTION_READ_UNCOMMITTED 可以读取为提交数据。

    TRANSACTION_READ_COMMITTED可以避免脏读,不能够读取没提交的数据,最常用的隔离级别  大部分数据库的默认隔离级别

    TRANSACTION_REPEATABLE_READ可以避免脏读,重复读取,

    TRANSACTION_SERIALIZABLE可以避免脏读,重复读取和幻读,(事务串行化)会降低数据库效率

    以上的五个事务隔离级别都是在Connection类中定义的静态常量,使用setTransactionIsolation(int level) 方法可以设置事务隔离级别。

    八,异常的处理

    try{}

    catch(SQLException){}

    try{}

    catch(Exception){}

  • 相关阅读:
    hdu 5534(dp)
    hdu 5533(几何水)
    hdu 5532(最长上升子序列)
    *hdu 5536(字典树的运用)
    hdu 5538(水)
    假如数组接收到一个null,那么应该怎么循环输出。百度结果,都需要提前判断。否则出现空指针异常。。我还是想在数组中实现保存和输出null。
    第一个登录页面 碰到的疑问
    浅谈堆和栈的区别
    Java中的基础----堆与栈的介绍、区别
    JS的Document属性和方法
  • 原文地址:https://www.cnblogs.com/allenzhaox/p/3201809.html
Copyright © 2011-2022 走看看