JAVA学习day17

JDBC

JDBC全称Java Database Connectivity,Java数据库连接技术

JDK中提供的与JDBC有关的API都在java.sql包中
API(Application programming interface),调用API就是调用三方库中的代码
API是三方库中一系列接口与类的集合

常用接口和类

DriverManager类接口

DriverManage类用来管理数据库中的所有驱动程序,是JDBC的管理层,作用于用户和驱动程序之间,跟踪可用的驱动程序,并在数据库的驱动之间建立连接,DriverManager类中的方法都是静态方法,下列是DriverManager的常用方法:
复制代码getConnection(String URL,String user,String PassWord) 指定3个参数,分别是连接地址,用户名 和密码 类连接数据库
setLoginTimeout() 获取驱动程序视图登陆到某一数据库可以等待的最长时间,以秒为单位,Println(String message) 将一条信息打印到当前JDBC日志流中

Connection 接口

COnnection 接口代表与特定的数据库的连接,要对数据库中的数据进行操作,首先要获取数据库连接,Connection实就像在应用程序与数据库之间开通了一条通道.可以通过DriverManager类的getConnection()方法获取Connection的实例.
Connection接口 的常用方法如下 createStatement()
创建Statement对象PrepareStatement()
创建预处理对PrepareStatementisReadOnly() 查看当前Connection对象的读取模式是否是只读形式SetReadOnly() 设置当前Connection对象的读写模式,默认是非只读模式close()
立即释放此Connection对象的数据库和JDBC资源,而不是自动释放复制代码

Statement

接口Statement接口用于创建向数据库中传递SQL语句的对象, 常用方法如下:复制代码execute(String sql) 执行静态的SELECT语句 可能返回多个数据集executeQuery(String sql) 执行给定的Sql语句 返回单个ResultSet对象clearBatch()
清空此Statement对象的当前SQL命令列表executeUpdate()
执行指定的SQL语句 该语句可以为INSERT UPDATE DELETE语句close()
释放Statement实例占用的数据库和JDBC资源

PreparedStatement接口

继承Statement,用于执行动态的SQL语句 ,通过PreparedStatement实例执行的SQL语句,将被编译并保存到PreparedStatement实例中,从而可以重复的执行该SQL语句 . preparedStatement接口的常用方法: execute( )
在此PreparedStatement对象执行SQL语句,该语句可以是任何类型的SQL语句executeQuery( )
在此preparedStatement对象中执行Sql查询语句,返回为查询数据集的对象executeUpdate()
在此preparedStatement对象执行Sql语句,该SQL语句必须是一个INSERT UPDATE DELETE语句,或者是没有返回值得DLL语句setbyte(int Pindex byte by)
将参数Pindex位置上设置为给定的byte参数bysetString(int Pindex String str)
将参数Pindex位置上设置为给定的String参数值strsetDouble(int pindex Double dou)
将参数Pindex位置上设置为给定的Double参数值dousetInt(int Pindex int i)
将参数Pindex位置上设置为给定的int参数值isetObject(int PIndex Ocject obj)
将参数Pindex位置上设置为给定的Object参数值Obj

ResultSet 接口

ResultSet接口类似于一个临时的数据表,用来暂时存放数据库查询操作获取到的数据集 它的常用方法如下:
getint() 以int形式获取当前行指定的列 getFloat() 以Float形式获取当前行指定的列getDate() 以Date形式获取当前行指定的列getBoolean() 以Boolean形式获取当前行指定的列getString() 以String形式获取当前行指定的列getObject() 以Object形式获取当前行指定的列 next( ) 将指针向下移一行updateInt()
用int值更新指定列updateFloat()用float值更新指定列updateLong()
用指定的long值更新指定的列updateString()用指定的"String"值更新指定列updateObejct()
用object值更新指定的列updatenull()
将指定的列值修改为nullupdateDate()
用指定的Date值更新指定的列updateDouble()
用指定的DOuble值更新指定的列

原文链接:https://blog.csdn.net/liulei202020/article/details/120473587

注册mysql驱动

需要让mysql驱动包中的Driver类发生内加载既可

Class.forName(String);//这个方法是JDK提供的专门用于内记载的方法
//参数写类的路径的字符串,必须是全路径(包名+类名),
//该方法会抛出一个编译时异常,ClassNotFoundException
例如Class.forName("com.mysql.jdbc.Driver");
image.png

让com.mysql.jdbc.Driver这个类发生内加载,因为当类被执行内加载的时候回自动执行static静态代码块,注册驱动=决定当前JDBC接口的实现是mysql


image.png

成功

DriverManager.getConnection()方法是用来建立client-server之间的TCP连接的方法,

有三个参数1:url连接地址字符串 2.用户名 3.密码
url字符串格式
协议//IP:端口/数据库名称?参数名和参数值

