zoukankan      html  css  js  c++  java
  • JDBC

    一、jdbc介绍

    1. jdbc全称:java数据库连接(Java Database Connectivity),是sun公司定义的一套访问数据库的规范(接口和类,由各种数据库公司进行实现),主要放在java.sql.*和javax.sql.*这两个包中。
    2. jdbc开发需要引入java.sql.*、javax.sql.*以及相应的JDBC数据库实现jar包。

    二、一个简单的jdbc程序的实现步骤(分别给出三种数据库操作例子)

    1. 步骤            

                  第一步:引入需要的包;

                   如java.sql.*,javax.sql.*;

                   第二步:加载驱动;

                   Class.forName(String className);

                    注:另一种方法是:DriverManager.registerDriver(new 驱动类名()(如OracleDriver()));在实际开发中不推荐这种方法,这种方法会导致驱动程序加载两次,效率不高

                   第三步:得到与数据库的连接;

                    Connection conn=DriverManager.getConnection(String url,String user,String password);

                    注:根据url获取数据库的连接,user是登陆数据库的用户名,password是登陆密码

                    数据库url详解:url的写法为: localhost可以用指向本地机的回送地址127.0.0.1代替

                    常用数据库url地址的写法:

                                 Oracle——jdbc:oracle:thin:@localhost:1521:sid

                                 SqlServer——jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid

                                 MySQL——jdbc:mysql://localhost:3306/sid

                   第四步:创建发送sql语句的对象;

                    Statement statement=conn.createStatement();

                    注:

                    有三种类可用:

                    ①Statement:这个类是最原始最普通的,可以实现crud操作,但在查询操作中可能会出现注入漏洞;

                    ②PrepareStatement:可以对sql语句进行预处理,可以使用其提供的set方法防止注入漏洞,安全性和可靠性比较高;

                    ③CallableStatement:用于调用存储过程;

                    第五步:通过statement向数据库发送sql语句;

                   statement.executeUpdate(String sql);  //executeUpdate()用于执行INSERT、UPDATE、DELETE语句或DDL语句,会返回一个结果代表该sql语句影响的行数

                   statement.executeQuery(String sql); //executeQuery()用于执行SELECT语句,会返回一个结果集ResultSet,需要对结构进行处理

                    第六步:断开与数据库的连接,并释放相关资源(              注:整个数据库处理语句会抛异常所以用try catch块包起来,关闭连接的语句写在块后面的finally块中

    2.  下面给出几段简单的程序例子:

      复制代码
       1 /**
       2  * 演示如何使用jdbc和Oracle数据库进行连接
       3  */
       4 package com.oracle.demos;
       5 import java.sql.*;
       6 
       7 import javax.sql.rowset.JdbcRowSet;
       8 public class Demo1 {
       9 
      10     public static void main(String[] args) {
      11 
      12         Connection conn=null;
      13         Statement statement=null;
      14         try {
      15             Class.forName("oracle.jdbc.driver.OracleDriver");
      16             conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
      17             statement=conn.createStatement();
      18             String sql="";
      19             int n=statement.executeUpdate(sql);
      20             
      21         } catch (Exception e) {
      22             e.printStackTrace();
      23             // TODO: handle exception
      24         }finally{
      25             try {
      26                 if(statement!=null){
      27                     statement.close();
      28                 }
      29                 if(conn!=null){
      30                     conn.close();
      31                 }
      32             } catch (Exception e2) {
      33                 e2.printStackTrace();
      34                 // TODO: handle exception
      35             }
      36         }
      37     }
      复制代码

    三、重要知识点

    1. Connection接口

      其引用对象用于代表数据库的连接,客户端与数据库所有交互都是通过connection对象完成的,这个对象的常用方法有:

      ①createStatement();创建向数据库发送sql语句的statement对象;

      ②prepareStatement(String sql);创建向数据库发送预编译sql语句的PrepareStatement对象;

      ③prepareCall(String sql);创建执行存储过程的callableStatement对象;

      ④setAutoCommit(boolean autoCommit);设置事务是否自动提交,默认为true;

      ⑤commit();在此连接上提交事务;

      ⑥rollback();在此连接上回滚事务;

      注:当有多个dml操作同时执行,将这些操作看做一个整体进行提交,这个时候就需要将setAutoCommit设置为false,在执行commit()语句时进行统一提交,这样如果出了错误可以整体回滚;

      具体实现代码:

      复制代码
       1 package com.oracle.demos;
       2 import java.sql.*;
       3 
       4 import javax.sql.rowset.JdbcRowSet;
       5 public class Demo1 {
       6 
       7     public static void main(String[] args) {
       8 
       9         Connection conn=null;
      10         Statement statement=null;
      11         try {
      12             Class.forName("oracle.jdbc.driver.OracleDriver");
      13             conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
      14             //把事务设为不自动提交
      15             conn.setAutoCommit(false);
      16             statement=conn.createStatement();
      17             String sql1="";
      18             String sql2="";
      19             statement.executeUpdate(sql1);
      20             statement.executeUpdate(sql2);
      21             //提交所有事务
      22             conn.commit();
      23         } catch (Exception e) {
      24             e.printStackTrace();
      25             try {
      26                 //任何sql语句出错,可以整体回滚
      27                 conn.rollback();
      28             } catch (SQLException e1) {
      29                 e1.printStackTrace();
      30             }
      31         }finally{
      32             try {
      33                 if(statement!=null){
      34                     statement.close();
      35                 }
      36                 if(conn!=null){
      37                     conn.close();
      38                 }
      39             } catch (Exception e2) {
      40                 e2.printStackTrace();
      41             }
      42         }
      43     }
      44 
      45 }
      复制代码

      System.out.println(接口引用的某个类实例);将输出类的全名,该方法用于查看某个接口引用指向的真正对象实例的类型是什么。如上面的程序中执行System.out.println(conn)则输出对象数据库公司(Oracle)提供的实现Connection这个接口的类的类名。

    2. ResultSet

      用于代表sql语句的执行结果集的数据表,通常通过执行查询语句生成,ResultSet封装执行结果时,采用的类似于表格的方式ResultSet对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet接口的next()方法可以移动游标循环取出所有数据。

      ResultSet常用方法有:
      ①next();移动到下一行
      ②previous();移动到前一行
      ③absolute(int row);移动到指定行[row从1开始计算]
      ④beforeFirst();移动到resultSet的最前面
      ⑤afterLast();移动到resultSet的最后面

      next()方法:将光标从当前位置向前移一行。ResultSet光标最初位于第一行之前;第一次调用next()方法使第一行成为当前行,第二次调用使第二行成为当前行,一次类推如果新的当前行有效,则返回true,如果不存在下一行,则返回false。

      获取数据的get方法:①获取任意类型的数据,getObject(int index)或getObject(String columnName)
                                      ②获取指定类型的数据(如String类型),getString(int index)或getString(String columnName)
                                      其中index为字段(列)的标号从1开始,columnName为字段名字

      ResultSet类型:默认只能向前读取;TYPE_SCROLL_INSENSITIVE表示可回滚,但当数据库数据更新时取到的ResultSet不进行相应的实时更新 ;TYPE_SCROLL_SENSITIVE则表示ResultSet受数据库数据变动的影响;

      常用数据库数据类型与java数据类型转换表:
      Oracle

      Sql Server

      MySql

    3. 资源释放
      Jdbc程序运行完后,切记要释放程序在运行过程中创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象。
      特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。
      为了确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。
  • 相关阅读:
    js 点击列表li,获得当前li的id
    PHP松散比较与严格比较的区别详解
    电赛总结(二)——AD芯片总结之AD7705
    C++Premer Plus学习(五)——函数探幽
    FPGA学习
    AD7715
    电赛初探(二)——语音采集回放系统
    MATLAB信号与系统分析(五)——连续时间信号的频谱分析
    MATLAB信号与系统分析(四)——离散信号与系统的复频域分析及MATLAB实现
    MATLAB信号与系统分析(三)——连续信号与系统的复频域分析及MATLAB实现
  • 原文地址:https://www.cnblogs.com/boyangx/p/4130066.html
Copyright © 2011-2022 走看看