unit1 数据库
1.MySQL:
数据目录:数据库(文件夹) 表(文件) 数据()
2.SQL概念:
- Structured Query Language,结构化查询语言,关系型数据库
- SQL语言,单行多行都行,分号结束“;”,语句不区分大小写,关键字建议大写
- 单行注释:-- 注释内容 # 注释内容
- 多行注释:/* 注释内容 */
3.SQL语句:
DML:增改查
create:create database 数据库 character set 字符集;
retrieve:show database;
update:alter database 数据库 character set 字符集;
DDL:删用数据库
delete:drop database 数据库;
use:select 数据库;
DDL:操作表
create:create table 表名(列名和列的数据类型);
数据类型:double(2,5) data(yyyy-MM-dd) datatime(yyyy--MM--dd HH:mm:ss)
复制表:create table 表名 like 被复制的表名;
retrieve:show tables; desc 表名;(查询表结构)
update:修改表名: alter table 表名 rename to 新表名;
修改字符集:alter table stu character set utf8;
添加一列:alter table 表名 add 列名 数据类型;
修改列名称:alter table 表名 change 列名 新列名 新列的数据类型;
delete:drop table 表名;
4.图形化界面工具SQLyog:Navicat。。。
DML:增删改查数据
除了数字类型,其余类型都要用引号引起来
添加:insert into 表名(列名1,列名2) values (值1,值2);
查询:select *from 表名;
删除:delete from 表名 【where 条件】;不推荐使用
truncate table 表名;先删除表,再创建一张一样的
修改:update 表名 set 列名1=值1 ,列名=值2 【where 条件】;
DQL:查询表中记录
- select 字段列表
- from 表名列表
- where 条件列表
- group by 分组字段
- having 分组之后的条件
- order by 排序
- limit 分页限定
- distinct 去除重复数据
基础查询:
- ifnull(表达式1,表达式2):null,计算结果都为null
- as用来起别名,也可以省略
- 一般也可以用四则运算计算列中的值
条件查询:where
- 运算符:> < <= >= = <>
- between and
- in 集合
- like 模糊查询: _单个任意字符 % 多个任意字符
- ** is null ,对的 ** = null,错误
- and && or || not !=
排序查询:order by 排序字段1,排序方式1, 排序字段2,排序方式2
排序方式:ASC,升序默认的 DESC,降序的 如果有多个排序条件,则当前面的条件值一样时候,才判断第二个条件
聚合函数:将一列数据作为整体,做纵向的计算
计算:count个数的 max最大值 min最小值 sum求和 avg平均值
count(*) MAX(math) 。。。都加上括号()
ps:会自动排除null的数据,一般选择非空的列(主键)
分组查询:group by 分组字段
分组后查询的字段必须为分组字段或者是聚合函数
where和having的区别:where在分组之前限定,where后不可跟聚合函数判断 having先分组再限定,后可跟聚合函数判断
分页查询:limit 开始的索引,每页查询的条数。公式:开始的索引=(当前页码-1)*每页显示的条数
select *from stu limit 0,3; limit是MYSQL 的方言
5.约束:约束条件
- 主键约束:primary key
- 非空约束:not null
- 唯一约束:unique
- 外键约束:foreign key
- 外键列 constraint 外键名称 foreign key (外键列名称) references 主表名称 (主表列名称)
- 外键约束的级联操作:联动操作,删除一个,联动的都删除
- 添加级联:alter table 表名 add constraint 外键名称 foreign key (外键列名称) references 主表名称 (主表列名称)on update cascade;
- 删除级联:on delete cascade;
- 自动增长:auto_increment
多表关系:一对一,一对多(在多的地方建立外键,指向一的地方建立的主键),多对多(中间有一个中介连接,N:1:M)
范式:不同的规范要求,被叫做范式,各种范式呈递次规范,先遵循前面再看后面的 ,越高范式数据冗余越小
第一范式1NF 2NF 3NF 巴斯-科德范式BCNF 4NF 5NF,完美范式
- 函数依赖:A-->B ID --》name
- 完全函数依赖:A-->B A是一个属性组 (ID,课程名称)-->分数
- 部分函数依赖:A-->B A算是部分的属性组 (ID,课程名称)-->name
- 传递函数依赖:A-->B ,B-->C ID-->name,name-->班主任
- 码:一张表中,一个属性或者属性组,被其他所有属性完全依赖了,这个属性就是该表的码
备份还原:
- 备份:mysqldump -uroot -proot 数据库名 > path
- 还原:登录,创建,使用,执行(source path)
6.多表查询:用来消除无用数据
- 笛卡尔积: A,B,取这两个集合的所有组成情况
- 内连接查询:表+条件+字段要求
- 隐式连接:where 条件
- 显式连接:from 表名 [ inner ] join 表名 on 条件
- 外连接查询:
- 左外:from 表名 left [ outer] join 表名 on 条件,查询左表所有数据以及他们的交集部分
- 右外:from 表名 right [ outer] join 表名 on 条件,查询右表所有数据以及他们的交集部分
- 子查询:查询中嵌套查询
- select * from A where A.'sex'=(select 'sex'='女' from A);
- 结果是单行单列:运算符=单值判断
- 多行单列:范围 in (3,2) 是3或者是2.
- 多行多列:一张虚拟表
7.事务:
- 概念:如果包含一个多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败
- 操作:开启事务start transaction,有问题回滚rollback,没问题提交commit
- 特征:原子性,持久性,隔离性,一致性
- 隔离级别:原本相互独立,但是多个事务操作同一批数据的话,会引发问题。安全级别高,则效率低
- 查询:select @@tx_isolation;
- 设置:set global transation isolation level 级别字符串;
- 在MySQL中,事务默认自动提交,Oracle中,事务默认手动提交;如果开启了事务并且没有提交事务,则事务会默认自动回滚
- 查看事务提交方式:select @@autocommit ; 0代表手动提交,1代表自动提交
- 修改事务提交方式:set @@autocommit = 1;
8.DCL:控制权限,管理。user表。%通配符可以表示在任意主机使用用户登录数据库
DDL:操作数据库和表
DML:增删改表中数据
DQL:查询表中数据
DCL:管理用户,授权------DBA(数据库管理员)
管理用户:
- 添加:create user '用户名'@'主机名' identified by ‘密码’;
- 删除:drop user '用户名'@'主机名' ;
- 修改密码:update user set password = password(新) where user = '用户名';
- root忘记密码:管理员需要运行cmd------net stop mysql -----mysqld-------skip-grant-tables----打开新的cmd,输入mysql,回车----use mysql----...
授权:
- 查询:show grants for '用户名'@'主机名' ;
- 授权:grant 权限列表 on 数据库名.表名 to '用户名'@'主机名' ;
- 撤销:revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名' ;
9.JDBC:java语言操作数据库,定义了一套操作所有关系型数据库的规则(接口)
bin.jar : 存放驱动jar包,都是class文件
- 导入驱动jar包:复制jar包,粘贴在libs包下面,右键--Add as Library
- 注册驱动
- 获取数据库连接对象Connection
- 定义SQL语句
- 获取执行SQL语句的对象statement
- 执行SQL,接受返回结果
- 处理结果
- 释放资源
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获取数据库连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db33"
, "root", "root");
//定义SQL语句
String sql = "update account set balance = 500 where id = 1";
//获取执行SQL的对象
Statement statement = connection.createStatement();
//执行SQL
int count = statement.executeUpdate(sql);
//处理结果
System.out.println(count);
//释放资源
statement.close();
connection.close();
五个对象:
DriverManager:驱动管理对象,注册驱动,告诉程序应该使用哪一个数据库驱动jar包
Connection:数据库连接对象,获取执行SQL的对象,管理事务(开启,提交,回滚)
开启:void setAutoCommit
提交:commit()
回滚:rollback()
Statement:执行SQL对象
ResultSet:结果集对象
PreparedStatement:执行SQL对象
JDBC工具类:Utils,配置文件解决问题
-----------------------------------------------------------------------------------
10.数据库连接池:
一个容器集合,存放数据库连接的容器。
系统初始化好之后,容器被创建,申请一些链接对象,当用户来访问数据库时候,从容器中获取链接对象,用户访问完之后,再将链接对象归还给容器。
实现:标准接口(DataSource) 获取方法(getConnection())----> 再归还连接
C3P0:数据库连接池技术
Druid:数据库连接池实现技术,阿里巴巴提供
C3P0:
- 导入两个jar包:add as library 还有驱动jar包
- 定义配置文件:c3p0.properties 或者是 c3p0-config.xml 放在src目录下面
- 创建核心对象:ComboPoolledDataSource
- 获取连接:getConnection
Driud:
- 导入jar包:add as library 还有驱动jar包
- 定义配置文件:driud.properties 或者是 driud-config.xml 可以放在任意下面
- 获取连接池对象:DriudDataSourceFactory
- 获取连接:getConnection
- 工具类:
11.SpringJDBC
- 导入jar包
- 创建对象JdbcTemplate,依赖于数据源DataSource,new一个对象即可
- 调用方法来完成增删改查操作
Over!!!