数据库的基本操作(7)

news2024/11/18 18:32:46

在这一篇博客中我将对数据库进行一个结尾,这将是关于数据库基本内容的结尾。

首先我们来简单总结一下前面的内容:

前面主要讲了Mysql中的索引和事务,这是面试必考的内容。

索引,怎么理解索引呢?

1.索引存在的意义:为了提高查找的效率

2.索引需要付出的代价

a.空间的代价:索引是为了方便查找,用空间来换取时间

b.时间代价:针对增删改

3.索引虽然付出的代价很多,但是在实际的工作中,索引任然会得到广泛的使用,实际需求中,经常“一写多读”

4.索引背后的数据结构   B+树

a.其他的结构可以嘛?

二叉搜索树(AVL树,红黑树)不太性,树的高度太高,导致IO访问的次数更多。哈希表也不可以,因为哈希表不可以进行范围查找

b..B树的介绍

N叉搜索树,每个节点上包含了N个记录,N个记录就分成了N+1个区间,对应到N+1个子树,通过这种方式来快速确定当前需要查找到的值在哪个区间,进一步进行快速筛选。

c.B+树的介绍

B+树是在B树的基础上做出的改进,首先,每个节点上包含了N个key,N个key分成了N个区间,其次,每个节点上的值,都会在子节点上体现,叶子节点上包含所有数据的全集,最后,叶子节点再通过链表的形式来进行收尾相连。

此时带来最大的好处,一方面,可以更高效的进行范围查找,另一方面,因为叶子节点是数据的全集,非叶子节点就只保存key,占用的空间少,可以在内存中进行缓存,又进一步的减少IO次数。

5.什么是事务

a.事务是要将多个SQL打包成一个,要么都进行执行,要么都不执行

b.事务的应用场景,典型就是转账、

c.事务是如何实现保障上述机制的呢?核心就是回滚,回滚的依据就是mysql要记录治安执行的一些过程

d.事务的几个基本特性:原子性,一致性,持久性,隔离性

这边重点再说一下隔离性:其中有三个重要的问题

脏读,给写操作加锁;

不可重复读,给读操作也加锁;

幻读,串行化

read uncommitted;read committed;repeatable read;serializable;通过这四个,mysql的配置文件来设置这里的隔离级别。

这边只是简单的介绍一下,如果需要详细的,可以读一下上一篇博客

下面来开始今天的内容:

JDBC编程

首先我们需要先创建一个项目,之后去中央仓库中下载一下驱动包,但是有一个比较重要的需要注意一下,要根据MySQL版本来下载驱动包,之后去创建一个lib目录,之后将下载的驱动包复制到lib中,最后最重要的是

 需要点最下面的add,接下来就是进行代码的编写了。

JDBC的基本编程流程

//1.创建数据库
        DataSource dataSource=new MysqlDataSource();
        //设置数据库的地址
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSl=false");
        //设置登录数据库的命名
        ((MysqlDataSource)dataSource).setUser("root");
        //设置登录数据库的密码
        ((MysqlDataSource)dataSource).setPassword("123456");

首先需要创建DataSource对象,之后确定数据库的位置,其中setUser和setPassword很好理解, 就是你数据库的账户和密码,下面来重点讲解一下

jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSl=false

 一般来说,这个不用进行修改,直接复制使用就行。

 

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

这个代码是让代码和数据库服务器之间创建连接

我们需要选择第一个,但是创建结束之后我们会发现会有报错,之后右键进行

 

        //4.执行sql
        //SQL中的insert,update,delete这些操作需要使用executeUpdate
        //SQL中的delete使用executeQuery
        int ret=statement.executeUpdate(sql);
        System.out.println(ret);

返回的ret是操作的次数

最后需要的是创建出来的空间进行释放

        //5.释放空间
        statement.close();;
        connection.close();

这个顺序是不可以进行换位置的

