入门-JDBC连接数据库详解

相关概念

Jdbc是一种用执行SQL语句的Java API,可以为多种关系型数据库提供一个统一的访问入口,它是由一组用Java语言编写的类和接口组成。jdbc提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。意思就是不管是连接Qracle数据库还是MySql数据库或者是Informix数据库,都不用单独再为每个数据库写一个专门的程序,只需用jdbc API即可,它可以向相应的数据库发送SQL调用,将Java和jdbc结合起来就不必为不同的平台编写不同的应用程序,只需写一遍程序就可以让它在任何平台上运行,这也是Java语言的优势,一次编译,到处运行。

JDBC连接步骤

①、加载(注册)数据库驱动(到JVM)--->②、建立(获取)数据库连接--->③、创建(获取)数据库操作对象--->④、定义操作的SQL语句---> ⑤、执行数据库操作---⑥、获取并操作结果集--->⑦、关闭对象,回收数据库资源(关闭结果集--->关闭数据库操作对象--->关闭链接)
创建创建jdbc连接数据库所需四个参数
1)、用户名(数据库的用户名)
2)、用户密码(数据库的密码)
3)、URL定义了连接数据库时的协议、子协议、数据源标识。    
    •书写形式:协议:子协议:数据源标识    
    协议:在JDBC中总是以jdbc开始    
    子协议:是桥连接的驱动程序或是数据库管理系统名称。    
    数据源标识:标记找到数据库来源的地址与连接端口。    
    例如:(MySql的连接URL)    
    jdbc:mysql:    
        //localhost:3306/test?useUnicode=true&characterEncoding=gbk ;    
   useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为    
   gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。
4)、driverClass连接数据库所需的驱动
1、加载jdbc驱动程序
在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String  className)实现。
如↓:
try{    
    //加载MySql的驱动类    
    Class.forName("com.mysql.jdbc.Driver") ;    
    }catch(ClassNotFoundException e){    
    System.out.println("找不到驱动程序类 ,加载驱动失败!");    
    e.printStackTrace() ;    
    }    
成功加载后,会将Driver类的实例注册到DriverManager类中
2、创建数据库连接
   •要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象, 该对象就代表一个数据库的连接。    
    •使用DriverManager的getConnectin(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。
如↓:
//连接MySql数据库,用户名和密码都是root    
     String url = "jdbc:mysql://localhost:3306/test" ;     
     String username = "root" ;    
     String password = "root" ;    
     try{    
    Connection con =     
             DriverManager.getConnection(url , username , password ) ;    
     }catch(SQLException se){    
    System.out.println("数据库连接失败!");    
    se.printStackTrace() ;    
     }    
3、创建数据库操作对象
•要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3种类型:    
      1、执行静态SQL语句。通常通过Statement实例实现。    
      2、执行动态SQL语句。通常通过PreparedStatement实例实现。    
      3、执行数据库存储过程。通常通过CallableStatement实例实现。    
    实现方式:
Statement stmt = con.createStatement() ;    
        PreparedStatement pstmt = con.prepareStatement(sql) ;    
       CallableStatement cstmt =   con.prepareCall("{CALL demoSp(? , ?)}") ;   
4、定义要执行的SQL语句
这个步骤简单说就是写业务需求的SQL语句
如↓:
String sql = "select * from user where id = 100";  
5、 执行数据库操作(执行SQL语句)
Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate和execute    
    1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。    
     2、int executeUpdate(String sqlString):用于执行insert、update、select或delete语句以及SQL DDL语句,如:create table和drop table等    
     3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。    
   具体实现↓:   
 ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;    
       int rows = stmt.executeUpdate("INSERT INTO ...") ;    
       boolean flag = stmt.execute(String sql) ;  
6、 获取并操作结果集
   1).ResultSet中行的第一列索引为1,而非0,访问ResultSet中的数据时要使用列名,而非索引但要注意使用列名作为查询条件是大小写敏感的。
    2).JDBC1.0中,我们只能在ResultSet中向前移动;在JDBC2.0中,我们可以在ResultSet中向下(next)或向上(previous)移动,同样也可以移到特定的行(relative,absolute)
    3).默认情况下ResultSet是不可更新的,且只能向前移动。下面的代码显示了如何创建一个可滚动的、对更新敏感的ResultSet
Statement stmt = con.createStatement(
                                      ResultSet.TYPE_SCROLL_INSENSITIVE,
                                      ResultSet.CONCUR_UPDATABLE);
       ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
    4).ResultSet和ResultSetMetaData没有直接提供方法返回查询所返回的行数。然而,在JDBC2.0中,可以通过调用last()方法将游标定位到ResultSet的最后一行,然后调用getRow()方法获取当前的行号。在JDBC1.0中,确定行数的惟一方式是重复调用ResultSet的next()方法,直到它返回false为至;
7、 关闭对象,回收数据库资源(关闭结果集--->关闭数据库操作对象--->关闭链接)
操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反: 
 //1、先关闭requestSet    
     //2、再关闭preparedStatement    
     //3、最后关闭连接对象connection    
          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() ;    
         }    
          }  
JDBC连接数据库具体代码
package com.yangshengjie.jdbc;  
import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.ResultSet;  
import java.sql.SQLException;  
import java.sql.Statement;  
  
public class JDBCTest {  
    /** 
     * 使用JDBC连接并操作mysql数据库 
     */  
    public static void main(String[] args) {  
        // 数据库驱动类名的字符串  
        String driver = "com.mysql.jdbc.Driver";  
        // 数据库连接串  
        String url = "jdbc:mysql://127.0.0.1:3306/jdbctest";  
        // 用户名  
        String username = "root";  
        // 密码  
        String password = "mysqladmin";  
        Connection conn = null;  
        Statement stmt = null;  
        ResultSet rs = null;  
        try {  
            // 1、加载数据库驱动( 成功加载后,会将Driver类的实例注册到DriverManager类中)  
            Class.forName(driver );  
            // 2、获取数据库连接  
            conn = DriverManager.getConnection(url, username, password);  
            // 3、获取数据库操作对象  
            stmt = conn.createStatement();  
            // 4、定义操作的SQL语句  
            String sql = "select * from user where id = 100";  
            // 5、执行数据库操作  
            rs = stmt.executeQuery(sql);  
            // 6、获取并操作结果集  
            while (rs.next()) {  
                System.out.println(rs.getInt("id"));  
                System.out.println(rs.getString("name"));  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            // 7、关闭对象,回收数据库资源  
            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 {  
                    if (!conn.isClosed()) {  
                        conn.close();  
                    }  
                } catch (SQLException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
}  

JDBC的常用类和接口、方法

猜你喜欢

转载自blog.csdn.net/qq_37345604/article/details/80300984