JDBC编程方法及细节

JDBC(Java Database Connectivity)是Java编程语言用于连接和操作数据库的API(Application Programming Interface)。它为开发人员提供了一组Java类和接口,用于与各种关系型数据库进行通信。使用JDBC,开发人员可以轻松地执行数据库操作,如查询、插入、更新和删除数据。

JDBC提供了一种标准的方式来连接数据库,并通过执行SQL语句与数据库进行交互。它允许开发人员使用Java代码来创建数据库连接、发送SQL语句并处理结果。通过JDBC,开发人员可以跨不同的数据库系统,如MySQL、Oracle、SQL Server等,使用相同的编程接口进行数据库操作。

1. 引入JDBC驱动包

要想使用JDBC编程要先引入MySQL的JDBC驱动包,JDBC驱动包就是Java对于数据库原生接口的封装,这种驱动包属于第三方库并不包含在JDK中 ,所有需要把它下载下来并且引入项目中。

1.1 下载方法

打开网站:https://mvnrepository.com/

点击上方的搜索框,输入 mysql 然后点击 Search 

然后点击如下图第二个搜索结果

然后来到如下界面,向下找到对应自己的MySQL版本,然后点击版本号进去

然后点击如图所示的jar即可下载

1.2 引入项目

1. 先创建一个项目

2. 右键图中的.idea然后点检 新建 / 目录

命名可任意,一般命名为lib

3. 将下载好的jdbc驱动包复制然后粘贴到新建的目录中

 3. 右击目录 点击添加到库 然后点击确定即可

2. JDBC编程步骤

2.1 创建数据源

数据库是服务器,服务器可能可能在这台主机上,也可能在其他主机上,我们要明确这个服务器的位置才能对其进行操作

数据源就是描述你要操作的数据库在哪里

这里Java是通过  IP地址 + 端口号 + 数据库名 来定位数据库位置的 

 解释:

  • IP地址: IP地址是描述一台主机在网络上的位置的机制,通常由一串数字组成 
  • 端口号:一台主机上有很多服务程序,使用端口号区分不同的服务程序 

 注意:

127.0.0.1 是一个特殊的IP地址,叫做环回IP(loopback)表示本机

MySQL默认的端口号为3306

代码:

//1.创建数据源
DataSource dataSource = new MysqlDataSource();
//解释,DataSource 是Java JDBC 中原生的API接口,MysqlDataSource 是我们安装的驱动包中的内容
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java1124?characterEncoding=utf8&uesSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");

解释: 

1. ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java1124?characterEncoding=utf8&uesSSL=false");

  1. jdbc:mysql://:表示使用JDBC连接到MySQL数据库。
  2. 127.0.0.1:表示数据库服务器的IP地址,这里为本地主机。
  3. 3306:表示MySQL数据库服务器的端口号,一般情况下默认为3306。
  4. java1124:表示要连接的具体数据库名称。
  5. ?characterEncoding=utf8&uesSSL=false:表示额外的连接参数。characterEncoding=utf8:指定字符编码为UTF-8,确保正确处理中文等特殊字符。useSSL=false:禁用SSL连接

2. ((MysqlDataSource)dataSource).setUser("root");

这行代码设置了数据库连接的用户名。同样是将dataSource转换为MysqlDataSource类型,然后调用setUser()方法,将数据库连接的用户名设置为root,这是一个常见的MySQL数据库的默认用户名,拥有所有权限

3. ((MysqlDataSource)dataSource).setPassword("123456");

这行代码设置了数据库连接的密码。同样是将dataSource转换为MysqlDataSource类型,然后调用setPassword()方法,将数据库连接的密码设置为123456,这是与用户名对应的数据库连接密码,即我们安装MySQL时自己设置的密码

2.2 和数据库服务器建立连接 

//2.和数据库服务器建立连接 
Connection connection = dataSource.getConnection();
//注意这里的Connection要使用java.sql包下的Connection
//使用getConnection()方法会抛出一个SQLException异常记得捕获或者抛出这个异常

