JDBC操作数据库的方法

news2025/7/12 7:32:26

目录

一、JDBC介绍

二、使用方法(以MySQL为例)

(1)MySQL的jar包,导入到IDEA

(2)使用代码,操作数据库

1)设置数据源

1.创建MysqlDataSource对象,使用set方法

2.关于set...()方法的填写

1*  setURL()

2* setUser()

3* setPassword()

2)和数据库建立网络连接

3)使用程序构造SQL语句

4)关闭资源

三、JDBC操作数据库的补充

1.数据的插入

*1 .字符串拼接——不安全

*2.statement.setXXX()——推荐

2.数据的查询

3.JDBC学习的重要性


一、JDBC介绍

全称:Java DataBase Connectivity——java数据库连接

我们知道数据库厂商有很多,比如Oracle 、IBM 、MySQL、SAP

不同的厂商都有数据自己较为独特的API

什么是API?

API——(Application Programming Interface,应用程序编程接口,简称接口

是一组定义了软件组件之间交互方式的规范。

它允许不同的软件系统之间进行通信和交互,使得开发者可以利用已有的功能和服务来构建自己的应用程序。

比如说咱们最熟悉的:

JAVA标准库中,提供的各种类以及类中的各种方法(PriorityQueue等),就是API。

因为是不同的厂商,他们构建的API都是不一样的。

这就导致,如果操作不同数据库,程序猿就要重新学习一套新的语法,这样就大大提高了学习成本。

为了避免这种情况,JAVA的公司(现在是Oracle公司的一部分)规定了一套规范的API,让其他的数据库厂商去遵守。

程序猿只要学会JDBC这一套API,就可以操作各种厂商的数据库了。

为什么数据库厂商那么听话?——因为JAVA市场份额很大,他是老大。

二、使用方法(以MySQL为例)

(1)MySQL的jar包,导入到IDEA

教程见连接:

(2)使用代码,操作数据库

在上面jar文件导入到IDEA后,就可以使用JAVA代码操作数据库了。

1)设置数据源

1.创建MysqlDataSource对象,使用set方法

简单来讲就是new一个MysqlDataSource的类,

使用该类的setURL()、setUser()、setPassword()方法

分别设置好要连接的那个数据库、数据库使用者、数据库的密码:

注意:URL和Url都可以:

如图,只要把红色波浪线的空格填好,这一步就完成了。

除了以上这种方式调用set方法,还有另一种常见的方式调用set方法:

这种创建方式就比较简介,好理解。

这两种创建方法褒贬不一,很难说谁好谁坏。

为什么?

想要了解为什么,需要直到什么是耦合、什么是内聚

支持方式一的人认为:

虽然代码看起来有点繁杂,类型转来转去的。

但是这种写法耦合程度更高,以后代码修改的成本会小。

因为实际的类型是父类DataSource,看不到MysqlDataSource类中的相关方法

所以在后序代码中,不用关心是使用的那个类型的数据库,这样就使得后序代码可以和MySQL解耦合了。

不过我个人认为,开发途中更换数据库是一个频率很低的事情,即使要更改,考量的范围和要做出的调整也有很多,不是十几行代码就可以完成的


支持方式二的人认为:

虽然第二种方式耦合程度变得低了,但是代码更加简洁易读啊。

更何况更改数据库是及其少数的情况,大部分情况写第二种都是非常不错的。


以上两种创建方式,见仁见智,不过两种方式都要掌握。

说我了创建,那么set...()方法中的括号如何填写呢?

2.关于set...()方法的填写
1*  setURL()
 dataSource.setURL("jdbc:mysql://127.0.0.1:3306/testjdbc?characterEncoding=utf8&useSSL=false");

URL是资源资源占位符的缩写*(Uniform Resource Locator)

用来表述网络上某一个资源的位置(类似于网址)

数据库可以理解为一种网络资源(客户端——服务器的结构)

URL具有相对固定的格式:

jdbc:mysql

描述了url的用途是什么?——是给jdbc的mysql使用的

 

127.0.0.1

IP地址,代表mysql服务器所在主机的位置


3306

叫做端口号。

端口号是用来区分一个主机上的不同应用程序的。

