【MySQL数据库】 七

news2024/11/23 20:22:57

本文主要介绍了Java的JDBC编程的过程. 超详细 !!! 

一.JDBC

JDBC就是通过Java代码,来操作数据库

由于我们在实际开发中,绝大部分都是用代码来操作数据库的 , 因此一个成熟的数据库,都会提供一些API让程序员来使用.

常见的数据库比如mysql / oracl / sqlserver / SQLite 都会提供相应的API 

但是这些数据库提供的api是否是一样的呢?

不是一样的 ! 每个数据库设计api的人都是不同的 ,  这非常不利于程序员的开发 . 

于是Java就召集了几个数据库做出了一套统一的api

JDBC就是java提出的一套操作数据库的api , 它让所有的数据库都能够按照统一的方式来操作使用

从此之后,java程序员只需要掌握一套api,就可以操作各种数据库 .

但是JDBC是提供了一套统一的api,但是数据库本身也有自己的原生api,因此这里就需要一个驱动包, 其实是每个数据库厂商提供了一些代码,把数据库原生api进行转化

二.Java代码操作MySQL

1.创建个项目

IDEA新建项目

2.引入mysql的驱动包,作为项目的依赖

首先要将驱动包下载下来,然后导入到项目中

下载mysql驱动包一般有以下几个渠道 

a.oracle官方网站

b.github

c.中央仓库(推荐)

中央仓库 (圈子有里的一些大佬把一些知名的第三方库都收集到一起放到了中央仓库,只要去中央仓库找,一般可以找到)

推荐一个好用的中央仓库:

https://mvnrepository.com/

搜索找到这个

选择版本之后点开,点击jar就可以下载驱动包了

.jar是类似于.rar这样的压缩包,是java定义的一种压缩格式

.jar中主要包含了很多的.class文件

3.把驱动包导入到项目中

a.复制jar包到目录中

b.右击add as library (这样idea就知道这个是库文件)

准备工作就做好了,后面就可以编写代码了

三.编写JDBC

1.创建数据源

注意:

此时我们使用向上转型和向下转型,目的是为了降低mysql驱动包和代码之间的耦合关系,避免后续更换数据库的时候有太大的成本 .

因此实际上也可以直接不转型:

  • setUrl

设置唯一资源定位符

ip地址:由于此时我们的客户端和服务器都在编写代码的主机上,所以使用127.0.0.1(环回ip)来表示 . 

  • 设置用户名和密码

到这里就描述了数据库服务器的位置,但是还没有真正连接数据库服务器(建立网络上的连接)

2.连接数据库服务器

注意: 此处的connection使用红框这个  !

第一个是mysql驱动包提供的, 不可以用 ! !

一个java可以连多个数据库服务器,和每个数据库服务器进行通信都得有一个独立connection .

3.构造sql语句

本身SQL语句是string类型, JDBC提供了statement对象,让我们把string转换成statement再发送给服务器执行

但是一般会使用preparedStatement(预处理的语句)对象来代替statement.

 *statement把直接把sql发送给数据库服务器 . 数据库服务器自己负责解析SQL

* PreparedStatement会先在客户端这边初步解析以下sql,验证语法格式是否符合要求,此时服务器就不用简称,从而降低了服务器的负担.

4.执行sql语句

executeQuery

适用于查询 (本质是读)

executeUpdate

适用于插入/修改/删除(本质是写)

返回受影响的行数

5.释放必要的资源,关闭连接

创建的语句对象和连接对象都会持有一些计算机的硬件,软件上的资源,这些资源不用了 , 就应该及时释放

注意:Java虽然有垃圾回收机制,自动释放内存,但是计算机资源不仅仅是内存,其他的资源就需要手动释放 .

注意关闭顺序:

先创建的后关闭; 后创建的先关闭 ;

四.防止sql注入问题

上述实例的插入数据是固定的 , 我们可以尝试用动态输入的数据插入

使用字符串拼接的方式

这个方式可以达成效果,但是不建议这样写

1.看起来混乱

2.不安全 . SQL注入问题. 黑客可能会构造一些特定的输入,达成对数据库攻击的效果

PreparedStatement提供了基于占位符的写法,解决了上述问题

?是一个占位符,占据一个位置,后续preparedstatement会把变量的数值带入到?中

五.代码

1.删除/修改/删除

