zoukankan      html  css  js  c++  java
  • JDBC

    一.JDBC
    1.概述
         Java DataBase Connectivity--JAVA数据连接库,是一种用于执行SQL语句的JAVA API,
         可以为多种关系数据库提供统一访问,由一组用JAVA语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使用数据库开发人员能够编写数据库应用程序.
    2.JDBC原理
         JDBC可以让程序员使用固定的流程和方法,操作不同的数据库;
         核心类和接口:
             Driver接口--用于识别数据库;
             Connection接口--用于连接数据库的会话;
             Statement接口--sql执行者;
             ResultSet接口--sql执行的结果集;

            DriverManager类,用于操作JDBC的工具类,通过这个类的方法,可以注册驱动和获取连接.

    Driver 接口(java.sql)
         定义:public interface Driver
         常用方法:
         Connection connect(String url,Properties info)throws SQLException{}:通过指定url与数据库建立连接;
    Connection 接口(java.sql)
         定义:public interface Connection extends Wrapper, AutoCloseable
         常用方法:
             void close() throws SQLException{}:关闭资源
             Statement createStatement() throws SQLException{}:创建一个 Statement 对象来将 SQL 语句发送到数据库
             PreparedStatement prepareStatement(String sql) throws SQLException{}:返回一个PerparedStatement对象;

    StateMent     接口(java.sql)
         定义:public interface Statement extends Wrapper, AutoCloseable
         常用方法:
             boolean execute(String sql) throws SQLException{}:执行Sql;
             ResultSet executeQuery(String sql) throws SQLException{}:返回查询的结果集;
             int executeUpdate(String sql) throws SQLException{}:执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。
    ResultSet  接口(java.sql)
         定义:public interface ResultSet extends Wrapper, AutoCloseable
         常用方法:
             void close() throws SQLException{}:关闭资源;
             boolean next() throws SQLException{}:将光标从当前位置向前(下)移一行。
             Object getObject(String columnLabel) throws SQLException{}:以 Java 编程语言中 Object 的形式获取此 ResultSet 对象的当前行中指定列的值。
             Object getObject(int columnIndex) throws SQLException{}:以 Java 编程语言中 Object 的形式获取此 ResultSet 对象的当前行中指定列的值。

    DriverManager 类(java.sql)
         定义:public class DriverManager extends Object
         常用方法:
             public static void registerDriver(Driver driver) throws SQLException{}:向 DriverManager 注册给定驱动程序。JAVA1.6之后可自动注册,不必写;
             public static Connection getConnection(String url,String user,String password) throws SQLException{}:试图建立到给定数据库 URL 的连接。

    3.使用步骤:
         1)注册驱动;让java代码识别数据库,Driver接口的实现者由数据库生产厂商提供,mysql数据库的驱动类在mysql官网可以直接下载,驱动类导入工程--DriverManager类的registerDriver()方法;
         2)获取连接,创建会话对象:DriverManager 类的getConnection(url,use,password)方法;
         3)获取sql执行者:Connection 接口的 createStatement()方法;
         4)编写sql并执行:Statement 接口的 executeUpdate()或 executeQuery()方法;
         5)处理结果集(主要是查询结果);
         6)释放资源,RESULTSET/STATEMENT/CONNECTION/ 按此顺序关闭资源,全为close()方法;

    4.PreparedStatement 接口(java.sql) Statement子类
         注意:该接口的一个实例化对象只能执行一次sql语句!!
         定义:public interface PreparedStatement extends Statement
         常用方法:
             boolean execute() throws SQLException{}:执行Sql后返回一个boolean值,一般不用;
             ResultSet executeQuery() throws SQLException{}:返回查询的结果集;
             int executeUpdate() throws SQLException{}:在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如 INSERT、UPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。
             void setObject(int parameterIndex,Object x) throws SQLException{}:使用给定对象设置指定参数的值。parameterIndex:表示sql语句中的第几个占位符,从1开始;X:表示要赋的值;

    5.代码演示:以下代码在Eclipse中实现,需导入jar包
         代码1:
       

      1  /*
      2      使用JDBC查询数据库中的数据
      3      1:注册驱动
      4      2:创建会话对象(道路)
      5       3:获取sql执行者
      6      4:编写sql并执行
      7      5:处理结果集
      8      6:释放资源(结果集,sql执行,会话对象)
      9       */
     10      import java.sql.Connection;
     11      import java.sql.DriverManager;
     12      import java.sql.ResultSet;
     13      import java.sql.Statement;
     14 
     15      public class Demo02 {
     16          public static void main(String[] args) throws Exception {
     17              // 使用反射加载类注册驱动--固定路径,需牢记"com.mysql.jdbc.Driver"
     18              Class.forName("com.mysql.jdbc.Driver");
     19              // 创建会话对象--本地mysql固定路径,需牢记"jdbc:mysql:///mydb?useSSL=false"
     20              Connection c = DriverManager.getConnection("jdbc:mysql:///mydb?useSSL=false", "root", "root");//注意SSL警告,若不想显示,添加"?useSSL=false"
     21              // 创建执行者
     22             Statement st = c.createStatement();
     23              // 编写sql语句并执行
     24             String sql = "SELECT * FROM category";
     25              ResultSet set = st.executeQuery(sql);
     26              // 处理结果集
     27             while (set.next()) {
     28                  Object cid = set.getObject("cid");
     29                  Object cname = set.getObject("cname");
     30                  System.out.println(cid + "----" + cname);
     31              }
     32              // 关闭资源--顺序:ResultSet/Statement/Connection
     33              set.close();
     34              st.close();
     35              c.close();
     36         }
     37      }


        
         代码2:自定义JDBC工具类--思考面向对象封装的思想
      

      1   import java.sql.Connection;
      2      import java.sql.DriverManager;
      3      import java.sql.ResultSet;
      4      import java.sql.SQLException;
      5      import java.sql.Statement;
      6      /*
      7       * 使用JDBC时,注册,获取连接,关闭资源三个操作为固定模式,可封装成类
      8      * */
      9      public class MyJDBCUtils {
     10          // 定义成员变量--由于Mysql Driver类 路径-数据库URL-用户名-密码一般固定,因此可设为成员变量,并加final修饰
     11         private static final String path = "com.mysql.jdbc.Driver";
     12          private static final String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false";
     13          private static final String user = "root";
     14          private static final String password = "root";
     15          // 注册方法,由于只注册一次,因此使用静态代码块
     16         static {
     17              try {
     18                  Class.forName(path);
     19              } catch (ClassNotFoundException e) {
     20                  e.printStackTrace();
     21                  throw new RuntimeException("记得要先导包~");
     22              }
     23          }
     24          // 获取连接,返回Connection类的实例对象
     25         public static Connection getConnection() {
     26              try {
     27                  Connection c = DriverManager.getConnection(url, user, password);
     28                  return c;
     29              } catch (SQLException e) {
     30                  e.printStackTrace();
     31                  throw new RuntimeException("路径对吗?数据库创建了吗?密码对吗?");
     32              }
     33          }
     34          // 关闭资源--顺序Result/statement/connection
     35          public static void close(ResultSet r, Statement st, Connection c) {
     36              if (c != null) {
     37                  try {
     38                      c.close();
     39                  } catch (SQLException e) {
     40                      e.printStackTrace();
     41                      throw new RuntimeException("连接关闭异常!");
     42                  }
     43              }
     44 
     45              if (st != null) {
     46                  try {
     47                      st.close();
     48                  } catch (SQLException e) {
     49                      e.printStackTrace();
     50                      throw new RuntimeException("执行关闭异常!");
     51                  }
     52              }
     53 
     54              if (r != null) {
     55                  try {
     56                      r.close();
     57                  } catch (SQLException e) {
     58                      e.printStackTrace();
     59                      throw new RuntimeException("结果集关闭异常!");
     60                  }
     61              }
     62          }
     63      }


        
         代码3:利用自定义工具类完成CRUD
        

      1 import huguangqin.com.cnblogs.MyJDBCUtils.MyJDBCUtils;
      2      import java.sql.Connection;
      3      import java.sql.ResultSet;
      4      import java.sql.SQLException;
      5      import java.sql.Statement;
      6      /*
      7       * 利用工具类完成CRUD
      8       * */
      9      public class Demo01 {
     10         public static void main(String[] args) throws SQLException {
     11              // 注册驱动-工具类,并获取连接-工具类-(无需注册,由于类里设置了静态代码块,获取连接调用该类会自动注册)
     12              Connection c = MyJDBCUtils.getConnection();
     13 
     14              // 获取执行者Statement
     15              Statement st = c.createStatement();
     16 
     17              // 编写sql,并执行
     18             // 插入数据
     19             String insertSQL = "INSERT INTO category(cid,cname) VALUES(7,'花卷'),(8,'包子')";
     20              // 执行插入
     21             int i = st.executeUpdate(insertSQL);
     22              // 查询数据
     23             String querySQL = "SELECT * FROM category";
     24              // 执行查询
     25             ResultSet set = st.executeQuery(querySQL);
     26              // 处理结果集-ResultSet
     27              while (set.next()) {
     28                  Object cid = set.getObject("cid");
     29                  Object cname = set.getObject("cname");
     30                  System.out.println(cid + "===" + cname);
     31              }
     32              // 关闭资源-工具类
     33             MyJDBCUtils.close(set, st, c);
     34          }
     35      }

    代码4://面向Connection 获取PreparedStatement对象,预处理sql对象的每条语句,防止SQL注入攻击

      1 import huguangqin.com.cnblogs.MyJDBCUtils.MyJDBCUtils;
      2  import java.sql.Connection;
      3  import java.sql.PreparedStatement;
      4  import java.sql.ResultSet;
      5  import java.sql.SQLException;
      6 
      7 public class PreparedStatementDemo {
      8      public static void main(String[] args) throws SQLException {
      9          // 利用自定义工具类获取连接,同时完成注册驱动
     10         Connection c = MyJDBCUtils.getConnection();
     11          // 使用PreparedStatement向表中插入三行数据
     12         String insertSQL = "INSERT INTO user(name,password) VALUES(?,?)";
     13          // 面向Connection 获取PreparedStatement对象
     14         PreparedStatement pst = c.prepareStatement(insertSQL);
     15          // 设置实际参数
     16         pst.setObject(1, "a");
     17          pst.setObject(2, "a");
     18          // 执行(PreparedStatement的一个实例化对象只能执行一次sql)
     19          int i = pst.executeUpdate();
     20 
     21         // 查询
     22         String querySQL = "SELECT * FROM USER WHERE name = ?";
     23          // 面向Connection获取PreparedStatement对象
     24         PreparedStatement pst1 = c.prepareStatement(querySQL);
     25          pst1.setObject(1, "a");
     26          ResultSet set = pst1.executeQuery();
     27          // 处理结果集
     28         while (set.next()) {
     29              Object name = set.getObject("name");
     30              Object password = set.getObject("password");
     31              System.out.println(name + "====" + password);
     32          }
     33      }
     34  }
     35 
  • 相关阅读:
    【ybtoj】【Hash】回文子串
    Design Pattern:状态模式
    Design Pattern:装饰者模式
    Design Pattern:外观模式
    Design Pattern:适配器模式
    Design Pattern:模板方法模式
    Design Pattern:命令模式
    Design Pattern:观察者模式
    Design Pattern:复合模式
    Design Pattern:迭代器模式
  • 原文地址:https://www.cnblogs.com/huguangqin/p/7134422.html
Copyright © 2011-2022 走看看