Mysql数据库--JDBC编程

news2024/11/25 15:48:32

文章目录

  • 1.JDBC编程基础
  • 2.驱动程序下载
  • 3.新建项目
    • 3.1导入java包
    • 3.2转换为库
  • 4.开始创作
    • 4.1准备数据库
    • 4.2创建DataSource
    • 4.3和数据库建立连接
    • 4.4构造sql,准备发送到服务器
    • 4.5发送sql,执行sql
    • 4.6释放系统资源
    • 4.7自行输入的设置
    • 4.8插入数据完整源代码
    • 4.9查询数据库里面的表的操作
    • 4.10查询操作的源代码

1.JDBC编程基础

JDBC全称就是Java DataBase Connect,也就是通过Java对于这个mysql数据库进行操作;

数据库编程,就是需要数据库的服务器,提供一些API(appliacation programing interface–应用程序接口),供我们程序员进行使用;

但是不同的数据库提供的这个api有差别,因此这个时候我们的java站出来一统江湖,自己设计一套,其他的这个数据库都要和java提供的对接上,不然我们的java就不和他玩了,毕竟当时我们的这个java的分量还是很重要的,因此这个时候我们只需要了解这个java的api,就可以了,不用像之前的那样去了解不同的数据库的api接口,我们只需要了解这个JDBC的这一套就可以了;

2.驱动程序下载

下载地址就是中央仓库,下载步骤如下所示:首先找到第二个:
在这里插入图片描述
如果我们的这个mysql服务器是5.x的,就下载这个5.1.49的,如果是mysql8.x这个时候我们的这个8.x的,我们的驱动程序需要和我们的这个mysql的版本相互匹配;
在这里插入图片描述
找到和我们的这个mysql对应的驱动程序之后,点击这个jar进行下载,就可以了;
在这里插入图片描述

3.新建项目

3.1导入java包

创建一个lib目录,把我们的这个安装的程序ctrl+c,ctr+v拖拽进来,像下面的这个一样,只要一粘贴就进入我们的这个项目里面了;
在这里插入图片描述

3.2转换为库

就是我们的这个lib目录右键,选择这个add as library这个选项:
在这里插入图片描述

4.开始创作

4.1准备数据库

首先需要在这个src里面创建一个demo1文件,这个就是我们写代码的地方;
在这里插入图片描述
然后在这个计算机终端上面以管理员的身份连接数据库,创建一个表,我们后面就是把数据插入到这个创建的表里面去;
在这里插入图片描述

4.2创建DataSource

seturl是对于这个数据库服务器的位置进行设置;

setname是设置用户名,setpassword是设置我们的密码(这个需要根据实际情况进行改写,不要照抄!!)
在这里插入图片描述
这个里面使用的是向下转型的操作,就是先去创建一个dataSource这个对象,然后再把这个对象向下转型为我们的这个MysqlDataSource这个对象,这个直接创建对应的对象也不是不可以,但是我们进行这个向下转型的好处就是我们的这个写法可以降低mysql和其他的程序的耦合度,什么是耦合度:就是我们的一个程序的变动对于其他的程序的影响和联系,如果一个程序的变动对于另外一个程序的影响很大,这个时候我们就说这个耦合度很高,不是我们软件开发想要实现的效果,我们想要实现的是低耦合,高内聚,低耦合就是程序之间的这个关联性比较小,一个程序需要改动的时候,其他的程序收到的影响比较小,这个是我们想要实现的;

什么是高内聚,就是我们的一个项目里面具有相同的功能的这个代码的这个模块很合适,就是相同的这个功能的接口放到一个程序里面,这样方便我们对于这个项目进行管理,这个就是高内聚(相似,相同功能的模块放到一起,不要太分散,这个就是内聚的解读)

seturl参数解读:

这个里面涉及到我们的IP和端口号相关的知识,我们的这个IP是确定的,就是我们自己的电脑主机,端口号是负责找到我们的这个电脑上面的对应的程序,db01是我自己的这个数据库里面的这个库的名字,同学们需要根据自己的这个实际的命名进行修改;

在这里插入图片描述

4.3和数据库建立连接

使用这个dataSource对象,调用我们的这个getConnection这个方法(会报错,需要抛出异常,就是把我们的鼠标放到这个报错上面,然后就会提示一个exception就行了,这个时候上面就会自动包含头文件,然后就不会报错了)

