《mysql篇》--JDBC编程

news2024/9/22 11:36:56

JDBC是什么

JDBC就是Java DataBase Connectivity的缩写,翻译过来就很好理解了,就是java连接数据库。所以顾名思义,JDBC就是一种用于执行SQL语句的JavaApl,是Java中的数据库连接规范。为了可以方便的用Java连接各种数据库,给Java程序员操作数据库提供了一个标准的API,不用因为使用了另一种数据库,就要学习另一套API,大大减少了学习和使用成本,同时提高了代码的可移植性。

//就是通过java代码操作mysql数据库

JDBC原理

JDBC 为多种关系数据库提供了统一访问方式,它主要包含一些通用的接口类。

下面我用画图的方式,介绍一下JDBC的原理:

首先由程序员开发Java应用,再调用JDBC的相关的API,就可以访问数据库的JDBC驱动程序,然后通过驱动来进行一系列的数据库操作

//JDBC相关的API是由sun公司提供的,相应的JDBC驱动则是由不同的数据库厂商提供

JDBC的使用

想要使用JDBC需要先安装对应的数据驱动包,并且将jar包导入项目中(具体操作博主这里就不展示了,如果有需要后续会专门出一篇博客来介绍相关操作)

当一切准备工作都做完了之后,就可以使用JDBC进行一些操作了

创建数据源

再连接数据库之前,我们要先找到数据库,方法不止一种,这里我介绍使用Datasource获取数据源

首先创建一个MysqlDatasource对象(DataSource是MysqlDatasource实现的一个借口,这里使用到了向上转型)

DataSource dataSource = new MysqlDataSource();

然后我们需要使用一些MysqlDatasource内特有的方法

