JDBC编程原理

JDBC,是Java的数据库连接,是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范.它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问.

JDBC的工作原理

JDBC为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类.

JDBC的使用

共分5步骤:
1 建立数据库连接
2 创建操作命令
3执行SQL语句
4 处理结果集
5 释放资源

- 建立数据库连接

//加载JDBC驱动程序:反射,这样调用初始化com.mysql.jdbc.Driver类,即将该类加载到JVM方法区,并执行该类的静态方法块,静态属性.
Class.forName("com.mysql.jdbc.Driver");

//创建数据库连接
//MySQL数据连接的URL参数格式如下
//jdbc:MySQL://服务器地址:端口/数据库名?参数名=参数值
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mall?user = root&password=root&useUnicode = true&characterEndcoding=UTF-8");

- 创建操作命令

Statement statement = connection.createStatement();

- 执行SQL语句

ResultSet resultSet = statement.executeQuery("select id,name,qq_mail,classes_id from student");

- 处理结果集

while(resultSet.next()){
             int id = resultSet.getInt("id");
             String name = resultSet.getString("name");
             int classes_id = resultSet.getInd("classes_id");
             System.out.println(String.format("Studeng:id=%d,name=%s,classes_id=%s,id,name,classes_id));

- 释放资源

//关闭结果集
if(resultSet != null){
    try{
        resultSet.close();
 }catch(SQLException e){
     e.printStackTrace();
     }
 }
 //关闭命令
 if(statement != null){
    try{
        statement.close();
 }catch(SQLException e){
     e.printStackTrace();
     }
 }
 //关闭连接命令
 if(connection != null){
    try{
        connection.close();
 }catch(SQLException e){
     e.printStackTrace();
     }
 }

Connection接口实现类由数据库提供,获取Connection对象通常有两种方式:

- 一种是通过DriverManager(驱动管理类)的静态方法获取

//加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
//创建数据库的连接
Connection connection = DriverManager.getConnection(url);

- 一种是通过DataSource(数据源)对象获取,实际应用中会使用DataSource.

DataSource ds = new MysqlDataSource();
((MysqlDataSource) ds).setUrl("jdbc:mysql://localhost:3306/test");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("root");
Connection connection = ds.getConnection();

这两种方式的区别是:

  1. DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接.
  2. DataSource提供连接池的支持,连接池在初始化时将创建一定数量的数据库连接,这些连接是可以重复使用的,每次使用完数据库连接,释放资源调用的connection.close()都是将Connection连接对象回收.

Statement对象

Statement对象主要是将SQL语句发送到数据库中,JDBC API中主要提供了三种Statement对象

  1. Statement
    用于执行不带参数的简单SQL语句

  2. PreparedStatement
    用于执行带或者不带参数的SQL语句
    SQL语句会预编译在数据库系统
    执行速度快于Statement

  3. CallableStatement
    用于执行数据库存储过程的调用

实际开发中最常用的是PreparedStatement

  • 参数化SQL查询
  • 性能比Statement高
  • SQL预编译
  • 占位符不能使用多值
  • 阻止常见SQL注入攻击
  • 占位符: ? 下标从1开始

ResultSet对象

ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供了对这些行中数据的访问.
ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行,我们如果想要取得某一条记录,就要使用ResultSet的next()方法,如果我们想要得到ResultSet里的所有记录,就应该使用while循环.

package com.matajie;

import java.math.BigDecimal;
import java.sql.*;

import static java.lang.Class.forName;

public class DBUtil {
    private static final String URL = "jdbc:mysql://47.108.208.185:3306/mall";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "root";
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Statement statement = null;
        ResultSet resultSet = null;
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection(URL,USERNAME,PASSWORD);
        System.out.println(connection);
         statement = connection.createStatement();
        String sql = "select id,name,chinese,math,english" + " from exam_result";
         resultSet = statement.executeQuery(sql);
        while (resultSet.next()){
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            BigDecimal chinese = resultSet.getBigDecimal("chinese");
            BigDecimal math = resultSet.getBigDecimal("math");
            BigDecimal english = resultSet.getBigDecimal("english");
            System.out.printf("id = %s,name = %s,chinese = %s,math = %s,english = %s",id,name,chinese,math,english);
            System.out.println();
        }
        //ResultSet 类似 List<Map<String,Object>>
        if(resultSet != null){
            connection.close();
        }
        if(statement != null){
            connection.close();
        }
        if(connection != null){
            connection.close();
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值