JDBC学习笔记一

JDBC学习笔记一

JDBC全称 Java Database Connectivity,即数据库连接,它是一种可以执行SQL语句的Java API。

ODBC全称 Open Database Connectivity,即开放数据库连接,其允许应用程序可以通过一组通用的API访问不同的数据库管理系统。

这两个都需要数据库厂商提供相应的数据库驱动

1.JDBC驱动

数据库驱动程序是JDBC程序和数据库之间的转换层,数据库驱动负责将JDBC调用映射成特定的数据库调用。

四种类型JDBC驱动:

  1. JDBC-ODBC桥,最早实现的JDBC驱动程序,将JDBC API映射为ODBC API(单线程)。
  2. 直接将JDBC API映射成数据库特定的客户端API
  3. 支持三层结构的JDBC访问方式,主要用于Applet阶段,通过Applet访问数据库
  4. 纯JAVA的,直接与数据库实例交互,这种驱动是职能的,他知道数据库的底层协议,目前最常用

2.JDBC常用接口类

2.1.DriverManeger

用于管理JDBC驱动的服务类,程序中该类的主要功能是获取Connection对象

以下方法获得url对应的数据库连接

public static synchronized Connection getConnection(String url, String user, String pass)
    throws SQLException{
    ...
}

2.2.Connection

代表数据库连接对象,每个Connection代表一个物理连接对话,要想访问数据库,必须先获得数据库连接。

该接口常用方法:

//返回一个Statement对象
Statement createStatement() throws SQLException  
//返回预编译的Statement对象
PreparedStatement prepareStatement(String sql) throws SQLException 
//返回存储过程CallableStatement对象
CallableStatement prepareCall(String sql) throws SQLException
//控制事务的方法:
Savepoint setSavePoint() //创建一个保存点
Savepoint setSavePoint(String name) //以指定名字创建一个保存点
void setTransactionIsolation(int level) //设置事务隔离级别
void rollback() //回滚事务
void rollback(Savepoint savepoint) //将事务回滚到指定的保存点
void setAutoCommit(boolean autoCommit) //关闭自动提交,打开事务
void commit() //提交事务

2.3.Statement

用于执行SQL语句的工具接口。可以执行DDL,DCL,DML和DQL语句

常用方法:

//执行sql查询语句,并将查询结果返回到ResultSet对象,该方法只能执行查询语句
ResultSet executeQuery(String sql) throws SQLException
//执行DML语句,并返回受影响行数,也可以执行DDL语句,返回值为0
int executeUpdate(String sql) throws SQLException
//执行任何sql语句,如果执行后第一个结果为Result对象,则返回true
//如果返回的是受影响的行数或者没有任何结果则返回false
boolean execute(String sql) throws SQLException

2.4.PreparedStatement

预编译的Statement对象,是Statement的子接口,它允许数据库预编译SQL语句,以后每次只改变SQL命令的参数,避免数据库每次都需要编译SQL语句

给占位符赋值的方法:

void setXXX(int parameterIndex, XXX value)  //XXX为赋值的数据类型

2.5.ResultSet

结果集对象。该对象包含访问查询结果的方法,ResultSet可以通过列索引或列名获得列数据。

常用方法:

//释放ResultSet对象
void close() throws SQLException
//将结果集移动到第row行, 如果是负数则移动到倒数第low行,如果移动后的记录指针指向一条有效记录,则返回true
boolean absolute(int row)
//将记录指针定位到首行之前,这是记录指针的初始状态
void beforeFisrt()
//将记录指针定位到首行,如果移动后的记录指针指向一条有效记录,则返回true
boolean first()
//将记录指针定位到上一行,如果移动后的记录指针指向一条有效记录,则返回true
boolean previous()
//将记录指针定位到下一行,如果移动后的记录指针指向一条有效记录,则返回true
boolean next()
////将记录指针定位到最后一行,如果移动后的记录指针指向一条有效记录,则返回true
boolean last()
//将记录指针定位到最后一行以后
void afterLast()

3.JDBC使用步骤

3.1.加载驱动

通常使用Class.for(driverClass)来加载驱动

Class.forName(DriverClass);
//加载Mysql驱动:
Class.forname("com.mysql.jdbc.Driver");
//加载Oracle驱动:
Class.forname("oracle.jdbc.driver.OracleDriver");

3.2.获取数据库连接

Connection connection = DriverManager.getConnection(String url, String user, String pass)