((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test1?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("88*****8");

这些方法的意思我们暂且不管,这里你是否有疑问,我们明明要使用的是MysqlDatasource内特有的方法,确使用向上转型,这样不是反而不能使用这些方法了吗?即使之后又向下转型,将DataSource转为MysqlDatasource,这样不是多此一举吗?直接使用这种方法不也可以吗?

MysqlDataSource mysqlDataSource = new MysqlDataSource();

确实这样也是可以达成目的的,但是我们在实际写代码中,要尽量使我们的代码低耦合高内聚

因为我们使用的是MysqlDataSource,如果在项目中大量使用第二种方法,后续要是想要换数据库或者其他操作就会大大增加我们的工作量,所以为了让MysqlDataSource这个类名不要扩散到代码的其他地方,我们更推荐使用第一种方法。

这里简单介绍一下低耦合高内聚🌰:

低耦合:用来描述代码模块之间的依赖程度,列如有两个模块A,B其中B依赖A,那么每次A修改后都要修该B,那么A,B间就是耦合的

高内聚:表示某个特定的软件模块内部,是由很多相关性很强的代码构成,每个模块只负责一项任务,一个功能可以由各个模块通过聚合或组合等达到高度内聚,这样即使聚合的内容发生改变,也不用做很大的变动就等轻松的达到扩展的目的


接下来我们来介绍一下使用到的方法都是什么作用🤔

首先你是不是对setUrl后面那一长串的字符很疑惑,现在我用画图的方式介绍一下

之后的setUser("root")的意思就是输入用户名(mysql默认的用户名就是root),setPassword("88*  *****8")就是输入密码(就是在安装MySQL时自己设定的那个)

//这些时MySQL的认证方式,不同数据库的认证方式不同,在使用时需要加载不同的驱动包

建立和数据库服务器之间的连接

我们现在找到了数据库的位置了接下来就是要去连接数据库

 Connection connection = dataSource.getConnection();

连接的方式非常简单就这一行代码就行,我们调用dataSource接口的getConnection方法,这个方法会返回一个Connection对象,就可以和数据库建立起一个网络连接了

//注意要使用Java.sql包下的Connection

构建sql语句

以上步骤属于准备工作,接下来可以正式通过Java操作数据库了

既然要操作数据库,那我这里提前创建好了一个库

首先我们要写一条sql语句,需要以字符串的形式才行

String sql = ("insert into score values(11,23,99,99)");

 现在我们已经有了一条语句,接下来就是把这条语句发送给MySQL数据库

PreparedStatement preparedStatement = connection.prepareStatement(sql);

 JDBC API主要提供了三种Statement对象供我们使用

  • Statement
  • PrepareStatement
  • CallbleStatement

我们平时用的比较多的是PrepareStatement,翻译过来就是预处理语句,在执行我们发送的sql语句前,它会先解析检查sql,看看是不是有什么问题,解析完毕之后,就会得到结构化数据,直接把解析好的结构化数据发送给服务器,服务器就省下了这部分解析的工作,间接减小了数据库的开销

执行sql语句

刚刚我们执行的是一条insert语句,需要通过PrepareStatement调用executeUpdate方法

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

 executeUpdate()方法会返回一个整数,表示受到影响的行数,通常用于,update,insert,delete语句

如果要进行查询操作则一般使用executeQuery()方法,该方法执行后会返回查询到的单个结果集

关闭连接,释放资源

在我们执行完之后要释放掉我们创建的资源

preparedStatement.close();
connection.close();

 释放时要遵循后创建的先释放

//到这里我们就完成了使用Java语句来控制我们的数据库

测试结果

//数据成功的插入到我们创建的表中🐱🐱

进阶使用

手动输入

如果根据刚刚的方法构造sql语句,难道当我们每执行一条sql就要改一下代码?显然是不合理的,我们可以利用Scanner来手动输入我们要插入的数据,这既提高了效率,也不必那么麻烦

  Scanner scanner = new Scanner(System.in);
        System.out.println("请输入名字");
        int name = scanner.nextInt();
        System.out.println("请输入语文成绩");
        int Chinese = scanner.nextInt();
        System.out.println("请输入英语成绩");
        int English = scanner.nextInt();
        System.out.println("请输入数学成绩");
        int math = scanner.nextInt();
        String sql = ("insert into score values
("+ name +","+ Chinese +","+ English +","+  math +")");

查看运行结果

//可以看到我们使用这种方法,数据依然可以成功的插入表中

防止SQL注入攻击

刚刚的方法虽然高效了一些好像还差点意思,似乎不简洁,而且如果使用这种方法的话,还可能会引起SQL注入攻击

SQL注入攻击:黑客通过代码的形式,将我们构造的sql语句恶意篡改,甚至可以通过一些方法看到我们数据库里的数据(对于学生党来说这个影响不大,因为我们电脑里一般也没啥值钱的数据😥😢)

 我们可以使用preparedStatement的占位符替换的方法来实现构造sql语句。

String sql = ("insert into score values(?,?,?,?)");

这里的“?”就是占位符,相当于告诉编译器这里有数据具体是我们还不确定先占个位置,之后再使用setInt()来将占位符替换成我们想插入的数据。

 String sql = ("insert into score values(?,?,?,?)");
       PreparedStatement preparedStatement = connection.prepareStatement(sql);
       preparedStatement.setInt(1,name);
        preparedStatement.setInt(2,Chinese);
        preparedStatement.setInt(3,English);
        preparedStatement.setInt(4,math);

setInt()的第一个参数对应的数字就对应上述sql语句中第几个占位符,1就对应第一个占位符,2就对应第二个占位符,后一个参数就是我们要替换的数据。

 运行结果

可以看到运行结果和之前一样,依旧可以成功的插入数据。

执行查找语句

查找语句和插入语句有所不同,查找语句不需要我们输入数据,而是需要获得一个查找后的结果集,这里你是否有印象刚刚再介绍“执行sql语句”时有提到executeQuery()方法,该方法执行后会返回查询到的单个结果集。

 但是我们要注意,executeQuery();的返回值是resultSet类型,那么resulSet是什么?

ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供 了对这些行中数据的访问。 ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当 前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next() 方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。

 具体操作如下

 String sql = ("select * from score");
        PreparedStatement statement = connection.prepareStatement(sql);

        //executeQuery();的返回值是resultSet类型
        //ResultSet是查询的结果集合(临时表),此处就需要对结果集合进行遍历
        ResultSet resultSet = statement.executeQuery();
        while(resultSet.next()){
            int name = resultSet.getInt("name");
            int Chinese = resultSet.getInt("Chinese");
            int English = resultSet.getInt("English");
            int math = resultSet.getInt("math");
            System.out.println("name:" + name +
                               " Chinese:" + Chinese +
                               " English" + English +
                               " math:" + math);
        }

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

//通过next就可以获得临时表中的每一行数据,如果到了最后一行再执行,next就会返回fasle

//我们刚刚还有提到executeQuery()方法返回的是单个的结果集,换句话说就是一次只能查询一行,所以要使用循环

运行代码

和我们直接操作数据库的结果集一样

执行删除语句

执行删除语句的方法和前面一样,这里我们根据name来进行条件筛选

  Scanner scanner = new Scanner(System.in);
        System.out.println("请输入名字");
        int name = scanner.nextInt();
        String sql = ("delete from score where name = ?");
       PreparedStatement preparedStatement = connection.prepareStatement(sql);
       preparedStatement.setInt(1,name);

执行结果

可以发现我们刚刚插入的一条数据已经被删除了

执行修改语句

修改语句的执行方法和前面几乎类似,这里我是以name作为条件筛选,来修改math

   Scanner scanner = new Scanner(System.in);
        System.out.println("请输入名字");
        int name = scanner.nextInt();
        System.out.println("请输入数学成绩");
        int math = scanner.nextInt();
      String sql = ("update score set math = ? where name = ?");
       PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1,math);
       preparedStatement.setInt(2,name);

 //注意占位符的先后顺序

执行结果

可以看到数据已经发生改变,说明我们已经成功修改


JDBC的优缺点

优点:

  • Java语言访问数据库操作完全面向抽象接口编程
  • 开发数据库应用不用限定在特定数据库厂商的API
  • 程序的可移植性大大增强
  • JDBC是Java数据库连接的标准API,所有JDBC驱动都遵勖这个标准
  • 可以使用面向对象的方式操作数据库

缺点:

  • 需要处理可能发生的SQLException。

  • 直接使用JDBC操作数据库可能会导致代码冗余,不易维护。

  • 对结果集的解析较为复杂,需要手动解析。

练习--使用JDBC实现记账溥

为了可以对JDBC的使用更加熟练,博主这里准备了一个小练习,来对刚刚讲的使用方法进行巩固

使用JDBC做一个记账溥,可以实现将日常的收入/支出账单存储再我们的数据库中

具体思路博主这里就不展示了,实现结果如何其实无所谓(写这个代码目的只是为了巩固JDBC的使用方法)

以上就是博主对mysql--JDBC编程的分享,如果有不懂的或者有其他见解的欢迎在下方评论或者私信博主,也希望多多支持博主之后和博客!!🥰🥰

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

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

相关文章

MURF1660CT-ASEMI智能AI应用MURF1660CT

编辑:ll MURF1660CT-ASEMI智能AI应用MURF1660CT 型号:MURF1660CT 品牌:ASEMI 封装:TO-220F 批号:最新 恢复时间:35ns 最大平均正向电流(IF):16A 最大循环峰值反向…

【学术会议征稿】第五届智能设计国际会议(ICID 2024)

第五届智能设计国际会议(ICID 2024) 2024 5th International Conference on Intelligent Design (ICID 2024) 为贯彻落实国家创新驱动发展战略,积极服务秦创原创新驱动平台建设,助力区域经济高质量创新发展,西安设计联…

nVisual光纤资源管理APP价值分析

nVisual光纤资源管理APP利用数字孪生技术,可以快速创建光纤资源的数字孪生空间,解决“排查难”和“跟踪难”的问题。提供了预先在数字空间进行智能规划模拟变更、自动生成实施步骤和材料清单等功能,大幅度提高了规划的效率与准确性&#xff0…

uniapp实现光标闪烁(配合自己的键盘)

前言 因为公司业务需要&#xff0c;所以我们... 演示 其实就是Chat自动打字效果 代码 键盘请看这篇文件 <template> <view class"list"><view class"title"><text>手机号码</text></view><view class"ty…

怎么提高图片亮度?这四种方法轻松提高图片亮度!

怎么提高图片亮度&#xff1f;在数字图像处理的世界里&#xff0c;图片亮度不足的问题常常如暗夜的阴影般困扰着我们&#xff0c;这一问题不容忽视&#xff0c;因为它犹如一颗定时炸弹&#xff0c;随时可能引发一系列连锁反应&#xff0c;首先&#xff0c;亮度不足的图片如同被…

【轻松拿捏 】Java-static关键字(面试)

Java-static关键字 1. 定义和基本概念 回答要点&#xff1a; 示例回答&#xff1a; 2. static 变量 回答要点&#xff1a; 示例回答&#xff1a; 代码示例&#xff1a; 3. static方法 回答要点&#xff1a; 示例回答&#xff1a; 代码示例&#xff1a; 4. static 代…

Armv8-R内存模型详解

目录 1.内存模型的必要性 2.Armv8-R内存模型分类 2.1 Normal memory 2.2 Device Memory 2.2.1 Gathering 2.2.2 Reordering 2.2.3 Early Write Acknowledgement 3.小结 大家好&#xff0c;今天是悲伤的肌肉。 在调研区域控制器芯片时&#xff0c;发现了S32Z、Stellar …

威纶通触摸屏连接MySQL数据库步骤

目录 概要威纶通支持数据库的触摸屏类型测试Step 1 选择触摸屏型号Step 2 新增数据库服务器Step 3 添加SQL数据库查询功能Step 4 仿真测试 概要 通过使用威纶通带数据库类型的触摸屏&#xff0c;实现连接本地/远程MySQL数据库&#xff0c;并实现数据查询功能 威纶通支持数据库…

【开发环境】搭建PX4+ROS2+MAVROS2+Simulink+Optitrack实物联合仿真环境

搭建PX4ROS2MAVROS2SimulinkOptiTrack实物联合仿真环境 Ubuntu中的安装过程下载并编译PX4固件代码安装ROS2安装VRPN动捕数据转换ROS2话题库安装VRPN库拉取vrpn_client_ros2节点代码并配置VRPN server参数编译软件包启动vrpn_client_ros2节点重命名话题名 /vrpn/fly/pose 为 /ma…

Python爬虫新手实战导航:精选示例项目助你快速上手Python爬虫(含几十个案例源码)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Python爬虫 📒📝 爬虫小案例(附源码)📝 如何利用这些示例项目进行学习?🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 对于Python初学者而言,理论学习固然重要,但若想真正掌握爬虫技术,大量的实际项目训练和…

一篇喂饭级教程Python时序预测常用方法以及代码演示

在时序预测中,常用的方法包括以下几种&#xff1a; A.移动平均法 B.指数平滑法 C.自回归(AR)模型 D.滑动平均(MA)模型 E.自回归滑动平均(ARMA)模型 F.长短期记忆网络(LSTM) 下面我将逐一展示每种方法的代码示例&#xff1a; 1.移动平均法 import numpy as np# 创建时间…

华润万家超市购物卡怎么使用?

前两天整理杂物&#xff0c;翻出来两张华润的礼品卡&#xff0c;好在还没有过期 但是那卡只能在线下使用&#xff0c;而且面值也就一百 让我专门跑一趟华润感觉太不方便了 最后朋友告诉我说&#xff0c;可以在收卡云上面把卡内的余额直接提出来&#xff0c;我两张一百的卡总…

开放式耳机哪款性价比高?这五款超值精品不容错过

喜欢进行户外运动的小伙伴们&#xff0c;应该都很需要一款既可以匹配运动场景&#xff0c;又兼顾音质体验的无线蓝牙耳机吧。而开放式耳机拥有佩戴舒适牢固&#xff0c;不堵塞耳部&#xff0c;不影响外部声音传入耳部的优点&#xff0c;完全可以成为运动健身人士户外运动的好伴…

XCP协议介绍(二)

五、XCP命令简介 5.1 数据包简介 XCP的数据包分为两类&#xff1a;CTO(Command Transfer Object)与DTO(Data Transfer Object) CMD&#xff1a;指的是上位机下发给下位机的一些命令&#xff0c;比如连接命令FF&#xff0c;解锁&#xff0c;获取状态等一些和下位机交互的命令&…

【算法题】小红的区间翻转

题目 解题思路 第一想法&#xff1a;暴力&#xff1f; 第一个想法就是写一个验证翻转的函数&#xff0c;然后暴力遍历两遍 验证翻转的函数是这样写的&#xff0c;先克隆&#xff0c;再翻转对应区间&#xff0c;最后用equals判断 public static boolean isValidFlip(int[] a, …

Nodejs 第八十六章(部署pm2)

Node.js如何部署? 如果要部署Nodejs项目&#xff0c;第一点肯定是需要有台服务器&#xff0c;第二点需要一个部署工具这里使用pm2 PM2 PM2 是一个非常流行的 Node.js 进程管理工具&#xff0c;用于在生产环境中运行和监控 Node.js 应用程序。它提供了多种功能&#xff0c;帮…

[数仓]四、离线数仓(Hive数仓系统-续)

第8章 数仓搭建-DWT层 8.1 访客主题 1)建表语句 DROP TABLE IF EXISTS dwt_visitor_topic; CREATE EXTERNAL TABLE dwt_visitor_topic (`mid_id` STRING COMMENT 设备id,`brand` STRING COMMENT 手机品牌,`model` STRING COMMENT 手机型号,`channel` ARRAY<STRING> C…

Visual Studio远程调试工具

路径&#xff1a;安装路径/Common7/IDE/Remote Debugger/平台/msvsmon.exe。 平台有x86、x64&#xff0c;x64即可调试x86进程也可调试x64进程。 将平台路径下的所有文件拷贝至其他PC&#xff0c;运行msvsmon.exe。 工具栏选择“工具&#xff08;T&#xff09;”选择“选项“&…

基于STM32的RFID公交充值消费系统

1.简介 基于RFID技术的公交卡充值消费系统&#xff0c;以其高效快速、安全可靠、方便快捷、易于管理和环保节能等特点&#xff0c;为用户带来优质的公交出行体验。通过非接触式的数据读写&#xff0c;该系统实现了快速充值和消费&#xff0c;同时采用先进的加密和防碰撞算法确保…

浅谈后置处理器之调试后置处理程序

浅谈后置处理器之调试后置处理程序 “调试后置处理程序”(Debug PostProcessor) 是一个特别的组件&#xff0c;它主要用于帮助测试人员深入理解测试脚本执行过程中的变量和属性状态&#xff0c;便于调试和故障排查。 调试后置处理程序简介 功能概述&#xff1a; 调试后置处…