2.3 构建一个SQL语句

1. 创建一个字符串类型的SQL语句

 //注意末尾不需要加“;” 
String sql = "insert into student values(1, 'Ting')";

2 .将String类型的SQL语句转化为语句对象

//将String类型的SQL语句转化为语句对象
PreparedStatement statement = connection.prepareStatement(sql);

注意:还有一个 Statement接口也可以完成该操作,但是他们有一些区别如下:

  1. 创建方式:

    • Statement: 通过Connection对象的createStatement()方法创建。
    • preparedStatement:通过Connection对象的preparedStatement()方法创建,需要传入SQL语句作为参数。
  2. 预编译:

    • Statement:不进行预编译,每次执行SQL语句时都会将SQL语句发送给数据库进行解析和编译。
    • preparedStatement:在创建时进行了预编译,即SQL语句被发送到数据库进行解析和编译,并生成可复用的执行计划。这样,在后续的执行过程中,只需要传递参数即可,无需重新解析和编译SQL语句,提高了执行效率。
  3. 参数设置:

    • Statement:执行SQL语句时,无法使用参数化查询,所有的参数值都必须通过字符串拼接的方式直接嵌入SQL语句中。
    • preparedStatement:支持参数化查询,可以使用占位符(如?)代替具体的参数值,然后通过调用setXXX()方法设置参数的值。
  4. 防止SQL注入:

    • Statement:由于无法参数化查询,容易受到SQL注入攻击。因为参数值直接嵌入到SQL语句中,如果参数值未经过正确的处理,可能会导致安全漏洞。
    • preparedStatement:使用参数化查询,可以有效预防SQL注入攻击。参数值在设置时会被正确处理,不会直接嵌入到SQL语句中,从而提高了安全性。

 2.4 把构造好的SQL语句发送给服务器执行

增删改操作使用 :executeUpdate() 方法 返回值为int类型 即为影响的行数。

查询操作使用:executeQuery() 方法 返回值为 ResultSet 为一个结果集 

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

 2.5 释放资源

Connection connection 和 PreparedStatement statement 是需要释放资源的,

因为它们占据了一些计算机重要的软/硬件资源

 DataSource dataSource 不需要释放,因为它只储存了 一些信息

使用close() 方法释放资源 

//注意释放顺序要与创建顺序相反
statement.close();
connection.close();

 2.6 问题

在 2.3 中我们发现我们的SQL语句是写死的 如果要插入其他内容又需要重新修改代码,显然这样是不科学的

解决方案:

1. 字符串拼接

在构造SQL语句时我们使用字符串拼接的方式来构造

String sql = "insert into student values(" + id + ", '" + name + "')";

这样就把插入的内容改为可由用户输入了,避免了修改代码

但是这样写任然存在一些问题

1.出的代码太过冗余杂乱

2.有sql注入攻击的风险

例如:用户在输入时 输入 "  ');drop database;"

 

2. 使用 preparedStatement 提供的占位符

String sql = "insert into student values(?, ?)";
//将String类型的SQL语句转化为语句对象
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);//把第一个 ? 设置为 id
statement.setString(2, name);//把第二个 ? 设置为 name

 2.7 查询

