JDBC

数据库介绍

一.数据库的概念

1.常见的数据库

Database:
数据库,储存和管理数据的仓库
DBMS:Database Mangement System 数据库管理系统
软件
RDBMS:关系型数据库管理系统
NoSQL:非关系型数据库管理系统
Redis:保存键值对类型的数据
MongoDB:保存json
Neo4j:图数据库

2.关系型数据库管理系统

MySQL,ProgressSQL,Oracle,SqlServer...
使用二维表格来保存数据:
行:记录 -> 一条数据 -> 和Java实体类实例化出的对象一一对应
列:字段 ->数据的名称 -> 和java的实体类一一对应
为什么叫关系型数据库?
因为表和表之间是通过关系(外键关系)来连接起来的

3.MySQL

开源免费的RDBMS
C/S架构的软件 client/server 客户端/服务器架构
MySQL的服务器叫做mysqlid,因为配置了一个服务,所以开机会自启,
不管是cmd里面打出的mysql -u root -p 还是使用navicat连接到服务器,
其实都是客户端
IP:
identification protrocal -> 用来在网络上唯一标识一台计算机

4.端口号

在一台计算机上唯一标识一个进程
8080:tomcat默认的端口号
80: HTTP协议默认的端口号
ip+端口号:
访问到一台计算机上面的一个进程

二.数据表及sql介绍

1.介绍

structured query language -> 结构化查询语句
用来在RDBMS里面去检索,管理一些信息
有一个标准化的,但是每一个RDBMS都可能有一些自己的方言

2.SQL

DDL:Data Define Language -> 建库建表语句 create table ...
DML:Data Manipulate Language -> 数据操纵语句 insert delete
update语句
DQL:Data Query Language -> 数据查询语句 select 语句
DCL:Data Control Language -> 数据空值语句 建立用户,管理权限

三.数据库数据类型

数据库的数据类型:
1.varchar 动态字符串 空间大小根据字符串的长度自动分配 -> String
2.int -> 整形 长度是有多少位数字 -> int
3.tinyInt -> boolean 1true 0false
4.date -> yyyy-MM-dd -> Date
5.datetime -> yyyy-MM-DD hh:mm:ss -> TimeStamp
6.longtext -> 长文本 保存一些文章可以用

四.数据库的完整性约束

1.非空约束 -> 设置字段的时候 勾选上 NOT NULL
2.唯一约束 -> 对字段设置一个unique索引
3.主键约束 -> 设置一个或者多个字段作为主键
主键:唯一标识一行记录 主键的选取标准:不能有任何的业务含义
4.外键约束 ->
如果一个键在一张表里作为主键的话,在另一张表里出现,就可以作为
外键
举例:
部门表 id 如果在员工表里出现的话 就可以作为外键了 表示一个员工
属于一个部门

五.表和表之间的关系

1. 1对1 2. 1对多 3. 多对多

一对一:
	一张表中的一条记录 唯一对应另一张表中的一条记录
	不常见,一般来说做权限分离的时候会用,应用场景很少
一对多:
	一张表中的一条记录 对应另一张表的多条记录
	怎么完成一对多关系?
	在多的那张表里面建立外键
多对多:
	两张表里面的记录都互相对应多小记录
	举例:
	商品表 顾客表
	一个商品可以被多个顾客购买,一个顾客也可以购买多个商品
	怎么完成多对多关系?
	使用一张交叉引用表(中间表),在中间表里面建立 两张表的外键

六.SQL语句

1.增删改查

1.1.insert

1. insert into 表名 values (列1,列2...) 
-> 按照字段的顺序来插 入值 ps:字段的顺序是由建表语句的定义字段的顺序来决定的,跟navicat里 面用鼠标调左右那个顺序没关系 
2. insert into 表名 (字段1,字段2...) valus (值1,值2...) 
-> 向指定的字段来插入一些值 

1.2.delete

delete from 表名 where xxx 
-> 删除表里面符合条件的记录 

1.3.update

update 表名 set 字段1=1,字段2=2...where xxx
-> 修改表 里符合条件的记录对应的字段值

1.4.select

select 字段 6 from 表名 1 join 表名 on 条件 2 where xxx 3 group by 字段 4 having xxx 5 order by 字段 7 limit offset,count 8

2.查询语句关键字

2.1.from语句

先把一张表里面的所有的数据全部获取出来

2.2.join语句:

