JDBC数据库编程
JDBC(Java Database Connrctivity) Java数据库链接技术
官方JDK中提供的与JDBC有关的API都在java.sql包里面
API(Application Programming Interfact)
API是三方库中的一系列类和接口中方法的集合
调用API指的是调用三方库代码
数据库服务端Server
面向接口编程的好处是可插拔
注册mysql的驱动
需要让mysql驱动包中的类发生类加载即可
Class.forName(String);方法是JDK提供的专门用于类加载的方法
参数是类的路径的字符串,必须是全路径”包名+类名”
该方法会抛出一个编译时异常,ClassNotFoundException
Class.forName(“com.mysql.jdbc.Driver”)
DriverManager.getConnection()方法是用来建立client-server之间的TCP链接的方法
有三个参数1.url链接地址2.用户名3.密码
Url字符串的格式
协议/IP:端口/数据库名称?参数名和参数值
1.部分协议”jdbc:mysqll://”
Client与Server之间的通信协议是TCP/IP协议
传输的内容协议是jdbc:mysql://
- IP端口”localhost:3306”
IP服务端所在的机器的IP地址
服务端在本地可以写localhost,如果不在本地,必须写队分的IP地址
默认端口是3306
- 数据库名称“test”
mysql允许一个数据库端创建多个数据仓库
在建立CS链接的时候必须指定具体链接的仓库名称
如果指定的仓库名称不存在,链接会失败
上面三个部分必须有
- 链接参数 用?拼接的部分
每一组参数都是Kv结构k=v,k是参数名,v是参数值
可以有多组,多组之间用&拼接
| 参数名 | 参数值 | 说明 |
| useUnicode | true | 是否采用unicode编码集传输数据 如果不设置,默认是拉丁文,那么中文传输可能会乱码 |
| character Encoding | Utf-8 | 使用unicode中的utf-8这个版本的字符集 |
| serverTimezone | 如果客服端所在城市和服务端所在城市的时区不一样可能会出现时间错乱 可以通过这个参数来设置服务端的时区 |
分析器的主要作用是将客户端发过来的SQL语句进行分析,这将包括预处理与解析过程,在这个阶段会解析SQL语句的语义,并进行关键词和非关键词进行提取、解析,并组成一个解析树。具体的关键词包括不限定于以下:select/update/delete/or/in/where/group by/having/count/limit等。
在执行器的阶段,此时会调用存储引擎的API,API会调用存储引擎,主要有以上存储的引擎,不过常用的还是myisam和innodb:
引擎以前的名字叫做:表处理器(其实这个名字我觉得更能表达它存在的意义)负责对具体的数据文件进行操作,对SQL的语义比如select或者update进行分析,执行具体的操作。在执行完以后会将具体的操作记录到binlog中,需要注意的一点是:select不会记录到binlog中,只有update/delete/insert才会记录到binlog中。而update会采用两阶段提交的方式,记录都redolog中。
执行的状态
可以通过命令:show full processlist,展示所有的处理进程,主要包含了以下的状态,表示服务器处理客户端的状态,状态包含了从客户端发起请求到后台服务器处理的过程,包括加锁的过程、统计存储引擎的信息,排序数据、搜索中间表、发送数据等。囊括了所有的MySQL的所有状态,其中具体的含义如下图:
mysql的执行流程
要搞清楚mysql的执行流程之前,我们需要先搞明白几个重要的组件,把他们搞清楚了,自然就知道mysql的执行流程是怎样的了。
一共六个组件,我们一起来看看
连接器:连接mysql服务器,进行权限验证
缓存:保存上次查询的结果,提高性能
分析器:词法与语法分析
优化器:对你的查询语句做出适当的优化
执行器:操作存储引擎,读写数据
存储引擎:存储数据
所以mysql执行一个查询操作的完整流程为:客户端通过连接器建立连接,这个操作进行权限验证,通过之后会先前往缓存,根据sql作为key去查询,查到直接返回,否者前往分析器,经过分析器对sql语句的分析、解析,得到一个mysql可以理解的语法,随后进入优化器,mysql会根据你查询的条件进行适当的优化,之后在经过执行器,这就真正的开始前往存储引擎查询数据,最后将查询到的数据返回给客户端,顺便写入缓存(不一定)。
在 mysql 启动时,所有权限表的内容都会被加载到内存中。
当服务器监听到授权表发生改变时,已经连接的客户端将会发生如下改变:
表和列权限在客户端下一次请求时生效。
数据库权限改变在下一个USE db_name命令生效。
全局权限的改变和密码改变在下一次客户端连接时生效。
权限表一般在mysql库中。
user:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。
db:记录各个帐号在各个数据库上的操作权限。
table_priv:记录数据表级的操作权限。
columns_priv:记录数据列级的操作权限。
id:线程的唯一标识。
User:启动这个线程的用户。
Host:记录了发送请求的客户端IP和端口信息。
db:当前执行的命令发生在哪个数据库中,如果没有指定为NULL,比如我刚刚查询的sql:sqlshow processlist 并没有指定数据库,所以展示NULL。
Command:此刻线程正在执行的命令。
Time:该线程处于当前状态的时间。
State:线程状态,与Command对应。
Info:记录着线程执行的sql语句,默认展示前100个字符,如果需要查看全部,请执行 show full processlist。
执行流程‘
客户端 ----> 连接器 ----> 缓存 ----> 分析器 ----> 优化器 ----> 执行器 ----> 存储引擎 ----> 客户端
Insert语法:insert into表名[字段名列表]value(值列表)
Update的语法:update 表面 set 字段名=值【,字段名=值。。。】where 条件
Delete语法:delete from表名 where条件
Select查询语法:select 列名列表 from表名



