MySQL最终弹-并发(脏读,不可重复读,幻读及区别),JDBC的使用和安装,最全万字(二)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL最终弹-并发(脏读,不可重复读,幻读及区别),JDBC的使用和安装,最全万字

DataSource dataSource=new MysqlDataSource();

步骤二:(向上转型)

((MysqlDataSource)dataSource).setUrl();

给大家回顾一下,向上转型,和向下转型

向上转型:子类对象转成父类。

向下转型:父类对象转成子类。

实际上⚠️⚠️

MysqlDataSource dataSource=new MysqlDataSource();

dataSource.setUrl()其实就可以了 🌚 🌚 🌚

🍅🍅🍅

当然这么做肯定有他们的道理。

按照最初的转型方法,本质是希望让MysqlDataSource,不要扩散到代码的其他部分··思想其实是想降低mysql驱动包,和我们项目之间的耦合关系,避免后续更换数据库,成本过大。

Url:唯一资源定位符,通常用Url来描述网络上一个资源的位置,mysql本体是服务器~,相当于是网络上的资源,里面写的东西直接复制贴贴就行,不用背

"jdbc:mysql://127.0.0.1:3306/java108?characterEncoding=utf8&&useSSL=false"

这个是括号里面需要填写的,下面我们来分析一下每一块都是什么意思。

jdbc:mysql♈️url是一个什么类型的url ,这里的意思就是jdbc:mysql就是说给jdbc的mysql使用的。

127.0.0.1 ♉️网络上的一个地址~是通过这一串数字来表示的,这一串数字通常是4个部分,各个部分取值范围是0-255,4个部分使用,分割

3306♍️ 端号,区分主机上的应用程序

java108♋️数据库名字

characterEncoding=utf8&&useSSL=false; 统一字符集utf8

statement:是把sql原封不动的直接发给数据库服务器,数据库服务器自己解析sql

PreparedStatement,会先在客户端这边初步解析SQL(验证语法,是否正确),此时服务器就不用做这些检查了,从而降低服务器负担,另外,本身SQL存在String类型,JDBC提供statement对象,让我们把String对象转换成statement,再发给服务器执行,但是一般会使用PrparedStatement(预处理的语句)对象代替statement.

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 Main {
   public static void main(String[] args) throws SQLException {
//1.创建数据源
      DataSource dataSource=new MysqlDataSource();
      ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java108?characterEncoding=utf8&&useSSL=false");
//设置你的数据库名字的密码,不是随便设置哈,你自己的数据库密码,root也是不能乱设置
      ((MysqlDataSource)dataSource).setUser("root");
      ((MysqlDataSource)dataSource).setPassword("lcl15604007179");
//2.和数据库服务器建立链接,认准第二个sql的Connection,第一个com那个是mysql的驱动包
      Connection connection=dataSource.getConnection();
//构造SQL语句
      String sql=" insert student values(1,'张三') ";
      PreparedStatement statement=connection.prepareStatement(sql);
//4.执行SQL语句
      int n=statement.executeUpdate();     //返回有几行收到了影响
      System.out.println(n);
//5.释放必要资源,关闭链接 -注意关闭顺序,后创建的先关闭
      statement.close();          //创建的对象都会持有一些计算机硬件,软件中资源
      connection.close();
   }
}

🔯Java有垃圾回收机制,自动释放内存,但是资源不仅仅是内存啊,所以才需要关闭,资源需要手动关闭。

但是我们这么写,写出来的数据是写死的什么张三啥的,那我们该如何在动态的让用户输入数据呢,

