Java的JDBC编程

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Java的JDBC编程

数据库编程的必备条件

1.编程语言(java, c++, python)

2.数据库(Oracle, MySQL, SQL Server)

3.数据库驱动包:代码操作数据库的前提,是数据库要提供api,调用api可以完成(Application Programming Interface应用程序接口).不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提供了Java的驱动包mysql-connector-java,需要基于Java操作MySQL即需要该驱动包.

Java的数据库编程:JDBC

JDBC,即Java Database Connectivity,java数据库连接.是一种用于执行SQL语句的Java API,它是Java中数据库连接规范.这个api由java.sql.*, javax.sql.*包中的一些类和接口组成,它为java开发人员操作数据库提供了一个标准的api,可以为多种关系数据库提供统一访问.

JDBC工作原理

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

JDBC访问数据库的层次结构:

JDBC优势:

Java语言访问数据库操作完全面向抽象接口编程.

开发数据库应用不用限定在特定数据库厂商的API

程序的可移植性大大增强

JDBC使用(流程中的新内容后面会讲)

在使用JDBC前,先了解一下这几个关键的概念:

1.DataSource数据源,描述了数据库在哪

2.Collection连接,需要先建立连接,才能建立通信,基于DataSource构造出来,知道服务器在哪才能进行连接

3.PreparedStatement语句,是基于连接生成的,当前语句对象也是发送给服务器的

JDBC开发案例

准备工作:

准备数据库驱动包,并添加到项目的依赖中:

在项目中创建文件夹 lib ,并将依赖包 mysql-connector-java-5.1.47.jar 复制到 lib 中。再配置该 jar包到本项目的依赖中:右键点击项目Open Module Settings ,在 Modules 中,点击项目,配置Dependencies,点击 + JARS or Directories ,将该 lib 文件夹配置进依赖中,表示该文件夹下的jar包都引入作为依赖。

1.创建数据源,描述你要操作的数据库,在哪里

DataSource dataSource = new MysqlDataSource();
//数据库定位
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/practice3?characterEncoding=utf8&useSSL=false");
//用户名(所有的均设为root)
((MysqlDataSource) dataSource).setUser("root");
//密码(你的数据库设置的密码)
((MysqlDataSource) dataSource).setPassword("550407");
 

通过:ip地址 + 端口号 + 数据库名来定位

ip地址:用来描述一个主机在网络上位置的机制,一般由数字构成(这里的127.0.0.1是一种特殊的ip地址,叫做环回ip,表示本机)

端口号:服务器默认的3306端口号.

这个URL可以不用记,直接套用"jdbc:mysql://127.0.0.1:3306/数据库名?characterEncoding=utf8&useSSL=false"

2.和数据库进行连接

Connection connection = dataSource.getConnection();

3.构造sql语句

String sql = "insert into student(id, name) values (1, '张三')";

将sql转换为PreparedStatement对象,该对象也是基于连接生成的,毕竟连接后才能将语句发送给服务器.

PreparedStatement statement = connection.preparedStatement(sql);

4.将构造好的语句发送给MySQL执行

int n = statement.executeUpdate();
System.out.println("n = " + n);

此时代码就会构造出一个网络请求,发送给mysql服务器(此时这个代码就扮演了数据库客户端的角色),并且会等待服务器响应的数据,把最终的相应展示到控制台上.

其中n就是操作影响的行数,executeUpdate()后面介绍.

5.释放资源

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

在之前写程序中,创建一个变量,也是会占用内存空间等资源的,我们之所以没有手动释放,是因为JVM的垃圾回收机制(GC).而这两个设计数据库操作的对象的创建,JVM并不会回收,而又因为它们占据了一些计算机重要的软硬件资源,所以就需要进行手动释放.

注意:释放时的顺序,是和创建时的顺序相反的,哪个先创建,哪个就后释放.

让我们看一下完整的代码

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
 
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
 
public class Testjdbc {
    public static void main(String[] args) throws SQLException {
        //1.创建数据源,数据源描述了你要的数操作据库,在哪里~~
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/practice2?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("550407");
 
        //2.和数据库服务器建立连接(需要通过Connection建立连接,才能进行通信,基于DataSource构造出来)
        Connection connection = dataSource.getConnection();
 
        //3.构造sql
        String sql = "insert into student values (3, '王五')";
        //把String语句转为语句对象(PreparedStatement语句也是基于连接而生成的,毕竟连接后才能将语句发送给服务器)
        PreparedStatement statement = connection.prepareStatement(sql);
 
        //4.将构造好的sql发送给服务器执行
        int n = statement.executeUpdate();
        System.out.println("n =" + n);
 
        //5.释放一些必要的资源(连接Connection和连接中的语句PreparedStatement)因为它们持有计算机中重要的软硬件资源,释放和创建的顺序相反
        statement.close();
        connection.close();
    }
}