其中user是数据库用户名,pass是数据库密码

url遵循以下写写法:

jdbc:subprotocol:other stuff

其中jdbc是固定的,subprotocol指定连接到特定数据库的驱动程序,后面的other和stuff也不是固定的,不同的url写法也不同,下面是mysql和oracle的写法:

jdbc:mysql://hostname:port/databasename
jdbc:oracle:thin:@hostname:prot:databasename

3.3.获得Statement对象

Connection创建Statement的方法:

createStatement() //创建基本的Statement对象
prepareStatement(String sql) //根据传入的SQL语句创建预编译的Statement对象
prepareStatement(String sql)  //根据传入的SQL语句创建CallableStatement对象

3.4.使用Statement执行SQL语句

execute: 可以执行任何SQL语句,但比较麻烦

executeUpdate: 主要用于执行DML和DDL语句,执行DML语句返回收SQL语句影响的行数

executeQuery: 只能执行查询语句,执行后返回代表查询结果的ResultSet对象

3.5.操作结果集

主要包含两类方法:

  1. 移动指针记录的方法

    主要包含next, previous, first, last, beforeFirst, afterLast, absolute等

  2. 获取记录指针指向行,列特定的值。

    主要是getXxx方法,该方法既可以用列索引作为参数,也可以用列名作为参数,前者性能好,后者可读性好

3.6.回收数据库资源

ResultSet rs;
Statement stmt;
Connection conn;
//以上获取对象过程省略,关闭时是按照栈的原则进行关闭
if(rs != null)
    rs.close();
if(stmt != null)
    stmt.close();
if(conn != null)
    conn.close();

3.7.简单示例

数据库:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBC {
    public static void main(String[] args) throws Exception{
        //加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //使用DriverManager获取数据库连接
        Connection conn = DriverManager
                .getConnection("jdbc:mysql://localhost:3306/jdbc",
                        "root", "root");
        //使用Connection来创建Statement对象
        Statement stmt = conn.createStatement();
        //执行SQL语句,这里只展示三种方法中的查询
        ResultSet rs = stmt.executeQuery("select * from test");
        //操作结果集
        while(rs.next()){
            System.out.println(rs.getInt(1)+ " "
                    + rs.getString(2) + " "
                    + rs.getString(3));
        }
        //关闭数据库连接
        if(rs != null)
            rs.close();
        if(stmt != null)
            stmt.close();
        if(conn != null)
            conn.close();
    }

}

出现警告的原因:

public class Driver extends com.mysql.cj.jdbc.Driver {
    public Driver() throws SQLException {
    }

    static {
        System.err.println("Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.");
    }
}

这个是加载驱动时静态代码块中的内容,百度翻译过之后意思是:

​ 这已被弃用。新的驱动程序类是'com.mysql.cj.jdbc.driver'。驱动程序通过SPI自动注册,通常不需要手动加载 驱动程序类。

也就是说当使用较新的mysql-connectorjar包时,可以不再加载驱动

改进封装版

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;

public class JDBC2 {

    //获得连接对象
    public static Connection getConnection(){
        Properties prop = new Properties();
        Connection conn = null;
        try {
            //加载配置文件
            prop.load(new FileInputStream("src/main/resources/datasource.properties"));
             //低版本jar包需要下面这句话来加载驱动
       	     //Class.forName(prop.getProperty("driver"));
            //通过DriverManager获取Connection连接
            conn = DriverManager
                    .getConnection(prop.getProperty("url"), prop.getProperty("username"),
                            prop.getProperty("password"));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    //关闭连接
   public static void close(Connection conn, Statement stmt, ResultSet rs){
        try{
            if(rs != null)
                rs.close();
            if(stmt != null)
                stmt.close();
            if(conn != null)
                conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

//测试类
class Test{
    public static void main(String[] args) {
       Connection conn =  JDBC2.getConnection();
        try {
            //通过Connection创建Statement对象
            Statement stmt = conn.createStatement();
            //执行SQL语句
            ResultSet rs = stmt.executeQuery("select * from test");
            while (rs.next()){
                System.out.println(rs.getInt(1) + " "
                + rs.getString(2) + " " + rs.getString(3));
            }
            //关闭连接
            JDBC2.close(conn, stmt, rs);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

配置文件:

driver=com.mysql.jdbc.driver
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=root
posted @ 2019-08-31 16:21  人之为言  阅读(297)  评论(0编辑  收藏  举报