在这里插入图片描述
我们需要一个返回值connection,这个类型可以自动识别出来,但是我们需要选择这个java.sql这个类型,不要选择上面的那个jdbc的;
在这里插入图片描述
下面的这个就是我们点击这个错误信息里面的exception之后抛出异常的情况后,这个会自动导入文件;

在这里插入图片描述

4.4构造sql,准备发送到服务器

因为是第一次使用这个,所以我们在这个sql这个字符串里面写一个简单的sql语句,像这个下面写的就是一个insert的插入的命令,我们这个是直接指定插入的内容,下面我们还可以自己设置输入,进行插入,这样就不至于写死了;

在这里插入图片描述

4.5发送sql,执行sql

使用这个executeUpdata这个方法,这个方法的返回值就是我们的这个操作执行之后,这个数据库表里面收到的影响的行数,我们可以把这个返回值打印出来,因为我们的这个地方就是向这个表里面插入一行数据,因此这个影响程度就是一行,n=1输出;

在这里插入图片描述

4.6释放系统资源

我们的这个释放的规则就是先创建后释放,后创建的先释放,因此这个我们的statement是后创建的,我们需要优先释放,然后释放掉这个connection;

在这里插入图片描述

4.7自行输入的设置

除了上面的插入,我们想要修改之类的,只需要把这个步骤3里面的这个sql语句换一下就可以了,因此这个JDBC其实想要玩好,还是很考验我们的这个sql语句的基本功的,因为其他的内容的变化不是很大,想要进行其他的操作就是在这个sql里面进行相关的改动,上面的是插入数据,下面的这个就是把我们插入的数据从这个学生表里面删除掉;

在这里插入图片描述
此外我们还可以自己进行输入:就是使用这个scaner这个对象进行控制,这个时候,我们就可以使用这个scanner.nextInt()输入我们的这个id,使用这个scanner.next输入我们的这个姓名,接受的时候其实这个代码里面体现的是两个写法:

一个就是在这个==String sql ="insert into student values(“id=”+id+“name=”+name)==这个表示我们的输入的内容就作为参数传递到这个里面去,但是这个可能会导致这个sql注入攻击,反正就是这个写法我们不推荐;

另外一个就是使用??的方式,这个表示的是我们的这个占位符(PreparedSDtatement提供的,可进行拼接),但是这个时候我们需要对于这个方法进行调用,表名我们的这个输入传递给哪一个参数,如果是上面的这个,其实输入的id就是传递给的这个里面的第一个参数,但是下面的这个占位符的方式,我们的问号无法显示的表名我们的参数是什么,因此我们需要就加上这个:
statement.setInt(1,id);------输入的参数传递给我们的第一个占位符;
statement.setString(2,name);-----------输入的参数传递给我们的第二个占位符;

除了这两个方法(setInt,setString),其他的操作都是相同的,对于这两个方式而言(一个是在这个参数里面写上这个id,name的名字,一个就是使用两个占位符进行替代);

在这里插入图片描述

4.8插入数据完整源代码

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 Demo1 {
    public static void main(String[] args) throws SQLException {
        //-------------------1.进行配置------------------------------------
        //1.DataSource是这个数据库服务器所在的位置
        //2.MysqlDataSource来自于我们导入的这个mysql驱动包
        DataSource dataSource = new MysqlDataSource();
        //向下转型操作,父类转换为子类----低耦合,减少修改导致的bug
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/db01?characterEncoding=utf8&&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("123456");

        //-----------------2.建立连接--------------------------------------
        Connection connection = dataSource.getConnection();

        //--------------3.构造sql,发给服务器--------------------------------------
        String sql="insert into student values(18,'zhangsan')";
        PreparedStatement statement = connection.prepareStatement(sql);

        //--------------4.发送sql,执行sql,返回值是整数,表示的是影响的行数
        int n=statement.executeUpdate();
        System.out.println("n="+n);

        //--------------5.释放资源---------------------------------------------
        statement.close();
        connection.close();
    }
}

4.9查询数据库里面的表的操作