使用步骤总结

1.创建数据源,DataSource数据源描述了你要操作的数据库在哪

2.和数据库服务器进行连接

3.构造一个sql,需要将sql转换为语句对象

4.把构造的sql发送给服务器去执行

5.释放一些必要的资源

JDBC常用的接口和类

JDBC API

在java JDBC编程中对应的数据库操作统一使用JDK自带的API统一处理,通常与特定数据库的驱动类是完全解耦的.所以掌握java JDBC API(位于java.sql包下)即可掌握java数据库编程.

数据库连接Connection

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

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

// 加载 JDBC 驱动程序

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

// 创建数据库连接

Connectionconnection = DriverManager . getConnection ( url );

另一种就上上文中用到的DataSource(数据源)对象获取,实际应用中会使用DataSource对象.

DataSourceds = new MysqlDataSource ();

(( MysqlDataSource ) ds ). setUrl ( "jdbc:mysql://localhost:3306/test" );

(( MysqlDataSource ) ds ). setUser ( "root" );

(( MysqlDataSource ) ds ). setPassword ( "root" );

Connectionconnection = ds . getConnection ();

以上两种的区别是:

1.DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接.

2.DataSource提供连接池的支持(因此推荐使用DataSource).连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接,每次使用完数据库连接,释放资源调用connection.close()都是将Connection连接对象回收.

Statement对象

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

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

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

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

实际开发中常用的是PreparedStatement对象,以下是对其的总结:

1.参数化SQL查询

2.占位符不能使用多值

3.占位符: ? ,下标从1开始,根据占位的位置依次向后+1递增

4.阻止常见SQL注入攻击

5.SQL预编译:在创建时编译SQL语句,提前将SQL解析好,将解析结果发送给服务器

6.性能比Statement高

以下是占位符的使用举例:

先利用scanner接收要输入的变量:

Scanner sc = new Scanner(System.in);
System.out.println("请输入id");
int id = sc.nextInt();
System.out.println("请输入name");
String name = sc.next();

在后面构造sql语句中用占位符替换原来直接放入的内容.

String sql = "insert into student values (?, ?)";
//需要将sql转换为语句对象
PreparedStatement statement = connection.prepareStatement(sql);

接收实际输入的部分,插入到语句中:

statement.setInt(1,id);
statement.setString(2,name);

然后,我们要主要掌握两种SQL的方法:

(1)executeQuery()方法执行后返回单个结果集的,通常用于select语句(专门用来查询)

(2)executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于Update,insert,delete语句(可执行增删改)

问题:PreparedStatement和Statement有什么区别?

1.预编译:Statement采用普通的SQL查询,每次执行都需要解析SQL语句,编译一次.这可能导致性能上的开销.      Preparement:在创建时预编译SQL语句,提前将SQL语句解析好,将解析的结果发送给服务器,服务器解析的开销就会大幅降低(直接执行即可)

2.性能:Statement:每次执行都需要编译SQL语句,可能存在一定的性能开销.        PreparedStatement:由于预先编译了SQL语句,多次执行同一个SQL语句时性能最好

3.可读性与维护性:Statement:由于参数通常是通过字符串拼接方式添加到SQL语句中,可能使SQL语句可读性差,并且容易出现拼写错误.    Preparedment:参数的设置通过占位符的方式.使SQL更加清晰,减少了出错的可能性.

4.防止SQL注入攻击:Statement:字符串拼接参数的方式容易受到SQL注入攻击,因为参数未严格处理.         PreparedStatement:使用参数化查询,可以有效防止SQL注入攻击,因为参数会被安全处理.

ResultSet对象

ResultSet对象它被称为结果集,它代表符合SQL语句的所有行,并且它通过一套getXXX方法提供了对这些行中数据的访问.

ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行.如下图:可以看成是这样遍历的(遍历完一行以后箭头向下移动).

我们只能来操作当前数据行.我们如果想取得某一条记录,就需要使用ResultSet的next()方法(类似于迭代器),如果我们想要得到ResultSet中的所有记录,就应该使用while循环.

代码举例如下:

ResultSet resultSet = statement.executeQuery();
while(resultSet.next()) {
    //这个代码,就是获取"id"这一列的数值,期望得到了一个int
    int id = resultSet.getInt("id");
    //这个代码,就是获取"name"这一列的数值,期望得到一个String
    String name = resultSet.getString("name");
    System.out.println("id : " + id);
    System.out.println("name : " + name);
}

其中resultSet就是结果集合,代表了查询返回的临时表.

