后台(06)——JDBC

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制Android多分...

探索Android软键盘的疑难杂症
深入探讨Android异步精髓Handler
详解Android主流框架不可或缺的基石
站在源码的肩膀上全解Scroller工作机制


Android多分辨率适配框架(1)— 核心基础
Android多分辨率适配框架(2)— 原理剖析
Android多分辨率适配框架(3)— 使用指南


自定义View系列教程00–推翻自己和过往,重学自定义View
自定义View系列教程01–常用工具介绍
自定义View系列教程02–onMeasure源码详尽分析
自定义View系列教程03–onLayout源码详尽分析
自定义View系列教程04–Draw源码分析及其实践
自定义View系列教程05–示例分析
自定义View系列教程06–详解View的Touch事件处理
自定义View系列教程07–详解ViewGroup分发Touch事件
自定义View系列教程08–滑动冲突的产生及其处理


版权声明


本文简介

本文主要介绍JDBC的基础知识及其用法。


JDBC简介

JDBC(java database connectivity)是SUN公司提供的一套利用Java语言操作数据库的标准规范。
在JDBC中定义了许多接口而数据库厂商在其数据库驱动中实现了这些接口。关于JDBC与数据库驱动的关系,请参见下图:

这里写图片描述

JDBC中定义的接口(规范),各数据库厂商(比如MySQL,Oracle,DB2等)在其数据库驱动中实现了这些接口(规范)。所以,JDBC屏蔽了Java与不同数据库打交道的细节问题;假如项目原本使用的是MySQL,在某段时间后换成了Oracle,那我们基本不用去修改原来项目中的SQL语句,只需要把JDBC中MySQL的数据库驱动切换成Oracle对应的数据库驱动即可。

JDBC的核心技术点:

  • DriverManager:用于加载驱动
  • Connection: 用于创建与数据库的连接
  • Statement: 用于操作sql语句
  • ResultSet: 结果集或一张虚拟表

JDBC的操作步骤:

  • 加载驱动
  • 创建连接
  • 创建Statement对象
  • 执行sql语句且返回结果
  • 处理结果
  • 关闭资源

嗯哼,在了解这些之后我们来看一个简单的示例,代码如下:

package cn.com;

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

import org.junit.Test;
/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class UnitTest {
    @Test
    public void testJDBC1() {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");
            statement = connection.createStatement();
            String sql = "select * from student";
            resultSet = statement.executeQuery(sql);
            while (resultSet.next()) {
                Student student = new Student();
                int id = resultSet.getInt("studentid");
                String name = resultSet.getString("studentname");
                student.setStudentID(id);
                student.setStudentName(name);
                System.out.println(student);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                resultSet = null;
            }

            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                statement = null;
            }

            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                connection = null;
            }
        }

    }

}

在该示例中,利用JDBC从数据库查询数据。代码解析如下:

  • 第一步:
    加载MySQL数据库驱动,请参见代码第22行
  • 第二步:
    创建与数据的连接,请参见代码第23行
  • 第三步:
    创建用于执行SQL语句的Statement对象,请参见代码第24行
  • 第四步:
    利用Statement执行SQL语句且得到结果集,请参见代码第26行
  • 第五步:
    处理结果集,请参见代码第27-34行
  • 第六步:
    关闭资源,请参见代码第37-64行

详解JDBC常用类和接口

通过刚才的例子,我们对于JDBC的使用有了初步的了解和认知,现在此基础上详解JDBC常用的类和接口

java.sql.Drivermanager类

