JDBC 详解

连接池运作过程:
假设设置了最小和最大的连接为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驱动程序 → 建立数据库连接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的最后面。

这里写图片描述

猜你喜欢

转载自blog.csdn.net/axela30w/article/details/79214511
今日推荐