码迷,mamicode.com
首页 > 数据库 > 详细

JDBC

时间:2017-07-07 23:30:00      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:host   .sql   close   eclips   静态   api   tde   extends   exce   

一.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 

JDBC

标签:host   .sql   close   eclips   静态   api   tde   extends   exce   

原文地址:http://www.cnblogs.com/huguangqin/p/7134422.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!