下面来看一下整体的代码

    public static void main(String[] args) throws SQLException {
        //1.创建数据库
        DataSource dataSource=new MysqlDataSource();
        //设置数据库的地址
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSl=false");
        //设置登录数据库的命名
        ((MysqlDataSource)dataSource).setUser("root");
        //设置登录数据库的密码
        ((MysqlDataSource)dataSource).setPassword("123456");

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

        //3.操作数据库,以插入数据为例
        String sql="insert into student values(1,'张三')";
        //之后需要将sql包装成一个“语句对象”
        PreparedStatement statement=connection.prepareStatement(sql);

        //4.执行sql
        //SQL中的insert,update,delete这些操作需要使用executeUpdate
        //SQL中的delete使用executeQuery
        int ret=statement.executeUpdate(sql);
        System.out.println(ret);

        //5.释放空间
        statement.close();;
        connection.close();

但是我们不可以每次都自己输入内容,如果需要用户输入我们需要更改一下代码,下面来展示一下insert,update,delete,selete的代码

insert代码


        Scanner scanner=new Scanner(System.in);
        //1.创建好数据库
        DataSource dataSource=new MysqlDataSource();
        //设置数据库所在的地址
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSl=false");
        //设置登录数据库的用户名
        ((MysqlDataSource)dataSource).setUser("root");
        //设置登录数据库的密码
        ((MysqlDataSource)dataSource).setPassword("123456");

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

        //2.5让用户通过控制台输入待插入的数
        System.out.println("请输入学号");
        int id= scanner.nextInt();
        System.out.println("请输入姓名");
        String name=scanner.next();

        //3.操作数据库,以插入数据为例
        //关键所在就是创建一个SQL语句
        String sql="insert into student values(?,?)";
        //此处光是一个String类型的sql还不行,需要把这个String包装成一个”语句对象“
        PreparedStatement statement=connection.prepareStatement(sql);
        //进行替换操作
        statement.setInt(1,id);
        statement.setString(2,name);
        System.out.println("statement: "+statement);

        //4.执行SQL,相当于扫码取件
        //SQL里面如果是insert,update,delete使用executeUpdate方法
        //SQL里面如果是select,使用executeQuery方法
        //返回值就表示这个操作,影响了几行就相当于在控制台输入sql之后得到的数字
        int ret=statement.executeUpdate();
        System.out.println(ret);

        //5.释放需要释放的资源
        statement.close();;
        connection.close();

delete代码

        //删除数据库
        //让用户来输入一个id,之后根据id来进行删除
        //1.创建数据源
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSl=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");

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

        //3.用户输入id
        Scanner scanner=new Scanner(System.in);
        System.out.println("输入想要删除的用户id:");
        int id= scanner.nextInt();

        //4.拼装sql语句
        String sql="delete from student where id = ?";
        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setInt(1,id);

        //5.执行sql
        int ret=statement.executeUpdate();
        System.out.println("ret = "+ret);

        //6.释放
        statement.close();
        connection.close();

update代码

        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSl=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");

        Connection connection=dataSource.getConnection();

        Scanner scanner=new Scanner(System.in);
        System.out.println("需要修改的id:");
        int id=scanner.nextInt();
        System.out.println("修改后的name:");
        String name= scanner.next();

        String sql="update student set name = ? where id = ?";
        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setString(1,name);
        statement.setInt(2,id);
        System.out.println("statement: "+statement);

        int ret=statement.executeUpdate();
        System.out.println("ret="+ ret);

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

select代码

        //1.创建数据源
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSl=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");

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

        //3.拼接sql
        String sql="select * from student";
        PreparedStatement statement=connection.prepareStatement(sql);

        //4.执行sql,对于查询操作,就需要使用executeQuery
        //查询操作返回的不是int,而是一个临时表
        //使用ResultSet表示这个表
        ResultSet resultSet= statement.executeQuery();

        //5.遍历结果集合
        while(resultSet.next()){
            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/29736.html

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

相关文章

通用汽车在华加速推出智能电动车型

到2025年底前,推出超过15款基于奥特能平台打造的电动车型基于奥特能平台的雪佛兰FNR-XE纯电概念车全球首发通用汽车全新“软件定义汽车”平台将于明年正式推出近日,通用汽车中国在上海举办了“2022科技展望日”,展示了其在Ultium奥特能全球电…

IE高级配置中支持的SSL/TLS协议对应注册表值

一、手动勾选"Internet选项->高级->安全->使用TLS 1.2" 二、以编程方式勾选"Internet选项->高级->安全->使用TLS 1.2" 1.注册表值SecureProtocols对应的含义 注册表的路径为:HKEY_CURRENT_USER\Software\Microsoft\Windows…

【第六部分 | JavaScript高级】2:函数高级

目录 【第二章】函数进阶 | (复习)函数声明 | 函数也是对象 | 函数的this指向 | 改变函数this的指向 | 函数的“严格模式” | 闭包 | 浅拷贝和深拷贝 【第二章】函数进阶 | (复习)函数声明 | 函数也是对象 Java中的方法好…

Android基础二:常见的几种组件

关注我,会持续发布关于Android学习的内容! 文章目录 前言 一、MaterialButton 二、MaterialButtonToggleGroup 三、TextView 文本组件 四、ImageView控件 总结 前言 本节我们来学习安卓(Android)的几种常用的组件,包括…

PTA题目 装睡

你永远叫不醒一个装睡的人 —— 但是通过分析一个人的呼吸频率和脉搏,你可以发现谁在装睡!医生告诉我们,正常人睡眠时的呼吸频率是每分钟15-20次,脉搏是每分钟50-70次。下面给定一系列人的呼吸频率与脉搏,请你找出他们…

VMware虚拟机安装ubuntu-16.04.5详细教程

不是每一位程序员都必须玩过linux,现在大多数服务器都是linux系统的,很多生产上的框架和工具都是安装在服务器上的,而且有不少大公司都要求熟悉在linux上开发,因此小编个人觉得大家有必要去了解一下linux(现在大部分服…

vue.js毕业设计,基于vue.js前后端分离图书购物商城系统设计与实现(H5移动项目)

功能介绍 【后台管理员功能】 会员列表:查看所有注册会员信息,支持删除 录入资讯:录入资讯标题、内容等信息 管理资讯:查看已录入资讯列表,支持删除和修改 广告设置:上传图片和设置小程序首页轮播图广告地…

RK3588-EDGE Ubuntu搭建HTTP服务器

一:开发环境 RK3588-EDGE版本根据指导文档开发环境需要Ubuntu18.04及以上。 本次选择在虚拟机中安装Ubuntu20.04进行开发。 二:安装Apache2 sudo apt-get install apache2 安装成功后配置文件位于“/etc/apache2 ” 其次在“/var/www/html”目录下会生成index.html文件…

mysql 多版本冲突安装(5..5和5.7)

1.我先装好了了5.5但是发现版本过低,需要重新装5.7(所以只记录5.7的安装过程) zip版的5.7,先解压 创建my.ini文件 [mysqld] port 3306 basedirC:\D\mysql-5.7.29-winx64datadirC:\D\mysql-5.7.29-winx64/data max_connections2…

视频编解码 — 帧内预测

目录 帧内预测 块大小 帧内预测模式 4x4 亮度块的帧内预测模式(9种) 16x16亮度块的帧内预测模式 8x8色度块的帧内预测模式 帧内预测模式的选择 率失真优化 帧内预测 一张图像中相邻像素的亮度和色度信息是比较接近的,并且亮度和色度…

【windows】实战部署一(安装)SVNserver服务端+SVNclient客户端

1、环境准备 下载SVNserver https://www.visualsvn.com/server/download/ 下载SVNclient https://tortoisesvn.net/downloads.html 语言包位置: 2、安装SVNserver 1、下载后运行msi文件: 2、点击Next下一步: 3、勾选同意,点…

雷达SAR成像仿真的应用(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

window 下兼容多各低版本的chrome测试

分享我做前端浏览器版本兼容测试遇到Chrome不能多版本共存,存在高版本覆盖低版本问题的解决方案,这个方法不影响Windows系统内已安装的Chrome下载你想要的chrome版本,我是在这里找寻下载版本的:https://www.chromedownloads.net/c…

大数据生态圈及分布式文件系统HDFS实践part2

前言 问题引入 (这是以前讲课的时候,给学生准备的一些问题,大家可以思考一下,对理解HDFS很有帮助) 1、如果一个文件中有10个数值(一行一个,并且都是可以用int来度量), …

关于我在uni-app练手中遇到的坑

目录 页面层级结构的加载和回退 filePath编码 对象的深度克隆 弹幕的加载 ​编辑 uni-app内置浏览器加载视频失败 后台报错 java.io.IOException: 你的主机中的软件中止了一个已建立的连接 安卓里遍历uni-list-item错误 手机自带浏览器无法加载视频 乱码问题 video中…

陆地卫星计划:卫星图像数据和波段介绍

陆地卫星计划:卫星图像数据和波段 学分:美国地质调查局(地球上陆地卫星8号图解) 陆地卫星项目:超过40年的图像采集 想象一下,能够在任何给定的地点,在任何给定的时间回顾四十年,并…

操作系统之内存管理

文章目录一、 虚拟内存二、内存分段三、内存分页多级页表TLB四、段页式内存管理五、Linux 内存管理一、 虚拟内存 单片机是没有操作系统的,所以每次写完代码,都需要借助工具把程序烧录进去,这样程序才能跑起来。 另外,单片机的 C…

基于单片机的出租车计价器设计

✅作者简介:嵌入式领域优质创作者,博客专家 ✨个人主页:咸鱼弟 🔥 系列专栏:单片机设计专栏 📃推荐一款求职面试、刷题神器👉注册免费刷题 一、主要功能 本课程设计所设计的出租车计价器的主要功…

python数据结构 操作指南(列表、元组、字典、集合)

数据结构是在python程序运行中必不可少的一部分,在深度学习应用,更是常用来存储模型输出的信息,小编在深度学习开发中过程中,发现有时候我们需要对数据结构中存储的信息,进行复合的条件的筛选,并返回特定的…

python高阶函数心得笔记,python高阶函数知识

递归函数 <1>什么是递归函数 通过前面的学习知道一个函数可以调用其他函数。 如果一个函数在内部不调用其它的函数&#xff0c;而是自己本身的话&#xff0c;这个函数就是递归函数。 <2>递归函数的作用 举个例子&#xff0c;我们来计算阶乘 n! 1 * 2 * 3 * .…