删除和修改操作与上面的插入操作,代码完全相同,只是构造的SQL语句不一样 , 返回值都是一个简单的整数 ,表示受影响的行数 .  (以下代码以插入为例)

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


        //1.创建数据源
        DataSource dataSource=new MysqlDataSource();//向上转型:父类引用指向子类对象
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:13306/java?    characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("123456");
        

        //2.和数据库服务器建立连接
        Connection connection=dataSource.getConnection();


        //3.构造sql语句
        String sql="insert into test values(?,?)";
        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setInt(1,id);
        statement.setString(2,name);
        
        //4.执行sql  返回影响的行数
        int n=statement.executeUpdate();
        System.out.println(n);

        //5.释放必要资源,关闭连接
        statement.close();
        connection.close();
   

2.查询

对于查询来说,返回的是一个临时表 , 需要用结果集resulSet来装 ,取出数据的过程类似于java中的迭代 , 使用如下:

        Scanner scanner=new Scanner(System.in);
        int id=scanner.nextInt();

        //1.创建数据源
        DataSource dataSource=new MysqlDataSource();//向上转型:父类引用指向子类对象
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:13306/java?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("123456");


        //2.和数据库服务器建立连接
        Connection connection=dataSource.getConnection();

        //构造sql
        String sql="select * from test where id=?";
        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setInt(1,id);

        //4.执行sql
        ResultSet resultSet=statement.executeQuery();

        //遍历结果集合
        while(resultSet.next()){
            //获取这一行的学号列
            int getid=resultSet.getInt("id");
            //获取到这一行的姓名列
            String getname=resultSet.getString("name");

            System.out.println("学号为"+id+"的同学:"+getid +"  " +getname );

        }

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

实际上,前面学过的各种复杂的SQL(聚合/多表联合/合并/子查询都是支持的)

总结:


JDBC的api其实还是有一些繁琐的,因此,在Java中,有人就对JDBC进一步封装得到了一些数据库操作的框架(ORM) , 那样就可以简单的操作数据库 .比如,MyBatis框架等

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

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

相关文章

Python类与对象:类的定义、实例化、方法、属性、构造函数

文章目录 类的定义类的实例化方法属性构造函数Python 类和对象是面向对象编程的基础。在 Python 中,几乎所有东西都是对象,拥有属性和方法。类是创建对象的蓝图或模板。让我们一步步来探索类的定义、实例化、方法、属性以及构造函数,并提供详细的代码示例。 类的定义 在 P…

SQL注入漏洞 其他注入

