欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDBC 详解

程序员文章站 2022-05-01 18:09:18
...

连接池运作过程:
假设设置了最小和最大的连接为10,20,那么应用一旦启动则首先打开10个数据库连接,但注意此时数据库连接池的正在使用数字为0–因为你并没有使用这些连接,而空闲的数量则是10。然后你开始登录,假设登录代码使用了一个连接进行查询,那么此时数据库连接池的正在使用数字为1、空闲数为9,这并不需要从数据库打开连接–因为连接池已经准备好了10个给你留着呢。登录结束了,当前连接池的连接数量是多少?当然是0,因为那个连接随着事务的结束已经返还给连接池了。然后同时有11个人在同一秒进行登录,会发生什么:连接池从数据库新申请(打开)了一个连接,连同另外的10个一并送出,这个瞬间连接池的使用数是11个,不过没关系正常情况下过一会儿又会变成0。如果同时有21个人登录呢?那第21个人就只能等前面的某个人登录完毕后释放连接给他。这时连接池开启了20个数据库连接–虽然很可能正在使用数量的已经降为0,那么20个连接会一直保持吗?当然不,连接池会在一定时间内关闭一定量的连接还给数据库,在这个例子里数字是20-10=10,因为只需要保持最小连接数就好了,而这个时间周期也是连接池里配置的。

  • 最小连接数–应用启动后随即打开的连接数以及后续最小维持的连接数。
  • 最大连接数–应用能够使用的最多的连接数
  • 连接增长数–应用每次新打开的连接个数

JDBC:Java Data Base Connectivity—Java数据库连接。是一种与平台无关的用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。

JDBC 详解


JDBC使用步骤

加载JDBC驱动程序 → 建立数据库连接Connection → 创建执行SQL语句Statement或PreparedStatement对象 → 处理执行得到结果集ResultSet → 释放连接资源(关闭顺序很重要)

先看一个完整操作代码示例:

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

public class MistraJDBC {

    public static final String URL = "jdbc:mysql://localhost:3306/test";
    public static final String USER = "root";
    public static final String PASSWORD = "123456";

    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");//1.加载驱动程序
        Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);//2. 获得数据库连接
        Statement stmt = conn.createStatement();//3.创建Statement对象
        //4.操作数据库,实现增删改查
        ResultSet rs = stmt.executeQuery("SELECT user_name, age FROM test");
        while(rs.next()){//如果有数据,rs.next()返回true
            System.out.println(rs.getString("user_name")+" 年龄:"+rs.getInt("age"));//5.遍历结果
        }
        rs.close();//6.释放资源
        stmt.colse();
        conn.colse();
    }
}

数据库连接资源非常宝贵,创建与关闭都非常消耗资源,这里演示的是最原始的操作方法,一般都会用数据库连接池(c3p0,dbcp,druid等)来保持一定数量的数据库连接。
关于druid可以看看这里:druid连接池配置与使用Druid 介绍及配置


接口

1.Driver接口
在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。如:
装载MySql驱动:Class.forName(“com.mysql.jdbc.Driver”);
装载Oracle驱动:Class.forName(“oracle.jdbc.driver.OracleDriver”);
2.Connection接口
Connection用来与数据库建立连接:DriverManager.getConnection(url, user, password)
连接MySql数据库:Connection conn = DriverManager.getConnection(“jdbc:mysql://host:port/database”, “user”, “password”);
连接Oracle数据库:Connection conn = DriverManager.getConnection(“jdbc:oracle:thin:@host:port:database”, “user”, “password”);
连接SqlServer数据库:Connection conn = DriverManager.getConnection(“jdbc:microsoft:sqlserver://host:port; DatabaseName=database”, “user”, “password”);
常用方法:

  • createStatement():创建向数据库发送sql的statement对象
  • prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象(下文介绍这两个对象的区别)
  • prepareCall(sql):创建执行存储过程的callableStatement对象
  • setAutoCommit(boolean autoCommit):设置事务是否自动提交
  • commit() :在链接上提交事务
  • rollback() :在此链接上回滚事务

3.Statement接口
用于执行静态SQL语句并返回它所生成结果的对象。
三种Statement类:

  • Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。
  • PreparedStatement :继承自Statement接口,由preparedStatement创建,可以使用占位符,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。参考: Statement 和 PreparedStatement之间的关系和区别
  • CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。

常用Statement方法:

  • execute(String sql):运行语句,返回是否有结果集
  • executeQuery(String sql):运行select语句,返回ResultSet结果集
  • executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数
  • addBatch(String sql) :把多条sql语句放到一个批处理中
  • executeBatch():向数据库发送一批sql语句执行

4.ResultSet接口
ResultSet提供检索不同类型字段的方法,常用的有:

  • getString(int index)、getString(StringcolumnName):获得在数据库里是varchar、char等类型的数据对象
  • getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象
  • getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据
  • getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据
  • getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据

ResultSet还提供了对结果集进行滚动的方法:

  • next():移动到下一行
  • Previous():移动到前一行
  • absolute(int row):移动到指定行
  • beforeFirst():移动resultSet的最前面。
  • afterLast() :移动到resultSet的最后面。

JDBC 详解