JDBC的使用和步骤

一个努力向上爬的搬运工 2020年04月03日 127次浏览

jdbc的使用及步骤

需求:mysql基础、java知识

加载JDBC驱动程序:

在连接数据库之前,首先要加载想连接的数据库的驱动到jvm虚拟机中。我们可以通过java.lang.Class类中的静态方法forName(String className)实现,成功加载完后,会将Driver类的实例注册到DriverManager类中

    try{
       Class.forName("com.mysql.jdbc.Driver");     
    }catch(ClassNotFoundException e){
        System.out.println("找不到mysql驱动程序");
    } 

提供JDBC连接的URL

连接URL定义了连接数据库时的协议、子协议、数据源标记

分别是:协议:子协议:数据源标识

协议:就是以jdbc开头,

子协议:数据库管理系统 名称

数据源标识:标记找到数据库来源的地址与连接端口

例如:Mysql的连接URL

String url = "jdbc:mysql://数据库名字?useUnicode=true&characterEncoding=utf8""; 
// useUnicode=true  :设置Unicode字符集 

//characterEncoding=utf8:字符编码格式,注意:这个是有必要的,因为在你插入数据时,保证在数据库中不会乱码

创建数据库的连接

要连接数据库,需要java.sql.DriverManager中请求并获得Connection对象,该对象就代表一个数据库的连接。

使用DriverManager的getConnection(String url,String usename,String password)方法传入指定的预先要连接的数据库的路径,数据库的名字,数据库的密码来获得。

例如:

// URL连接
 String url = "jdbc:mysql://数据库名字"; 
//数据库名字 
 String usename ="root";
 // 数据库密码 
 String password="123456";
 
try{
    Connection conn = DriverManager.getConnection(url,usename,password);
}catch(SQLException e){
     e.printStackTrace();
}

SQL查询,创建一个Statement

要执行SQL语句,必须获得java.sql.Statement实例,而Statement可以分为三种类型

  • Statement: 执行静态的SQL语句,通常通过Statement实例实现,不带参数列表

    Statement stmt = conn.createStatement();

  • PreparedStatement:执行动态的SQL语句,通常通过PreparedStatement实例实现 ,一般建议使用这个,因为这个不会出现SQL注入

    PreparedStatement ps = conn.preparedStatement(sql);

  • CallableStatement :执行数据库存储过程,通常通过CallableStatement实例实现;

    CallableStatement cstmt = conn.preparedCall("{CALL demoSp(? , ?)}");
    

执行SQL语句

Statement的三种方法:

  • executeQuery(String sqlString):执行查询数据的的SQL语句,返回一个java.sql.ResultSet结果集对象
  • execute(String sqlString):用于执行返回多个结果集、多个更新计数或者二者结果的语句
  • executeUpdate(String sqlString):用于执行INSERT、UPDATE或者DELETE语句以及SQL DDL语句,例如:CREATE TABLE,DROP TABLe等

例如:

ResultSet rs = stmt.executeQuery("select * from...");

int r =  stmt .executeUpdate("insert into 表名 values()");

boolean flag = execute(String sqlString); 

处理结果

两种情况:
1、执行更新返回的是本次操作影响到的记录数。
2、执行查询返回的结果是一个ResultSet对象。
• ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些
行中数据的访问。
• 使用结果集(ResultSet)对象的访问方法获取数据:

while(rs.next()){   
           System.out.println("id: " + resultSet.getInt(1) + " |" + "name: " + resultSet.getString(2) + " |" + "age: " + resultSet.getInt(3) + "|");
     } 
     
    (列是从左到右编号的,并且从列1开始)    

关闭JDBC对象

操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声
明顺序相反:
1、关闭记录集
2、关闭声明
3、关闭连接对象

     // 关闭记录集   
   if(rs != null){  
    try{   
        rs.close() ;   
    }catch(SQLException e){   
        e.printStackTrace() ;   
    }   
      }   
      // 关闭声明   
      if(stmt != null){   
    try{   
        stmt.close() ;   
    }catch(SQLException e){   
        e.printStackTrace() ;   
    }   
      }   
      // 关闭连接对象  
      if(conn != null){   
     try{   
        conn.close() ;   
     }catch(SQLException e){   
        e.printStackTrace() ;   
     }   
      }  

最后来一个查询例子:

import java.sql.DriverManager;
import java.sql.Driver;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Demo {
    public static void main(String[] args) {
        try {
            //装载 mysql 驱动包
            Class.forName("com.mysql.jdbc.Driver");
            // url
            String url = "jdbc:mysql://localhost:3306/t2?useUnicode=true&characterEncoding=utf8";
            // username
            String username = "root";
            //password
            String password = "delingw123456";
            // SQL语句
            String sql = "select * from t2";
            //  连接mysql,需要用java.sql.DriverManager中的getConnection方法来请求并且获得Connection对象
            Connection conn = DriverManager.getConnection(url, username, password);
            // 执行SQL语句,需要java.sql.Statement实例
            PreparedStatement ps = conn.prepareStatement(sql);
            // 执行查询SQL语句,返回一个ResultSet结果集对象
            ResultSet resultSet = ps.executeQuery();
            // 使用结果集对象的访问方法获取数据
            while (resultSet.next()) {
                System.out.println("id: " + resultSet.getInt(1) + " |" + "name: " + resultSet.getString(2) + " |" + "age: " + resultSet.getInt(3) + "|");
            }
            // 关闭记录集
            if (resultSet != null) {
                resultSet.close();
            }
            // 关闭声明
            if (ps != null) {
                ps.close();
            }
            // 关闭连接对象
            if (conn != null) {
                conn.close();
            }
        } catch (ClassNotFoundException e) {
            System.out.println("mysql驱动不存在!");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}