这个查询操作和上面的略有区别,但是差别不大,主要就是这个调用的方法和遍历的这个过程,其他的都是一样的,这个我们使用这个executeQuery去接受这个结果集,就是我们的查询结果,这个返回值就是一个ResultSet类型的数据;

接下来我们使用这个.next()进行遍历,这个时候我们的这个指针就会不断地从这个表里面的第一行查询到这个最后一行数据,并把这个查询结果通过getInt和getString方法传递到我们的参数里面打印输出;

在这里插入图片描述

上面的这个next()方法作为这个循环的条件,这个里面主要就是这个本来的指针指向的是第一行之前,然后判断的时候指向第一行,取出这一行数据里面的这个id和name数据,传递给我们对应的参数,接着每一次next就向下移动一个单位,以此类推,直到完成遍历为止;
在这里插入图片描述
这个就是终端的输出结果,和我们在这个mysql里面进行惭怍输出的结果应该是一样的,两个可以互相验证:

在这里插入图片描述

4.10查询操作的源代码

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 Demo2 {
    public static void main(String[] args) throws SQLException {
        //-------------------1.进行配置------------------------------------
        //1.DataSource是这个数据库服务器所在的位置
        //2.MysqlDataSource来自于我们导入的这个mysql驱动包
        DataSource dataSource = new MysqlDataSource();
        //向下转型操作,父类转换为子类----低耦合,减少修改导致的bug
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/db01?characterEncoding=utf8&&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("808080ZhuZhaoYu#");

        //-----------------2.建立连接--------------------------------------
        Connection connection = dataSource.getConnection();

        //--------------3.构造sql,发给服务器--------------------------------------
        String sql="select * from student";
        PreparedStatement statement = connection.prepareStatement(sql);

        //--------------4.发送sql,执行sql,返回值是整数,表示的是影响的行数
        //executeQuery这个的返回值是一个临时表(结果的集合)
        ResultSet resultSet =statement.executeQuery();

        //---------------5.进行遍历----------------------------
        //此处需要针对这个表进行遍历,类似于迭代器,但是有差异
        while(resultSet.next()){
            //id是int类型的,我们调用的就是这个集合的geting方法
            int id=resultSet.getInt("id");
            String name=resultSet.getString("name");
            System.out.println("id="+id+",name="+name);
        }

        //--------------6.释放资源---------------------------------------------
        resultSet.close();
        statement.close();
        connection.close();
    }
}

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

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

相关文章

JavaEE之多线程进阶-面试问题

一.常见的锁策略 锁策略不是指某一个具体的锁,所有的锁都可以往这些锁策略中套 1.悲观锁与乐观锁 预测所冲突的概率是否高,悲观锁为预测锁冲突的概率较高,乐观锁为预测锁冲突的概率更低。 2.重量级锁和轻量级锁 从加锁的开销角度判断&am…

OJ在线评测系统 微服务 用分布式消息队列 RabbitMQ 解耦判题服务和题目服务 手搓交换机和队列 实现项目异步化

消息队列解耦 项目异步化 分布式消息队列 分布式消息队列是一种用于异步通信的系统,它允许不同的应用程序或服务之间传递消息。消息队列的核心理念是将消息存储在一个队列中,发送方可以将消息发送到队列,而接收方则可以在适当的时候从队列中…

Vue2电商平台(六)、注册登录,请求头配置token,token持久化存储;导航守卫(重点);组件内守卫、路由独享守卫

文章目录 一、注册1. 获取注册验证码2. 完成注册用户 二、登录1. 登录获取token2. Home首页携带token获取用户数据3. 持久化存储token4. 退出登录5. 导航守卫 (牛)6. 路由独享守卫beforeEnter7. 组件内守卫(用的很少) 一、注册 1. 获取注册验证码 本系…

基于SSM+小程序的线上教育商城管理系统(教育2)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 微信小程序线上教育商城有管理员,教师,学生三个角色。 1、管理员功能有个人中心,学生管理,教师管理,类型管理,课程…

diffusion model(1.1) 为什么前向传播和反向传播都遵循高斯分布?

