对JDBC的理解

1. 概念

  • JDBC(Java Database Connection):java数据库连接。
  • 目前常见的关系型数据库管理系统有很多种,包括MySQL、Oracle、SQLserver等等。
  • 数据库管理系统,顾名思义是用来管理数据库的,将数据库中的数据以表的形式存储。
  • 以MySQL为例,安装完MySQL,可以通过控制台连接数据库、编写SQL语句对数据库进行增删改查。
  • 包括web应用在内的各种需要与数据打交道的应用,都会涉及到数据的增删改查,也就是要与数据库管理系统,比如MySQL,打交道。此时,希望通过java程序的方式直接操作数据库。要想实现这个目的,需要使用相应的数据库驱动与数据库建立连接。不同数据库厂商的数据库驱动都是不同的,建立连接以及操作数据库的方式都所有区别。
  • 为了便于程序的维护,Sun公司开发了JDBC这种统一的规范,程序只需要遵守这个规范即可以实现与数据库的连接,而无需考虑底层是如何实现的,这由不同的数据库厂商负责实现。

2. 最原始的使用步骤

(1)加载驱动类(在此之前要导包:mysql-connector-java)

 Class.forName("com.mysql.cj.jdbc.Driver");

(2)设置url、用户名和密码

url,资源统一定位符,用于和数据库建立连接,以MySQL为例,与HTTP的网址类似(http://www.baidu.com/tieba?uername=yujing&password=xxxx)

  • jdbc:mysql: 可以理解为一种协议或规范,MySQL数据库驱动的厂商需要遵循该规范
  • localhost 等价于127.0.0.1,可以理解为域名,主机所在的ip地址
  • 3306:数据库服务的端口
  • test:数据库的名字,下一层目录
  • ?后接参数名称和参数值,多个键值对中用&连接

四种参数代表的意思:

  • useUnicode=true:支持中文编码
  • characterEncoding=utf8:设置中文编码格式
  • useSSL=true:使用更加安全的连接
  • serverTimezone=GMT 设置时区
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT";
String username = "root";
String password = "123456";

(3)创建连接 获得数据库连接对象,代表数据库,可以查看数据库的信息

Connection connection = DriverManager.getConnection(url, username, password);

(4)通过连接获取执行SQL语句的对象

Statement statement = connection.createStatement();

(5)编写SQL语句,利用执行SQL的对象执行SQL

可能存在返回结果,用ResultSet接收,封装了所有查询出的对象(数据库表的所有行),以链表的形式存在

String sql = "SELECT * FROM sys_user";
        ResultSet resultSet = statement.executeQuery(sql); 

while (resultSet.next()){
     System.out.print("id=" + resultSet.getObject("id") + " ");
     System.out.print("username=" + resultSet.getObject("username") + " ");
     System.out.print("email=" + resultSet.getObject("email") + " ");
     System.out.print("password=" + resultSet.getObject("password") + " ");
     System.out.println("phoneNum=" + resultSet.getObject("phoneNum"));
}

 (6)释放连接

resultSet.close();
statement.close();
connection.close();

整体代码

package com.jing.jdbc;

import java.sql.*;

public class JDBCDemo01 {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        // 利用数据库图形管理软件的使用步骤来理解java和数据库建立连接并操作数据库的过程

        // 1. 加载驱动类
        Class.forName("com.mysql.cj.jdbc.Driver");

        // 2. 设置用户信息和url

        /*
        url用于和数据库建立连接,与HTTP的网址类似(http://www.baidu.com/tieba?uername=yujing&password=xxxx)
        jdbc:mysql: 可以理解为一种协议或规范,数据库驱动的厂商需要遵循该规范
        localhost 等价于127.0.0.1,可以理解为域名,主机所在的ip地址
        test:数据库的名字,下一层目录
        ?后接参数名称和参数值,多个键值对中用&连接
         */
        /*
        四种参数代表的意思:
            (1) useUnicode=true:支持中文编码
            (2) characterEncoding=utf8:设置中文编码格式
            (3) useSSL=true:使用更加安全的连接
            (4) serverTimezone=GMT 设置时区
         */
        String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT";
        String username = "root";
        String password = "123456";

        // 3. 创建连接 获得数据库连接对象,代表数据库,可以查看数据库的信息
        Connection connection = DriverManager.getConnection(url, username, password);

        // 4. 获取执行SQL语句的对象
        Statement statement = connection.createStatement();

        // 5.1 编写SQL语句,利用执行SQL的对象执行SQL,可能存在返回结果
        String sql = "SELECT * FROM sys_user";
        ResultSet resultSet = statement.executeQuery(sql); // 返回结果集,封装了所有查询出的对象(数据库表的所有行),以链表的形式存在

        // 5.2 遍历结果集
        while (resultSet.next()){
            System.out.print("id=" + resultSet.getObject("id") + " ");
            System.out.print("username=" + resultSet.getObject("username") + " ");
            System.out.print("email=" + resultSet.getObject("email") + " ");
            System.out.print("password=" + resultSet.getObject("password") + " ");
            System.out.println("phoneNum=" + resultSet.getObject("phoneNum"));
        }

        // 6. 释放连接(类似于HTTP连接的释放)
        resultSet.close();
        statement.close();
        connection.close();
    }
}