比如点脑上有酷狗、QQ音乐、网易云音乐,这是发来网络数据,想要把数据给到那个程序,就要用端口号来做区分。

MySQL默认安装的端口号是3306


testjdbc

它是我之前就创建的一个数据库的名字


characterEncoding=utf8

说明数据库指定的字符集是那种。


useSSL=false

代表资源是否需要加密

等于false代表把加密关掉(因为咱们的数据库不值钱,所以咱们的数据库很安全,被必要加锁)。

设置URL很重要,一步都不能错,不然后续会出问题。

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

“root”代表管理员身份。

3* setPassword()
        dataSource.setPassword("1111");

填入的字符串就是安装MySQL时,设置的数据库密码。


2)和数据库建立网络连接

通过刚才创建的对象,使用getConnection()方法:

Connection connection=dataSource.getConnection();

但是,我们直接使用这个方法,会抛出一个异常:

SQLException是一个受查异常,我们直接alt+enter抛出即可。

这样与数据库进阿里了网络连接:

关于JAVA中的异常详细介绍,知识回顾请看:JAVA中的异常

3)使用程序构造SQL语句

我们以插入一个数据行为例,这是我们stuent表的结构(id,name):

表的内容:

构造SQL语句分为两步:

1.通过字符串把代码输入(语句的分号可加可不加)

2.对代码进行预编译(预编译在MySQL服务器上也可以进行,不过为了提高性能还是在客服端上把他解析了),然后上传到服务器上执行

  //3、使用程序构造SQL语句

            //输入SQL语句    
        String sql="insert into student values(3,'王五')";

            //对sql语句进行预编译
        PreparedStatement statement=connection.prepareStatement(sql);

            //放到服务器执行预编译好的语句
         statement.executeUpdate();

注意:

只要SQL语句不是查找(是更新数据),就用statement.executeUpdate()

如果是SQL查找,用statement.executeQuery()

4)关闭资源

先创建的后关闭:

三、JDBC操作数据库的补充

1.数据的插入

数据库插入数据的写法不一定要想上面介绍的那样,把数据写死在代码里。

还有两种书写方式:

两种方式,都可以用户进行输入操作:

*1 .字符串拼接——极不推荐

拼接很简单,就是我们学过的:

//3、使用程序构造SQL语句
        String sql="insert into student values("+id+",'"+name+"')";

不推荐的原因有2:

1.代码看起来很乱,不利于维护。

2.可能会导致“sql注入攻击”。

比如有人故意使坏,输入一些特别的字符串,是的sql语句不在是之前原有的语意。而是另外一些语意,那么就会对数据库带来负面效果。

*2.statement.setXXX()——推荐

我们不再把id和name拼接到字符串中,而是把他换成占位符:

注意必须是英文的问号(?),不然程序不认识,会编译失败。

占位符类似于C语言中printf的%d这种作用。

接下来我们设置两个问号的具体参数:

 //3、使用程序构造SQL语句
        String sql="insert into student values(?,?)";

            //对sql语句进行预编译
        PreparedStatement statement=connection.prepareStatement(sql);

//使用statement自带的setXXX方法,设置?的值
        statement.setInt(1,id);
        statement.setString(2,name);

setXXX有很多类型,匹配数据列的参数即可:

setXXX的第一个参数代表当前数据位于数据行的第几列参数从1开始

这样就大功告成了,整体代码:

import com.mysql.jdbc.MySQLConnection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA
 * Description:
 * User:34398
 * Date:2024-06-07
 * Time:14:26
 */
public class Main {


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

        //1、设置数据源

//        DataSource dataSource=new MysqlDataSource();//向上转型
//        //接着又向下转型
//        ((MysqlDataSource) dataSource).setURL();
//        ((MysqlDataSource) dataSource).setUser();
//        ((MysqlDataSource) dataSource).setPassword();


        Scanner scanner=new Scanner(System.in);
        System.out.println("输入学生ID:");
        int id=scanner.nextInt();
        System.out.println("输入学生姓名:");
        String name=scanner.next();

        MysqlDataSource dataSource=new MysqlDataSource();
        dataSource.setURL("jdbc:mysql://127.0.0.1:3306/testjdbc?characterEncoding=utf8&useSSL=false");


        dataSource.setUser("root");
        dataSource.setPassword("1111");