PreparedStatement提供了我们占位符的写法,可以更优雅,更安全的解决上述问题

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

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;
public class Main {
   public static void main(String[] args) throws SQLException {
      Scanner scanner=new Scanner(System.in);
      System.out.println("输入姓名");
      String name=scanner.nextLine();
      System.out.println("输入数字");
      int id=scanner.nextInt();
//1.创建数据源
      DataSource dataSource=new MysqlDataSource();
      ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java108?characterEncoding=utf8&&useSSL=false");
      ((MysqlDataSource)dataSource).setUser("root");
      ((MysqlDataSource)dataSource).setPassword("lcl15604007179");
//2.和数据库服务器建立链接
      Connection connection=dataSource.getConnection();
//3.构造SQL语句
      String sql=" insert student values(?,?) ";
      PreparedStatement statement=connection.prepareStatement(sql);
      statement.setInt(1,id);          //表示的是第一个问号
      statement.setString(2,name);     //表示的是第二个问号
//4.返回受影响的行数
      int n=statement.executeUpdate();
      System.out.println(n);
//5.释放必要资源,关闭链接
      statement.close();
      connection.close();
   }
}

🔜就算是插入,修改,删除也没有区别,删除就是轻微的改动,下面的setString和SQL语句而已

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;
public class Main {
   public static void main(String[] args) throws SQLException {
      Scanner scanner=new Scanner(System.in);
      System.out.println("输入姓名");
      String name=scanner.nextLine();
//1.创建数据源
      DataSource dataSource=new MysqlDataSource();
      ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java108?characterEncoding=utf8&&useSSL=false");
      ((MysqlDataSource)dataSource).setUser("root");
      ((MysqlDataSource)dataSource).setPassword("lcl15604007179");
//2.和数据库服务器建立链接
      Connection connection=dataSource.getConnection();
//3.构造SQL语句
      String sql=" delete  from student  where  name=? ";
      PreparedStatement statement=connection.prepareStatement(sql);
      statement.setString(1,name);
//4.执行SQL语句
      int n=statement.executeUpdate();
      System.out.println(n);
//5关闭
      statement.close();
      connection.close();
   }
}

❤❤❤但是查询有说法,,一下就是查询要注意的操作。

//4.执行查询操作,要使用excuteQuery,返回值是一个ResultSet类型的对象,表示了一个表格

     ResultSet resultSet = statement.executeQuery();

//遍历结果集合

     while (resultSet.next())

这个意思是什么捏?💝💝💝想象有一个光标,这个光标的初始情况下,指向第一行记录的前一个位置~

如果每次调用next为true,取这行数据 ,取完这一行,下次又要调用next,此时要是返回false,循环结束

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;
import java.util.Scanner;
public class Main {
   public static void main(String[] args) throws SQLException {
      Scanner scanner = new Scanner(System.in);
//1.创建数据源
      DataSource dataSource = new MysqlDataSource();
      ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java108?characterEncoding=utf8&&useSSL=false");
      ((MysqlDataSource) dataSource).setUser("root");
      ((MysqlDataSource) dataSource).setPassword("lcl15604007179");
//2.和数据库服务器建立链接
      Connection connection = dataSource.getConnection();
//构造SQL语句
      String sql = " select * from student   ";
      PreparedStatement statement = connection.prepareStatement(sql);
//4.执行查询操作,要使用excuteQuery,返回值是一个ResultSet类型的对象,表示了一个表格
      ResultSet resultSet = statement.executeQuery();
//遍历结果集合
      while (resultSet.next()) {
//获取这一行学号列
         int id = resultSet.getInt("id");
//获取姓名列
         String name = resultSet.getString("name");
         System.out.println("id: " +  id + ",name: " + name);
      }
      statement.close();
      connection.close();
   }
}

当然里面也可以包含一些占位符。💖💖💖

public class Main {
   public static void main(String[] args) throws SQLException {
      Scanner scanner = new Scanner(System.in);
      int student_id=scanner.nextInt();
//1.创建数据源
      DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java108? characterEncoding=utf8&&useSSL=false");             
      ((MysqlDataSource) dataSource).setUser("root");
      ((MysqlDataSource) dataSource).setPassword("lcl15604007179");
//2.和数据库服务器建立链接
      Connection connection = dataSource.getConnection();
//注意哈,这里面是id不是你写的那个变量student_id
      String sql = " select * from student   where id = ? ";
      PreparedStatement statement = connection.prepareStatement(sql);
      statement.setInt(1,student_id);
//4.执行SQL语句
      ResultSet resultSet = statement.executeQuery();
      while (resultSet.next()) {
         int id = resultSet.getInt("id");
         String name = resultSet.getString("name");
         System.out.println("id: " +  id + ",name: " + name);
      }
//5.注意关闭的时候result也需要关闭
      resultSet.close();
      statement.close();
      connection.close();
   }
}

