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

简介: 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去使用框架

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
存储 SQL 关系型数据库
mysql 的ReLog和BinLog区别
MySQL中的重做日志和二进制日志是确保数据库稳定性和可靠性的关键组件。重做日志主要用于事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务;而二进制日志记录SQL语句的逻辑变化,支持数据复制、恢复和审计。两者在写入时机、存储方式及配置参数等方面存在显著差异。
411 6
|
11月前
|
存储 关系型数据库 MySQL
MySQL中的int(10)、char(10)与varchar(10)的类型和区别
在选择正确的数据类型时,需要仔细考虑每列的数据特点及应用程序的使用情况。合理的数据类型选择可以优化存储空间的使用,提高查询速度和数据库的整体性能。
841 14
|
12月前
|
存储 关系型数据库 MySQL
MySQL数据库中的 char 与 varchar的区别是什么
MySQL中的char和varchar均用于存储字符串,但有显著区别。char为定长类型,固定长度,存储空间始终为设定值,适合长度固定的数据如手机号。varchar为变长类型,仅占用实际数据所需空间,适合长度不固定的内容如用户名。二者在性能与空间利用上各有优劣,应根据实际场景合理选择。
665 0
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
2603 57
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
SQL Oracle 关系型数据库
MySQL 和 Oracle 的区别?
本文对比了Oracle和MySQL数据库的多个方面。Oracle适用于大型数据库,支持高并发和大访问量,市场占有率为40%,安装占用空间较大,约3G;而MySQL适合中小型应用,是开源免费的,安装仅需152M。两者在主键生成、字符串处理、SQL语句、事务处理等方面存在差异。Oracle功能更为强大,尤其在企业级应用中表现突出,而MySQL则以简单易用见长。
1640 7
MySQL 和 Oracle 的区别?
|
存储 关系型数据库 MySQL
MYSQL支持的存储引擎有哪些, 有什么区别
MYSQL存储引擎有很多, 常用的就二种 : MyISAM和InnerDB , 者两种存储引擎的区别 ; ● MyISAM支持256TB的数据存储 , InnerDB只支持64TB的数据存储 ● MyISAM 不支持事务 , InnerDB支持事务 ● MyISAM 不支持外键 , InnerDB支持外键
|
SQL 存储 关系型数据库
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
2093 0
|
存储 关系型数据库 MySQL
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
466 9
|
SQL Java 数据库连接
JDBC编程安装———通过代码操控数据库
本文,教你从0开始学习JBCD,包括驱动包的下载安装调试设置,以及java是如何通过JBDC实现对数据库的操作,以及代码的分析,超级详细
|
存储 NoSQL 关系型数据库
MySQL和Redis的区别
**MySQL和Redis的区别** MySQL和Redis都是流行的数据存储解决方案,但它们在设计、用途和特性上有显著区别。理解这些区别有助于选择合适的数据库来满足不同的应用需求。本文将详细介绍MySQL和Redis的区别,包括它们的架构、使用场景、性能和其他关键特性。 ### 一、基本概述 **MySQL**: MySQL是一个关系型数据库管理系统(RDBMS),使用结构化查询语言(SQL)进行数据管理。它支持事务、复杂查询和多种存储引擎,广泛应用于各种Web应用、企业系统和数据分析项目。 **Redis**: Redis是一个基于内存的键值数据库,通常被称为NoSQL数
1131 4

推荐镜像

更多