test中的sys_user表

执行结果

3. 涉及到的几类对象 

(1)Driver对象:Driver是一个接口,加载驱动实际上是注册了一个新的驱动

(2)Connection:数据库连接对象,代表数据库,负责数据库层面的操作,比如创建执行SQL的对象、事务相关操作(设置事务自动提交,事务手动提交,事务回滚)

(3)Statement:执行SQL语句的类,增删改查各类语句。其实是将语句发送给数据库执行,并接收数据库返回的结果。

(4)ResultSet:查询结果集,封装了查询到的所有记录,以链表的形式组织,自带指向第一个元素之前的位置的指针。

  • next()方法:遍历,向下一个位置移动指针,如果指针指向为空,则返回false,否则返回true。
  • getObject():根据列名获得记录中的字段值,不知道值的类型时使用
  • getString():如果字段的类型为varchar,则可以使用更加具体的方法
  • ...

4. 抽取JDBC工具类

解耦代码,减少冗余代码,便于维护

(1)db.properties

Driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT
username=root
password=123456

(2)JDBCUtils.java

package com.jing.utils;

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

public class JDBCUtils {

    private static String driver = null;
    private static String url = null;
    private static String username = null;
    private static String password = null;

    static {

        try {
            // 利用反射获取类对象,然后获取JDBCUtils的类加载器,然后读取资源
            InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");
            // Properties是HashTable的子类,所以本质上也是一种双列集合,不是什么特殊的东西
            Properties properties = new Properties();
            // 将输入流中的数据以键值对的形式存储到集合中
            properties.load(in);

            // 根据属性获取值
            driver = properties.getProperty("Driver");
            url = properties.getProperty("url");
            username = properties.getProperty("username");
            password = properties.getProperty("password");

            // 加载驱动,只需加载一次,所以放在静态代码块中
            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    // 获取连接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,username,password);
    }

    // 释放资源
    public static void release(Connection conn, Statement stm, ResultSet rs){
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(stm != null){
            try {
                stm.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

(3)JDBCDemo02.java

package com.jing.jdbc;

import com.jing.utils.JDBCUtils;

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

public class JDBCDemo02 {
    public static void main(String[] args){
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;


        try {
            // 利用工具类获取数据库连接
            connection = JDBCUtils.getConnection();
            // 获取SQL语句执行对象
            statement =  connection.createStatement();
            // 编写查询语句,并执行
            String sql = "SELECT * FROM sys_user";
            resultSet = statement.executeQuery(sql);
            while (resultSet.next()){
                System.out.print("id=" + resultSet.getObject("id") + " ");
                System.out.println("username=" + resultSet.getObject("username") + " ");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(connection,statement,resultSet);
        }
    }
}

        结果 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值