文章目录 宽字节注入案例 HTTP头部注入Cookie注入base64User-Agent注入Referer 注入 SQL注入读写文件条件1.是否拥有读写权限2.文件路径3.secure_file_priv 读取文件写入文件 SQLMap安装sqlmapkail 源安装仓库克隆 参数简介快速入门;SQLmap(常规&#xf…

【Docker】设置容器系统字符集zh_CN.UTF-8退出失效:关于Docker容器配置环境变量,再次进入失效问题

设置容器系统字符集zh_CN.UTF-8退出失效:关于Docker容器配置环境变量,再次进入失效问题 修改正在运行的Docker容器内的字符集: 先进入Docker容器:docker exec -it 容器ID /bin/bash查看是否支持中文字符集:locale -a | grep zh&a…

B站双11,联手天猫暴涨2亿消费新势力

一直以来,手持高活跃、高粘性用户群体的B站是行业用来观察年轻人消费习惯的重要平台。以至于用户群体的不断壮大带动了B站的商业价值。如今B站的商业舞台越来越大,不断地向外界招手,欢迎更多品牌积极加入到这个千万年轻人聚集的内容社区。 2…

如何有效防爬虫?教你打造安全堡垒

企业拥抱数字化技术的过程中,网络犯罪分子的“战术”也更难以觉察,并且这些攻击越来越自动化和复杂,也更加难以觉察。在众多攻击手段总,网络爬虫是企业面临的主要安全挑战,对于企业所造成的经济损失是难以计量的。那么…

设备密集型单位如何提升效率?智能巡检软件哪个好?

在设备密集型单位,如钢铁、化工、电力、烟草、日用品等行业以及运维商,日常工作中面临着设备巡检这一重要且繁琐的任务。传统的巡检方式往往依靠纸质记录,数据难以进行统计或分析,巡检人员需要手动记录各种数据,不仅效…

visual studio 启用DPI识别功能

在开发widow程序时,有时必须将电脑 设置-->显示-->缩放与布局-->更改文本、应用项目的大小-->100%后,程序的画面才能正确运行,居说这是锁定了dpi的原因,需要启dpi识别功能。设置方法如下: 或者

unity - Blend Shape - 变形器 - 实践

文章目录 目的Blend Shape 逐顶点 多个混合思路Blender3Ds maxUnity 中使用Project 目的 拾遗,备份 Blend Shape 逐顶点 多个混合思路 blend shape 基于: vertex number, vertex sn 相同,才能正常混合、播放 也就是 vertex buffer 的顶点数…

CocosCreator让一个物体跟随鼠标移动(两种方式 本地坐标系和世界坐标系)

在 Cocos Creator 3.x 游戏运行时显示的画布大小就是屏幕区域,屏幕坐标是从画布的左下角为原点开始计算 在 Creator 3.x 里,屏幕和 UI 是完全区分开的,用户可以在没有 UI 的情况下点击屏幕获取触点信息。因此,获取屏幕触点&#…

Jmeter工具二次开发

一、JMeter 二次开发方向 1、函数开发,主要为JMeter 函数库 2、插件开发,一般主要做取样器开发 3、基于执行引擎开发,有效解决单独开发的测试平台或工具中,底层执行引擎开发相对复杂、周期长的问题,利用 JMeter 执行…

分享vmware和Oracle VM VirtualBox虚拟机的区别,简述哪一个更适合我?

VMware和Oracle VM VirtualBox虚拟机的区别主要体现在以下几个方面: 首先两种软件的安装使用教程如下: 1:VMware ESXI 安装使用教程 2:Oracle VM VirtualBox安装使用教程 商业模式:VMware是一家商业公司,而…

数据结构: 哈希桶

目录 1.概念 2.模拟实现 2.1框架 2.2哈希桶结构 2.3相关功能 Modify --Insert --Erase --Find 2.4非整型数据入哈希桶 1.仿函数 2.BKDR哈希 1.概念 具有相同地址的key值归于同一集合中,这个集合称为一个桶,各个桶的元素通过单链表链接 2.模拟实现 2.1框架 a.写出…

oracle数据导出exp导入imp

Oracle的exp/imp命令用于实现对数据库的导出/导入操作; exp命令用于把数据从远程数据库服务器导出至本地,生成dmp文件; imp命令用于把本地的数据库dmp文件从本地导入到远程的Oracle数据库。 一、获取帮助信息 exp/imp helpy 二、数据导出 1…

打破边界,一触即达——全新跨境电商业态,一键开启全球贸易新时代!

随着全球电子商务的飞速发展,跨境电商已成为连接国内外市场的桥梁。为了满足商家日益增长的海外拓展需求,我们重磅推出跨境电商源码商城,融合商家一键铺货、代理商后台、供货商后台、商品采集、短视频、直播、社交、分销、积分、多语言、国际…

阿里云双11优惠:云服务器1年99元,新老同享,续费同价!

阿里云2核2G3M带宽99元服务器新老用户同享,续费不涨价,99元即可续费,可以续费到2027年,相当于396元买4年,阿里云百科aliyunbaike.com来详细说下阿里云99元服务器配置、购买条件、优惠价格和续费攻略: 阿里…

js获取地址中携带的省市区

match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。 match() 方法将检索字符串 String Object,以找到一个或多个与 regexp 匹配的文本。这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g。如果 regexp 没有标志 g&#x…

图形界面应用案例——关灯游戏(以及扩展)(python)

7.8 图形界面应用案例——关灯游戏 题目: [案例]游戏初步——关灯游戏。 关灯游戏是很有意思的益智游戏,玩家通过单击关掉(或打开)一盏灯。如果关(掉(或打开)一个电灯,其周围(上下左右)的电灯也会触及开关,成功地关掉所有电灯即可过关。 图7-43 关灯游戏运行效…

阿里云服务器登录、安装MySql、配置Python、GO环境

1、刚购买的云服务如何登录 刚购买的ECS没有默认密码,需要先设置一下登录的密码。选中实例,右上角的全部操作-->重置实例密码 如果想通过SSH登录,则一定要勾选开启 修改之后ssh root你机器的ip,输入密码就可以愉快的开始你的操…

在Ubuntu下安装Redis

文章目录 前言一、配置JAVA运行环境二、Ubuntu下安装Redis1.安装c语言编译环境2.下载解压Redis3.make编译4.启动Redis4.运行Redis 三、性能测试总结 前言 版本 jdk版本:jdk-17_linux-x64_bin 地址:https://www.oracle.com/cn/java/technologies/downloa…

chatglm3-6b部署及微调

chatglm3-6b部署及微调 modelscope: https://modelscope.cn/models/ZhipuAI/chatglm3-6b/filesgithub: https://github.com/THUDM/ChatGLM3镜像: ubuntu20.04-cuda11.8.0-py38-torch2.0.1-tf2.13.0-1.9.4v100 16G现存 单卡 安装 软件依赖 pip install --upgrade pippip ins…