DDPM的引用[53]为Deep Unsupervised Learning using Nonequilibrium Thermodynamics,它证明了当 β t \beta_t βt​ 较小时,前向传播和反向传播前向分布和后向分布拥有同样的分布形式。 所引论文的内容如下, 后者又引用了另一篇论文(Fell…

分层解耦-04.IOCDI-IOC详解

一.Bean的声明 springboot为了更好地标识web应用开发中bean对象到底归属于哪一层,在Component注解的基础上又衍生出了三个注解Controller、Service和Repository。分别应用于Controller层,Service层和Dao层。推荐使用衍生注解,当无法判断该be…

Java-数据结构-反射、枚举 |ू・ω・` )

目录 ❄️一、反射: 1、定义: 2、用途: 3、反射相关的类: 4、Class类: 1、Class类中相关的方法: 5、Class反射实例: 1、获得Class对象的三种方式: 2、反射的使用: 6、反…

网络基础擅长组建乐队

让我们荡起双桨 来说说网络吧 现有计算机要进行协作,网络的产生是必然的 局域网:计算机数量更多了, 通过交换机和路由器连接在一起 广域网:将远隔千里的计算机都连在一起 交换机路由器等设备就应运而生 计算机是人的工具,人要协…

layernorm笔记

文章目录 layer norm的解释二维三维 batchnorm和layernorm主要的区别为什么要在序列转录模型中使用layer norm? layer norm的解释 二维 红色为batchnorm,蓝色为layer norm batchnorm对每一个特征算均值和方差 layer norm对每一个批次算均值和方差 三…

窗口系统与图形绘制接口

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 当我们想要进行底层图形应用(GUI)开发时,往往需要用到窗口系统和图形库,这里简单介绍一下 视窗系统(window system)与通信协议 下面内容主要针对Unix-like操作系统 视窗系统是以使用视窗作为主要特征之一的图形用…

【含开题报告+文档+PPT+源码】基于SSM + Vue的养老院管理系统【包运行成功】

开题报告 随着社会的发展和经济的进步,人口老龄化问题逐渐凸显。统计数据显示,全球范围内的老龄人口比例正在逐年上升,养老需求也随之增长。养老院作为提供专业养老服务的机构,承担着照料老人、提供医疗保健和社交活动等责任。传…

DVWA Brute Force篇暴力破解 Low/Medium/Hight

这里就不再赘述环境搭建,就默认你已经做好环境搭建的准备了.接下来就步入正题(我的bp是汉化) 任务一,设置级别为low级别,创建好我们的字典文件 任务二 开启抓包,并且我们输入错误的账户密码 (当我知道账户名称为admin时…

Nginx06-静态资源部署

零、文章目录 Nginx06-静态资源部署 1、静态资源概述 静态资源:是在Web开发中不经常改变的文件,比如图片、CSS样式表、JavaScript脚本文件等。这些资源通常是预先编译好的,不需要服务器端的动态处理。动态资源:是在Web开发中需…

fiddler抓包19_模拟IP地址(如异地IP)

课程大纲 使用场景举例:北京模拟海南IP地址“182.118.99.12”发送请求。 ① 打开CustomRules.js文件:Fiddler快捷键“CtrlR”(或鼠标点击,菜单栏 - Rules“规则” - Customize Rules“自定义规则”)。 ② 添加代码,保存&#xff1…

SpringBoot在线教育系统:架构设计与技术选型

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

计算机网络——DNS

提供域名——>ip地址的转换 分层命名 分布式解析 怎么样维护 DNS实现在边缘系统——传输层及其以上 还提供别名——>规范名字的转换——>ip 负载均衡是一种用于在多个计算资源(如服务器、网络设备等)之间分配工作负载的技术。其主要目的是…

最小生成树prim算法kruskal算法

最小生成树 在一个无向图中求一棵树(n-1条边,无环,连通所有点)而且这棵树的边的权和最小 prim(普利姆)算法 prim算法有叫加点法,我们先标定一个点,然后寻找与这个点相连的边的权值最小的点,不断重复此操作&#xff…

【鸿蒙学习】深入解析鸿蒙应用与元服务:含义、区别、应用场景及创建方法

文章目录 鸿蒙应用(HarmonyOS App)含义用于干什么优缺点 元服务(Atomic Service)含义用于干什么优缺点 鸿蒙应用与元服务的区别创建方法鸿蒙应用的创建元服务的创建 总结 随着科技的不断进步,操作系统也在不断迭代更新…

医院管理自动化:Spring Boot技术实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常适…