构造查询语句与增删改略有不同,注意查询结果的打印方式即可

    public static void main(String[] args) throws SQLException {//构造数据源DataSource datasource = new MysqlDataSource();((MysqlDataSource)datasource).setUrl("jdbc:mysql://127.0.0.1:3306/java1124?characterEncoding=utf8&useSSL=false");((MysqlDataSource)datasource).setUser("root");((MysqlDataSource)datasource).setPassword("123456");//连接数据库Connection connection = datasource.getConnection();//构造SQL语句String sql = "Select * from student";PreparedStatement statement = connection.prepareStatement(sql);//发送到服务器执行ResultSet result = statement.executeQuery();while(result.next()){int id = result.getInt("id");String name = result.getString("name");System.out.println(id + " " + name);}//释放资源result.close();statement.close();connection.close();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/216014.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

点大商城V2.5.3分包小程序端+小程序上传提示限制分包制作教程

这几天很多播播资源会员反馈点大商城V2.5.3小程序端上传时提示大小超限,官方默认单个包都不能超过2M,总分包不能超20M。如下图提示超了93KB,如果出现超的不多情况下可采用手动删除一些images目录下不使用的图片,只要删除超过100KB…

git提交报错error: failed to push some refs to ‘git url‘

1.产生错误原因 想把本地仓库提交到远程仓库,报错信息如下 git提交报错信息 error: src refspec master does not match any error: failed to push some refs to git url 错误原因: 我们在创建仓库的时候,都会勾选“使用Reamdme文件初始化…

发送一个网络数据包的过程解析

在 ip_queue_xmit 中,也即 IP 层的发送函数里面,有三部分逻辑。第一部分,选取路由,也即我要发送这个包应该从哪个网卡出去。 这件事情主要由 ip_route_output_ports 函数完成。接下来的调用链为:ip_route_output_port…

apipost接口200状态码,浏览器控制台500状态码

后端 url 登录login方法 login(){this.$refs.loginForm.validate(async valid > {if (!valid) return// 由于data属性是一个json对象,需要进行解构赋值{data:result},进行状态码判断const {data: result} await this.$http.post(/api/doLogin,this.…

《使用Python将Excel数据批量写入MongoDB数据库》

在数据分析及处理过程中,我们经常需要将数据写入数据库。而MongoDB作为一种NoSQL数据库,其具有强大的可扩展性、高性能以及支持复杂查询等特性,广泛用于大规模数据存储和分析。在这篇文章中,我们将使用Python编写一个将Excel数据批…

老牌开源 SVG 编辑器 SVGEdit 是如何架构的?

大家好,我是前端西瓜哥。这次简单看看 SVGEdit 的架构。 SVGEdit 的版本为 7.2.0。 SVGEdit 一款非常老牌的 SVG 图形编辑器,用于编辑处理 SVG,start 数目前是 5.8k。 它的优点在于经过多年的开发,完成度高,较为成熟&a…

javascript判断是否是json格式

文章目录 一、问题二、解决三、总结3.1、定义 一、问题 工作中有用到JSON.parse这个来解析JSON字符串,这个时候突然有一次遇到JSON字符串是长串数字或数字字符串,主要是自己也没兼容好,就导致了一长串数字JSON.parse之后变成了e24等数字。主…

基于孔雀算法优化概率神经网络PNN的分类预测 - 附代码

基于孔雀算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于孔雀算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于孔雀优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络的光滑…

吴恩达《机器学习》10-1-10-3:决定下一步做什么、评估一个假设、模型选择和交叉验证集

一、决定下一步做什么 在机器学习的学习过程中,我们已经接触了许多不同的学习算法,逐渐深入了解了先进的机器学习技术。然而,即使在了解了这些算法的情况下,仍然存在一些差距,有些人能够高效而有力地运用这些算法&…

Axios 拦截器 请求拦截器 响应拦截器

请求拦截器 相当于一个关卡,如果满足条件就放行请求,不满足就拦截 响应拦截器 在处理结果之前,先对结果进行预处理,比如:对数据进行一下格式化的处理 全局请求拦截器 axios.interceptors.request.use(config > { /…

网站监控是什么

在当今高度互联的世界中,网站已成为企业和个人成功的关键因素。无论是提供产品或服务,还是建立品牌形象,网站都是不可或缺的工具。然而,随着互联网用户对访问速度和用户体验的高要求,保持网站的稳定性和可用性变得至关…

centos系统下,docker安装sqlserver并用本地Navicat连接

文章目录 一,centos下安装docker二,docker安装sqlserver20192.1 安装遇到的问题2.1.1 修改用户名进不去数据库2.1.2 安装2022版的sqlserver发现启动失败 三,Navicat连接centos下的sqlserver3.1 下载ODBC Driver 参考微软网址: 使…