image.png

以此为例
1.(必须有)协议部分是"jdbc://mysql://"

2.(必须有)IP和端口部分:"localhost:3306",IP是服务端所在的机器的IP地址,服务端在本地就写localhost,不在本地就必须写对方的IP地址,端口默认是3306

3.(必须有)数据库名称"test"
mysql允许一个服务端创建多个数据仓库,在建立CS连接的时候必须指定具体链接的仓库名称,指定的仓库名称不存在会连接失败。

4.(可选)连接参数 用?拼接
每一组参数都是kv结构,语法是k=v,k是参数名,v是参数值
可以有多组,多组之间用&拼接


image.png

服务端

image.png

客户端

image.png

mysql服务端模块工作原理

image.png

连接器

连接器的主要职责就是:
1、负责与客户端的通信,是半双工模式,这就意味着某一固定时刻只能由客户端向服务器请求或者服务器向客户端发送数据,而不能同时进行,其中MySQL在与客户端连接TC/IP的。
2、验证请求用户的账户和密码是否正确,如果账户和密码错误,会报错:Access denied for user 'root'@'localhost' (using password: YES)
3、如果用户的账户和密码验证通过,会在MySQL自带的权限表中查询当前用户的权限。

MySQL中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表:

user表:存放用户账户信息以及全局级别(所有数据库)权限,决定了来自哪些主机的哪些用户可以访问数据库实例
db表:存放数据库级别的权限,决定了来自哪些主机的哪些用户可以访问此数据库
tables_priv表:存放表级别的权限,决定了来自哪些主机的哪些用户可以访问数据库的这个表
columns_priv表:存放列级别的权限,决定了来自哪些主机的哪些用户可以访问数据库表的这个字段

缓存

MySQL的缓存主要的作用是为了提升查询的效率,缓存以key和value的哈希表形式存储,key是具体的SQL语句,value是结果的集合。如果无法命中缓存,就继续走到分析器的这一步,如果命中缓存就直接返回给客户端。不过需要注意的是在MySQL的8.0版本以后,缓存被官方删除掉了。之所以删除掉,是因为查询缓存的失效非常频繁,如果在一个写多读少的环境中,缓存会频繁的新增和失效。对于某些更新压力大的数据库来说,查询缓存的命中率会非常低,MySQL为了维护缓存可能会出现一定的伸缩性的问题,目前在5.6的版本中已经默认关闭了,比较推荐的一种做法是将缓存放在客户端,性能大概会提升5倍左右。

分析器

分析器的主要作用是将客户端发过来的SQL语句进行分析,这将包括预处理与解析过程,在这个阶段会解析SQL语句的语义,并进行关键词和非关键词进行提取、解析,并组成一个解析树。具体的关键词包括不限定于以下:select/update/delete/or/in/where/group by/having/count/limit等。如果分析到语法错误,会直接给客户端抛出异常:“ERROR:You have an error in your SQL syntax.”。
比如:select * from user where userId =1234;
在分析器中就通过语义规则器将select from where这些关键词提取和匹配出来,MySQL会自动判断关键词和非关键词,将用户的匹配字段和自定义语句识别出来。这个阶段也会做一些校验:比如校验当前数据库是否存在user表,同时假如user表中不存在userId这个字段同样会报错:“unknown column in field list.”。

优化器

能够进入到优化器阶段表示SQL是符合MySQL的标准语义规则的并且可以执行的,此阶段主要是进行SQL语句的优化,会根据执行计划进行最优的选择,匹配合适的索引,选择最佳的执行方案。比如一个典型的例子是这样的:
表T,对A、B、C列建立联合索引,在进行查询的时候,当SQL查询到的结果是:select xx where B=x and A=x and C=x,很多人会以为是用不到索引的,但其实会用到,虽然索引必须符合最左原则才能使用,但是本质上,优化器会自动将这条SQL优化为:where A=x and B=x and C=X,这种优化会为了底层能够匹配到索引,同时在这个阶段是自动按照执行计划进行预处理,MySQL会计算各个执行方法的最佳时间,最终确定一条执行的SQL交给最后的执行器。

执行器

在执行器的阶段,此时会调用存储引擎的API,API会调用存储引擎,主要有一下存储的引擎,不过常用的还是myisam和innodb:
引擎以前的名字叫做:表处理器(其实这个名字我觉得更能表达它存在的意义)负责对具体的数据文件进行操作,对SQL的语义比如select或者update进行分析,执行具体的操作。在执行完以后会将具体的操作记录到binlog中,需要注意的一点是:select不会记录到binlog中,只有update/delete/insert才会记录到binlog中。而update会采用两阶段提交的方式,记录都redolog中。

mysql语法整理见之前的

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容