内连接:
	1.做笛卡尔积 将第一张表里面的所有的字段和第二表里面的所有字段拼接到一起
	2.根据on的条件进行筛选,筛选出符合条件的记录(满足on后面的布尔表达式的结果为true)
外连接:
    第一种理解方式:
	1.做笛卡尔积 将第一张表里面的所有的字段和第二表里面的所有字段拼接到一起
	2.根据on的条件进行筛选,筛选出符合条件的记录(满足on后面的布尔表达式的结果为true3.将左连接/右连接 表里面的外部行(不满足on条件的记录)拼接到表的下面
    第二种理解方法:
	1.如果是左连接的话,以左表为基准,先将左表中的所有数据显示出来
	2.将右表中的每一条记录和左表的记录拼接到一起,如果满足on的条件的话,就拼接到临时表里面
内连接和外连接有什么区别?
	内连接的结果在两张表中都有对应的记录
	外连接的话,可能会出现不满足on条件的记录

2.3.where子句

从临时表中筛选,如果这条记录满足where自己的条件(如果能使where自己的结果为true的话,添加到临时表里面)

	like -> 模糊查询 % 多个字符 _单个字符 like "%张" -> 以张结尾的字符串
	like运算符后面必须写引号 ""
	bewteen ... and ... -> 在...之间
	in -> 在...里面 a in (500,100) 可以和or运算符互换 a = 500 or a = 100 ->
	可以用在子查询里面,当作一些值来用
	需要子查询的结果是一个1*N的表
	not -> 取反

2.4.group by子句

   分组查询是将一些结果集 按照字段进行分组,字段值相同的为一组,如果只分组,结果集里面只会显示每一组的第一条数据
	group by子句一般会搭配聚合函数使用,这样的话分组才有意义,比如:统计每一组的平均值,最大值,最小值,数量等
   聚合函数:
	count() -> 统计数量
	max() min() -> 最大值
	avg() -> 平均值
	sum() -> 求和
	group_concat() -> 将每一组某个字段的值,通过,分隔开,拼接成一个字符串

	如果没用指定分组的话,默认是把整张表的数据作为一组来使用
	group by可以指定多个字段作为一组,如果指定了多个字段的话,表示的是这些字段的值全部一样的记录会分为一组

2.5.having子句

-> 用来对分组后的结果进行筛选
	having子句里面可以使用聚合函数,但是where子句里面不行,为什么?
		因为where子句执行的时候,还没有group by 还没有分组,所以用不了聚合函数

2.6.select子句

从以上得到的结果集里面筛选出想要的字段

2.7.order by

排序 根据一些字段进行排序
	ASC -> 升序 从小到大
	DESC -> 降序 从大到小
	order by 子句如果指定了多个字段的话,第一个字段一样的字段,就通过第二个字段进行排序,以此类推

2.8.limit

limit是mysql的一个方言,在以前的RDBMS里面也有会类似的语句,但是不是limit
	通过limit子句可以完成分页
	前端:
	  <script> var offset = 0; $.get("/user?offset="+offset+"&limit=10",
	     function(data){
		 //表示如果请求成功的话,就会执行这个函数,data就是服务器向ajax请 求返回的诗句 xxx; 
		 offset+=10; 
	   })
	  </script>
	后端:
		select * from user limit 前端传入的offset,前端传入的limit

七、SQL注入

select * from user where username = 'zhangsan' and password = '' or 1='1'
如果用户输入的密码是 'or 1='1 , 就会把数据库所有的信息全部返回回去,爆库了
SQL注入原理:通过猜别人的sql语句,输入一个特殊的字符串,构建一个不合理的sql语句

八、索引,事务,存储引擎

1.索引

1.1索引

  索引就是一个数据结构,数据库里面的数据可以按照索引的方式来构建成一颗B+树,从而大大提高数据的查找速
  索引是不是越多越好?
	不是,因为虽然索引可以大大增加查询的速度,但是索引会占用空间,而且当我们增加,删除,修改的时候,会动态维护索引,到底增删改的速度变慢

1.2聚簇索引和非聚簇索引

聚簇索引:
	聚簇索引将索引和主键存放在一起,如果使用了聚簇索引,找到索引的同时就找到了主键,就找到了数据,速度非常快,但是每一张表只能设置一个聚簇索引
	聚餐索引很珍贵,不要把聚簇索引设置到主键上,一定要设置到最常用的那个字段

非聚簇索引:
	非聚簇索引可以看作是一个指向主键的指针,找到了设置非聚簇索引的字段以后,还要根据非聚簇索引找到主键才能找到数据,速度会比较慢一点,但是一张表可以随意设置非聚簇索引


索引的最左匹配原则:
	where子句使用了多个字段,如果最左边的字段没有设置索引的话,就不会走索引了,会全表查找

1.3.SQL优化

索引怎么建立最好
	1.在经常使用where语句的字段上建立索引
	2.join表的外键上键索引
	3.分组的字段上可以建立索引
	4.根据业务需求,如果where语句里面使用了多个字段的话,可以建立联合索引(将几个字段一起建立索引)
	5.在列值重复比较多的列上不易建立索引
	6.blob,longtext等数据值很大的列上不宜建立索引

2.事务

2.1.什么是事务

什么叫做事务:
	事务就是将一组sql语句作为一个不可分割的整体一起来执行,这些语句要么全部执行成功,要么都不成功
事务有什么用?
	防止一些安全性问题
	比如:转账,订单,仓库管理系统...

2.2事务的四个特性ACID

A -> 原子性每一个事务都是不可拆分的最小单位
C -> 一致性事务执行前和执行后,系统的状态是一致的
I -> 隔离性 每一个事务对于其他事务而言都是隔离状态,不会相互影响
D -> 持久性 事务执行后的结果会实际影响到磁盘

2.3事务的隔离级别:

两个事务之间相互影响的程度
   1.UNCOMMITED READ (未提交读):

      时间点       	事务A     	事务B 
       1)             开启事务
       2)                             开启事务
       3)           查询数据为1004)                            insert一条数据
       5)           再查询,结果为101条
     一个事务读取到了另一个事务还没有提交就修改的数据 -> 脏读
   2.COMMITED READ(提交读)
	虽然解决了脏读问题,但是第二个事务提交以后,事务一发现两次读取的结果还是不一样 ->不可重复读
   
   3.REPEATABLE READ(可重复读) 
   	- MySQL默认的隔离级别
 时间点		事务A  		事务B
   1            开启事务
   2 				开启事务
   3          查询数据“张三”,不存在
   4 				插入数据“张三” 
   5 				 提交事务
   6          查询数据“张三”,不存在
   7          插入数据“张三”,不成功
