如何使用Java操作数据库?一文帮你搞懂Java的JDBC编程

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

1. 概念

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


2. JDBC的工作原理

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


JDBC访问数据库层次结构:

image.png


JDBC优势:


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


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


· 程序的可移植性大大增强


3. JDBC的使用

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


在项目中创建文件夹lib,并将依赖包mysql-connector-java-5.1.47.jar复制到lib中。再配置该jar

包到本项目的依赖中:右键点击项目Open Module Settings,在Modules中,点击项目,配置

Dependencies,点击+,JARS or Directories,将该lib文件夹配置进依赖中,表示该文件夹下的

jar包都引入作为依赖。


· 建立数据库连接

//加载JDBC驱动程序:反射,这样调用初始化com.mysql.jdbc.Driver类,
            //即将该类加载到JVM方法区,并执行该类的静态方法快,静态属性
            Class.forName("com.mysql.jdbc.Driver");
            //获取数据库连接
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/blog?" + 
                    "user=root&password=xiaobai520..@@@&useUnicode=true&characterEncoding=UTF-8&useSSL=false");

       

MySQL数据库连接的URL参数格式如下:


jdbc:mysql://服务器地址:端口/数据库名?参数名=参数值


说明:


jdbc:mysql: 为协议


服务器地址:数据库主机域名或ip(本机域名为locallhost)


数据库名:为要连接的数据库名称


?后跟参数,多个参数用&间隔


· 创建操作命令(Statement)

//创建操作命令对象Statement
 Statement s = conn.createStatement();


· 执行SQL语句

ResultSet r = s.executeQuery("select id,name from student");

· 处理结果集

while(r.next()){
                int id = r.getInt("id");
                String name = r.getString("name");
                System.out.printf("id=%s name=%s\n",id,name);
            }

· 释放资源(关闭结果集,命令,连接)


注意:释放资源的顺序和创建的顺序相反,无论jdbc操作成功还是出现异常,都要释放资源,所以要考虑出现异常对象还没有完成初始化还是null情况

// 关闭结果集
 if(r != null){
            try{
                r.close();
            } catch(SQLException e){
                e.printStackTrace();
            }
        }
// 关闭操作命令
 if(S != null){
            try{
                S.close();
            } catch(SQLException e){
                e.printStackTrace();
            }
        }
//关闭连接
 if(conn != null){
            try{
                conn.close();
            } catch(SQLException e){
                e.printStackTrace();
            }
        }


JDBC步骤总结:


1. 创建数据库连接Connection


2. 创建操作命令Statement


3. 使用操作命令来执行SQL


4. 处理结果集ResultSet


5. 释放资源(顺序与创建时相反)


4. 数据库连接Connection

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


1. DriverManager驱动管理类的静态方法获取

Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(url);


2. 通过DataSource(数据源)对象获取。实际应用中会使用DataSource对象

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


区别:


1.  DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源

时,通过connection.close()都是关闭物理连接。


2. DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接

是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将

Conncetion连接对象回收。


5. Statement对象

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


Statement:


· 用于执行不带参数的简单SQL语句


PreparedStatement:


· 用于执行简单不带参数的简单SQL语句


· SQL语句会预编译在数据库系统


· 执行速度快于Statament对象


CallableStatement:


· 用于执行数据库存储过程的调用


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


1. 参数化SQL查询


2. 性能比Statement高


3. SQL预编译


4. 阻止常见SQL攻击


5. 占位符:?下标从1开始


6. 占位符不能使用多值


主要掌握两种执行SQL的方法:


1. executeQuery() 方法执行后返回单个结果集,通常用于select语句


2. executeUpdate() 方法返回值是一个整数,值受影响的行数,通常用于update,insert,delete语句


6. SQL注入及占位符的举例说明

看这样的例子:一张学生表中有id和姓名,我们通过预编译的方法查询某个学生


代码示例:

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Blog {
    public static void main(String[] args) throws SQLException {
        Connection conn = null; //数据库连接
        PreparedStatement ps = null; //创建预编译命令
        ResultSet r = null; //结果集
        try{
            DataSource ds = new MysqlDataSource();
            ((MysqlDataSource) ds).setURL("jdbc:mysql://localhost:3306/blog");
            ((MysqlDataSource) ds).setUser("root");
            ((MysqlDataSource) ds).setPassword("xiaobai520..@@@");
            ((MysqlDataSource) ds).setUseUnicode(true);
            ((MysqlDataSource) ds).setCharacterEncoding("UTF-8");
            ((MysqlDataSource) ds).setUseSSL(false);
            conn = ds.getConnection();
            String queryName = "小张' or '1'='1";
            String sql = "select id,name from student where name = '"+queryName+"'";
            ps = conn.prepareStatement(sql);
            r = ps.executeQuery();
            while(r.next()){
                int id = r.getInt("id");
                String name = r.getString("name");
                System.out.printf("id=%s name=%s\n",id,name);
            }
        }finally{         //反顺序释放资源
            if(r != null){
                r.close();
            }
            if(ps != null){
                ps.close();
            }
            if(conn != null){
                conn.close();
            }
        }
    }
}



1. SQL注入的说明 :


我们本想只查看小张的信息,但是因为or后面为真,所以每条信息都会遍历到

image.png



输出结果:

image.png


这就是SQL注入,在使用简单的操作命令对象,拼接sql字符串时可能会出现安全问题


2. 占位符的说明 :


为了防止SQL注入,我们使用预编译的操作命令可以使用占位符 ?,这样可以防止SQL注入还可以提高效率


我们对上面部分代码进行改造:

String queryName = "小张' or '1'='1";
 int queryId = 3;
 String sql = "select id,name from student where name = ? or id = ?";
 ps = conn.prepareStatement(sql);
 ps.setString(1,queryName);
 ps.setInt(2,queryId);

注意:set后面的类型与后面queryName,queryId相对应,占位符必须从1开始,否则会报错


输出结果:

image.png


因为queryName在表中没有找到,只有输出了id=3的这条记录


7. ResultSet对象

ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供

了对这些行中数据的访问。

ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当

前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()

方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
11月前
|
SQL Java 数据库连接
除了JDBC,还有哪些常见的数据库访问技术?
除了JDBC,还有哪些常见的数据库访问技术?
842 2
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
NoSQL Java API
在Java环境下如何进行Redis数据库的操作
总的来说,使用Jedis在Java环境下进行Redis数据库的操作,是一种简单而高效的方法。只需要几行代码,就可以实现复杂的数据操作。同时,Jedis的API设计得非常直观,即使是初学者,也可以快速上手。
531 94
|
SQL Java 中间件
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
|
人工智能 JavaScript 关系型数据库
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
618 14
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
|
人工智能 JavaScript 安全
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
1195 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
|
Java 关系型数据库 MySQL
Java汽车租赁系统源码(含数据库脚本)
Java汽车租赁系统源码(含数据库脚本)
739 4
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
2738 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
前端开发 JavaScript Java
[Java计算机毕设]基于ssm的OA办公管理系统的设计与实现,附源码+数据库+论文+开题,包安装调试
OA办公管理系统是一款基于Java和SSM框架开发的B/S架构应用,适用于Windows系统。项目包含管理员、项目管理人员和普通用户三种角色,分别负责系统管理、请假审批、图书借阅等日常办公事务。系统使用Vue、HTML、JavaScript、CSS和LayUI构建前端,后端采用SSM框架,数据库为MySQL,共24张表。提供完整演示视频和详细文档截图,支持远程安装调试,确保顺利运行。
588 17
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。