        //2、和数据库建立网络连接
        Connection connection=dataSource.getConnection();


        //3、使用程序构造SQL语句
        String sql="insert into student values(?,?)";

            //对sql语句进行预编译
        PreparedStatement statement=connection.prepareStatement(sql);

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


            //解析后的语句放到服务器,执行
        statement.executeUpdate();

        //4、关闭资源文件
        statement.close();
        connection.close();

    }
}

2.数据的查询

如图只要在更行数据的代码基础上更改第三步即可:

测试结果:

3.JDBC学习的重要性

JDBC在实际开发中用的很少。

因为代码写起来比较的复杂。

后来就有了很多库和框架,来针对JDBC进行简化(都是基于JDBC

像Mybaits框架,就是针对JDBC简化后的组件。

这些框架的使用的确可以提高我们的开发效率,但是有使用遇到特殊的场景,这些通用的框架可能就发挥不了作用了。

需要我们利用JDBC的知识,去修改或者自己开发一个框架,来应对某些独特的场景

因此JDBC的学习非常必要!


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity每日一记】FairyGUI为什么能自动生成代码,它的好处是什么

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

GPT办公与科研应用、论文撰写、数据分析、机器学习、深度学习及AI绘图高级应用

原文链接:GPT办公与科研应用、论文撰写、数据分析、机器学习、深度学习及AI绘图高级应用https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247606667&idx3&sn2c5be84dfcd62d748f77b10a731d809d&chksmfa82606ccdf5e97ad1a2a86662c75794033d8e2e…

mmap引起的内存泄漏分析

最近遇到一个内存泄漏问题,由于问题出现在客户端,只能通过客户提供的Log来分析。 根据客户提供的/proc/meminfo数据发现,MemAvailable 由294072kB减小至18128kB,减小约269MB,引起该变化的最直接原因是PageTables由614…

Python云实例初始化和配置的工具库之cloud-init使用详解

概要 在云计算环境中,自动化配置和管理实例是非常重要的任务。cloud-init 是一个用于云实例初始化和配置的工具,广泛应用于各种云服务提供商(如 AWS、Azure、GCP 等)的实例启动过程。通过 cloud-init,用户可以在实例启动时自动执行脚本、安装软件包、配置网络等。本文将详…

20240613解决飞凌的OK3588-C的核心板的适配以太网RTL8211F-CG

20240613解决飞凌的OK3588-C的核心板的适配以太网RTL8211F-CG 2024/6/13 16:58 缘起:对于飞凌的OK3588-C的核心板,参照飞凌的底板/开发板。 ETH0空接,ETH1由RTL8211FSI-CG【20¥】更换为RTL8211F-CG【4¥】。 都是千兆网…

快速掌握 Python requests 库发送 JSON 数据的 POST 请求技巧

在现代 Web 开发中,客户端与服务器之间进行数据交换的需求越来越普遍。而在 Python 这个强大的编程语言中,requests 库是一个广泛使用且功能强大的 HTTP 请求库。特别是在进行 API 调用时,发送 POST 请求并附带 JSON 数据是一个非常常见的需求…

【React】useMemo

什么是 useMemo? useMemo 是 React 中的一个 Hook,它可以用来缓存计算结果,并在后续的渲染中重复利用这些计算结果。useMemo 接收两个参数:一个函数和一个依赖数组。当依赖数组中的任何一个值发生变化时,useMemo 会重新…

内网环境实现maven项目打包部署(包括踩坑!!)

内网环境实现maven项目打包部署&#xff08;包括踩坑&#xff01;&#xff01;&#xff09; 由于内网保密项目原因 拿我本地测试 过程&#xff1a; jdk1.8 java环境 maven setting配置加上 <!-- 仓库地址(本地上传到内网环境仓库) --> <localRepository>D:\ma…

flutter开发实战-创建一个微光加载效果

flutter开发实战-创建一个微光加载效果 当加载数据的时候&#xff0c;loading是必不可少的。从用户体验&#xff08;UX&#xff09;的角度来看&#xff0c;最重要的是向用户展示加载正在进行。向用户传达数据正在加载的一种流行方法是在与正在加载的内容类型近似的形状上显示带…

Python业务规则引擎库之rules使用详解

概要 在软件开发中,业务规则引擎是一种重要的工具,可以帮助开发者将复杂的业务逻辑从代码中解耦出来,并以更直观的方式进行管理和维护。rules 是一个轻量级的 Python 库,专门用于定义和执行业务规则。它提供了一种简洁且强大的方式来管理应用程序中的规则逻辑,使代码更加…

【Redis】安装和命令行客户端

https://www.bilibili.com/video/BV1cr4y1671t https://www.oz6.cn/articles/58 redis 非结构化有&#xff1a; 键值类型(Redis)文档类型(MongoDB)列类型(HBase)Graph:类型(Neo4j) 扩展性&#xff1a;水平即为分布式扩展 redis特征 键值&#xff08;key-value&#xff09;型…

代码签名证书的申请途径和应用场景

代码签名证书是一种安全技术&#xff0c;主要用于确保软件的完整性和来源的真实性&#xff0c;防止软件在分发过程中被篡改或植入恶意代码。它通过数字签名的方式为软件或代码提供验证&#xff0c;使得终端用户可以确信他们下载的软件确实来自声称的开发者&#xff0c;并且未被…

VMware Ubuntu 虚拟机网卡消失及解决办法

VMware Ubuntu 虚拟机网卡消失 描述原因查找解决方法 描述 在正常使用过程中重启后发现 VMware Ubuntu 虚拟机中的网卡消失了&#xff0c;使用 ifconfig 查看只能看到本地回环&#xff1a; 原因查找 使用如下命令查看是否和我这边遇到的问题一致的原因。 sudo lshw -c netwo…

mathematical-expression-cpp | C++ 数学表达式解析库

数学表达式-cpp Switch to English Document 介绍 本框架是一种针对数学公式解析的有效工具&#xff0c;能够通过C的API解析包含嵌套函数&#xff0c;包含函数&#xff0c;数列步长累加等数学公式&#xff0c;返回值是一个数值的结果对象&#xff0c;同时也可以进行比较运算…

Android面试题之ActivityManagerService的启动流程

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 SystemServer启动 创建SystemContex 用于加载系统相关的资源&#xff0c;比如theme&#xff0c;android命名空间下的资源等创建引导服务&#…

新创作活动,The Sandbox 宣布第二届 “创作者挑战”!

是时候展示你的实力了&#xff01; 继首届 “创作者挑战” 成功举办之后&#xff0c;The Sandbox 很高兴推出第二届 "创作者挑战"&#xff0c;邀请创作者再次释放他们的创造力和创业精神。本次活动从 2024 年 6 月 24 日开始至 8 月 26 日结束&#xff0c;为期 10 …

基于QT5.12.7的VTK8.2下的VS2015 X64源码编译以及测试

有一段时间没更新博客了&#xff0c;最近在考虑使用VTK作为软件的后处理显示&#xff0c;相比于OSG&#xff0c;VTK在后处理上集成了很多优秀的算法&#xff0c;使用起来比较方便&#xff0c;而且后处理一般不需要太多的交互&#xff0c;所以VTK是一个不错的选择。 之前对VTK了…

ansible安装wordpress

1.回顾 yum安装wordpress 查看别名 [rootlocalhost ~]# type ll ll 是 ls -l --colorauto 的别名设置别名 aliasyum install -y alias ymyum install -y# 使用别名 ym nginx# 取消别名 unalias ym# 基于LNMP做一个wordpressnginx mysql 5.7 PHP 7.4#1、初始化过程 修改主机名…

云原生化有什么特点?

云原生化&#xff0c;作为一种先进的构建和管理应用程序的方式&#xff0c;不仅代表着技术的革新&#xff0c;更是云计算时代下的必然产物。其核心目标在于充分发掘并发挥云计算平台的各项优势&#xff0c;使应用程序在性能、弹性、可靠性和安全性等方面达到前所未有的高度。 它…

LeetCode | 171.Excel表列序号

这道题涉及到字符串和进制转换&#xff0c;首先我们先创建一个A-Z到1-26的map映射&#xff0c;方便我们后续遍历字符串转换&#xff0c;然后对字符串从后往前遍历&#xff0c;依次加上对应权重&#xff0c;注意越往前的权重越大&#xff0c;要记得对应乘上26的对应方数 class …