虽然说解决了刚才的不可重复度问题,即使事务B提交了以后,查询的结果还是和以前保持一致,但是此时要新增一条数据的话,就会不成功了,就像感觉到了一个幻影的数据 -> 幻读
4.SERIALIZABLE(可串行化)
	将所有的事物串行处理,什么现象都不会产生,但是速度极慢!性能最差!

3.存储引擎:

MyIsam:MySQL5.1之前的默认的存储引擎
	优点:CRUD速度比较快
	缺点:
		1.不支持事务
		2.不支持外键
	Innodb:MySQL5.1之后的默认的存储引擎
	虽然CRUD速度会慢一点,但是支持事务,外键,同时如果数据损坏了,也容易恢复
	MEMEORY:内存 速度最快,但是没法持久化保存

九.JDBC

1.JDBC是什么?

JDBC是什么?
	JDBC是java官方提供的一套操作数据库的标准
	JDBC是一整套接口,开发者调用这些接口就可以操作数据库,设计者实现这些接口,就可以完成对应RDBMS的数据库操作功能

2.步骤

1.加载驱动
class.forname(“com.mysql.jdbc.Driver”)
2.建立连接
Connection:
    生成一个客户端,用来保持java和数据库的连接状态            
	 DriverManger.getConnection(url,username,password)
	 MySQL的URL: jdbc:mysql://localhost:3306/数据库的名称
	 connection.setAutoCommit(false) -> 自动提交,默认为true,默认以一条

    sql语句作为一个事务
	connection.commit() -> 提交事务
	connection.rollback() -> 回滚事务
3.创建一个prepareStatement用来执行sql语句
	 int executeUpdate() -> 执行增删改语句 返回影响的行数
	 ResultSet executeQuery() -> 执行查询语句 返回一个ResultSet对象结果集
4.遍历ResultSet
	 ResultSet是一张表的结构,内置了一个游标,游标指向的位置是第一行的上方
	 next() -> 将游标移动到下一行
	 while(resultSer.next()){
	resultSet.getString("列名") -> 通过列名来获得一个varchar类型的数据xxx}
5.关闭连接

posted on   喜乐L  阅读(33)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示