相关文章
|
2月前
|
Java 程序员 应用服务中间件
【高薪程序员必看】万字长文拆解Java并发编程!(2 2-2)
📌 核心痛点暴击:1️⃣ 面了8家都被问synchronized锁升级?一张图看懂偏向锁→重量级锁全过程!2️⃣ 线程池参数不会配?高并发场景下这些参数调优救了项目组命!3️⃣ volatile双重检测单例模式到底安不安全?99%人踩过的内存可见性大坑!💡 独家亮点抢先看:✅ 图解JVM内存模型(JMM)三大特性,看完再也不怕指令重排序✅ 手撕ReentrantLock源码,AQS队列同步器实现原理大揭秘✅ 全网最细线程状态转换图(附6种状态转换触发条件表)
65 0
|
2月前
|
存储 缓存 Java
【高薪程序员必看】万字长文拆解Java并发编程!(5):深入理解JMM:Java内存模型的三大特性与volatile底层原理
JMM,Java Memory Model,Java内存模型,定义了主内存,工作内存,确保Java在不同平台上的正确运行主内存Main Memory:所有线程共享的内存区域,所有的变量都存储在主存中工作内存Working Memory:每个线程拥有自己的工作内存,用于保存变量的副本.线程执行过程中先将主内存中的变量读到工作内存中,对变量进行操作之后再将变量写入主内存,jvm概念说明主内存所有线程共享的内存区域,存储原始变量(堆内存中的对象实例和静态变量)工作内存。
97 0
|
2月前
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
66 0
|
1月前
|
Java 数据库连接 API
2025 更新必看:Java 编程基础入门级超级完整版指南
本教程为2025更新版Java编程基础入门指南,涵盖开发环境搭建(SDKMAN!管理JDK、VS Code配置)、Java 17+新特性(文本块、Switch表达式增强、Record类)、面向对象编程(接口默认方法、抽象类与模板方法)、集合框架深度应用(Stream API高级操作、并发集合)、模式匹配与密封类等。还包括学生成绩管理系统实战项目,涉及Maven构建、Lombok简化代码、JDBC数据库操作及JavaFX界面开发。同时提供JUnit测试、日志框架使用技巧及进阶学习资源推荐,助你掌握Java核心技术并迈向高级开发。
154 5
|
2月前
|
JavaScript 前端开发 Java
Java 编程进阶实操中工具集整合组件封装方法与使用指南详解
本文详细介绍Hutool工具集和图书管理系统相关组件的封装方法及使用示例。通过通用工具类封装(如日期格式化、字符串处理、加密等)、数据库操作封装(结合Hutool DbUtil与MyBatis)、前端Vue组件封装(图书列表与借阅表单)以及后端服务层封装(业务逻辑实现与REST API设计),帮助开发者提升代码复用性与可维护性。同时,提供最佳实践建议,如单一职责原则、高内聚低耦合、参数配置化等,助力高效开发。适用于Java编程进阶学习与实际项目应用。
115 10
|
1月前
|
Oracle Java 关系型数据库
java 编程基础入门级超级完整版教程详解
这份文档是针对Java编程入门学习者的超级完整版教程,涵盖了从环境搭建到实际项目应用的全方位内容。首先介绍了Java的基本概念与开发环境配置方法,随后深入讲解了基础语法、控制流程、面向对象编程的核心思想,并配以具体代码示例。接着探讨了常用类库与API的应用,如字符串操作、集合框架及文件处理等。最后通过一个学生成绩管理系统的实例,帮助读者将理论知识应用于实践。此外,还提供了进阶学习建议,引导学员逐步掌握更复杂的Java技术。适合初学者系统性学习Java编程。资源地址:[点击访问](https://pan.quark.cn/s/14fcf913bae6)。
152 2
|
2月前
|
前端开发 Java 数据库连接
Java 编程进阶实操之工具集整合应用指南
本文聚焦Java编程进阶实操,涵盖并发编程、性能优化及数据库操作优化等核心知识点,并结合Hutool、Postman、Git等实用工具,提供从理论到实践的学习路径。通过小型图书管理系统实战项目,详细解析技术选型与实现步骤,助力开发者掌握Spring Boot、MyBatis等框架应用。同时展望Java新特性与技术趋势,为职业发展奠定基础。资源链接:[点此获取](https://pan.quark.cn/s/14fcf913bae6)。
68 1
|
2月前
|
Java 开发者
Java编程实用技巧:提升代码质量与开发效率
Java作为一门成熟且广泛应用的编程语言,掌握一些实用技巧可以显著提高开发效率和代码质量。以下是值得Java开发者掌握的实用技巧:
62 6
|
1月前
|
缓存 安全 算法
2025 年 Java 秋招面试必看 Java 并发编程面试题实操篇
Java并发编程是Java技术栈中非常重要的一部分,也是面试中的高频考点。本文从基础概念、关键机制、工具类、高级技术等多个方面进行了介绍,并提供了丰富的实操示例。希望通过本文的学习,你能够掌握Java并发编程的核心知识,在面试中取得好成绩。同时,在实际工作中,也能够运用这些知识设计和实现高效、稳定的并发系统。
46 0

热门文章

最新文章