💟💟💟复杂的SQL也是这么写都支持(create table ,drop table都可以就是不推荐)

DataSource

Connection

PreparedStatement

Result

四大天王,通过这四个类,就可以基本吃遍JDBC编程

大佬会对JDBC进行进一步封装,数据库操作框架(虽然项目中不一定使用JDBC,一般都用框架代替,但是JDBC是不变化的,框架是可变的,基于JDBC去使用框架

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
20天前
|
存储 SQL 关系型数据库
mysql 的ReLog和BinLog区别
MySQL中的重做日志和二进制日志是确保数据库稳定性和可靠性的关键组件。重做日志主要用于事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务;而二进制日志记录SQL语句的逻辑变化,支持数据复制、恢复和审计。两者在写入时机、存储方式及配置参数等方面存在显著差异。
|
1天前
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
2天前
|
关系型数据库 MySQL 数据库
【MySQL基础篇】MySQL概述、Windows下载MySQL8.0超详细图文安装教程
在这一章节,主要介绍两个部分,数据库相关概念及MySQL数据库的介绍、下载、安装、启动及连接。接着,详细描述了MySQL 8.0的版本选择与下载,推荐使用社区版(免费)。安装过程包括自定义安装路径、配置环境变量、启动和停止服务、以及客户端连接测试。此外,还提供了在同一台电脑上安装多个MySQL版本的方法及卸载步骤。最后,解释了关系型数据库(RDBMS)的特点,即基于二维表存储数据,使用SQL语言进行操作,格式统一且便于维护。通过具体的结构图展示了MySQL的数据模型,说明了数据库服务器、数据库、表和记录之间的层次关系。
【MySQL基础篇】MySQL概述、Windows下载MySQL8.0超详细图文安装教程
|
8天前
|
关系型数据库 MySQL 数据库
docker高级篇(大厂进阶):安装mysql主从复制
docker高级篇(大厂进阶):安装mysql主从复制
66 24
|
2天前
|
NoSQL 关系型数据库 MySQL
Linux安装jdk、mysql、redis
Linux安装jdk、mysql、redis
58 7
|
22天前
|
存储 关系型数据库 MySQL
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
51 9
|
1天前
|
SQL Java 数据库连接
JDBC编程安装———通过代码操控数据库
本文,教你从0开始学习JBCD,包括驱动包的下载安装调试设置,以及java是如何通过JBDC实现对数据库的操作,以及代码的分析,超级详细
|
1月前
|
存储 NoSQL 关系型数据库
MySQL和Redis的区别
**MySQL和Redis的区别** MySQL和Redis都是流行的数据存储解决方案,但它们在设计、用途和特性上有显著区别。理解这些区别有助于选择合适的数据库来满足不同的应用需求。本文将详细介绍MySQL和Redis的区别,包括它们的架构、使用场景、性能和其他关键特性。 ### 一、基本概述 **MySQL**: MySQL是一个关系型数据库管理系统(RDBMS),使用结构化查询语言(SQL)进行数据管理。它支持事务、复杂查询和多种存储引擎,广泛应用于各种Web应用、企业系统和数据分析项目。 **Redis**: Redis是一个基于内存的键值数据库,通常被称为NoSQL数
87 4
|
1月前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
62 4
|
1月前
|
存储 SQL 关系型数据库
mysql 的ReLog和BinLog区别
MySQL中的重做日志(Redo Log)和二进制日志(Binary Log)是两种重要的日志系统。重做日志主要用于保证事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务更改。二进制日志则记录了数据库的所有逻辑变化操作,用于数据的复制、恢复和审计。两者在写入时机、存储方式、配置参数和使用范围上有所不同,共同确保了数据库的稳定性和可靠性。