java.sql.Drivermanager类用于加载(注册)驱动和与数据库建立连接。

  • 利用java.sql.Drivermanager类用于加载(注册)驱动

    在此,我们采用的是:

    Class.forName(“com.mysql.jdbc.Driver”);

    还有另外一种方式:

    DriverManager.registerDriver(new com.mysql.jdbc.Driver());

    该方式不但强烈依赖数据库的驱动jar而且会导致驱动被重复注册2次。故不建议使用该方式

  • 利用java.sql.Drivermanager类与数据库建立连接

    比如,该示例中:

    DriverManager.getConnection(“jdbc:mysql://localhost:3306/db1”,”root”, “root”);

    其中jdbc表示协议,mysql表示子协议,localhost代表IP,3306表示端口号,db1表示要连接的数据库,第一个root表示用户名,第二个root表示密码。这些值是我示例中的配置,在项目中使用时请替换这些值。

java.sql.Connection接口

java.sql.Connection是一个接口,它用于与数据库交互;各数据库驱动中均实现了该接口。java.sql.Connection最常用的操作是创建用于执行SQL语句的Statement,即:

connection.createStatement();

java.sql.Statement接口

java.sql.Statement接口用于操作SQL语句并返回相应的结果集;各数据库驱动中均实现了该接口。java.sql.Statement的常用方法如下:

  • executeQuery(String sql)
    该方法用于执行select语句并根据查询语句返回结果集
  • executeUpdate(String sql)
    该方法用于执行insert、update、delete语句并返回受影响的行数
  • execute(String sql)
    此方法可以执行任意SQL语句。当且仅当执行select语句且有返回结果时该方法返回true, 其他情况下该方法返回false

java.sql.ResultSet接口

java.sql.ResultSet用于保存执行SQL语句之后得到的结果集;各数据库驱动中均实现了该接口。

ResultSet对外暴露一个游标,该游标默认指向结果集第一行之前。ResultSet常见方法释义如下:

boolean next()

将游标从当前位置向下移动一行

boolean previous()

将光标移动到此ResultSet对象的上一行。

void afterLast()

将光标移动到末尾,正好位于最后一行之后。

void beforeFirst()

将光标移动到开头,正好位于第一行之前。

Object getObject(int columnIndex);

根据序号取值,索引从1开始

Object getObject(String ColomnName);

根据列名取值

int getInt(int colIndex)

以int形式获取ResultSet结果集当前行指定列号值

int getInt(String colLabel)

以int形式获取ResultSet结果集当前行指定列名值

float getFloat(int colIndex)

以float形式获取ResultSet结果集当前行指定列号值

float getFloat(String colLabel)

以float形式获取ResultSet结果集当前行指定列名值

String getString(int colIndex)

以String形式获取ResultSet结果集当前行指定列号值

String getString(String colLabel)

以String形式获取ResultSet结果集当前行指定列名值

Date getDate(int columnIndex);

以Date形式获取ResultSet结果集当前行指定列号值

Date getDate(String columnName);

以Date形式获取ResultSet结果集当前行指定列号值

void close()

关闭ResultSet对象

在从ResultSet中获取到数据库中数据后,我们就将这些数据封装到JavaBean中;在此请注意Java的数据类型与数据库的数据类型的对应关系:

这里写图片描述


利用preparedStatement防止SQL注入

preparedStatement(预编译对象)是Statement的子类,它具有如下特点:

  • 预先编译SQL语句
  • 性能优异
  • 在SQL语句中使用占位符

在此利用preparedStatement优化刚才的示例,代码如下:

package cn.com;

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

import org.junit.Test;
/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class UnitTest {
    @Test
    public void testJDBC2() {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");
            String sql = "select * from student where studentid=? and studentname=?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1, 4);
            preparedStatement.setString(2, "波少野结衣");
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                Student student = new Student();
                int id = resultSet.getInt("studentid");
                String name = resultSet.getString("studentname");
                student.setStudentID(id);
                student.setStudentName(name);
                System.out.println(student);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                resultSet = null;
            }

            if (preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                preparedStatement = null;
            }

            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                connection = null;
            }
        }

    }

}

至此,关于JDBC的基础知识就介绍完了,谢谢。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL 存储 缓存
新年迈出Java后台服务器与数据库交互第一步&2022最新通用Java8&jdbc8连接mysql8数据库进行增删改查等基本操作详解(IDEA),jar包导入,图片等文件流,批量操作
新年迈出Java后台服务器与数据库交互第一步&2022最新通用Java8&jdbc8连接mysql8数据库进行增删改查等基本操作详解(IDEA),jar包导入,图片等文件流,批量操作
149 0
新年迈出Java后台服务器与数据库交互第一步&2022最新通用Java8&jdbc8连接mysql8数据库进行增删改查等基本操作详解(IDEA),jar包导入,图片等文件流,批量操作
|
2月前
|
Java 关系型数据库 MySQL
mysql5.7 jdbc驱动
遵循上述步骤,即可在Java项目中高效地集成MySQL 5.7 JDBC驱动,实现数据库的访问与管理。
413 1
|
7月前
|
Java 关系型数据库 数据库连接
实时计算 Flink版操作报错之在使用JDBC连接MySQL数据库时遇到报错,识别不到jdbc了,怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
104 0
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
48 0
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
57 0
|
4月前
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
62 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
|
4月前
|
SQL Java 关系型数据库
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
172 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
|
7月前
|
Java 关系型数据库 MySQL
JDBC实现往MySQL插入百万级数据
JDBC实现往MySQL插入百万级数据
|
4月前
|
前端开发 关系型数据库 MySQL
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别
这篇文章讨论了`com.mysql.jdbc.Driver`和`com.mysql.cj.jdbc.Driver`两个MySQL驱动类的区别,指出`com.mysql.jdbc.Driver`适用于MySQL 5的`mysql-connector-java`版本,而`com.mysql.cj.jdbc.Driver`适用于MySQL 6及以上版本的`mysql-connector-java`。文章还提到了在实际使用中如何根据MySQL版本选择合适的驱动类。
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别