A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梦一生 初级黑马   /  2018-5-9 19:47  /  816 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

数据库
数据库的概述
数据库就是一个文件系统,通过标准的SQL语句获取数据
ER模型图
E : Entity(实体)
R : Relational(关系)
把实体创建成对应的关系来进行表示的图就是ER模型图.
矩形表示实体,椭圆表示属性,实体之间的关系用菱形来表示.
常见的关系型数据库
My SQL Oracle SQLServer DB2 SyBase
MySQL数据库
概述:
是一个关系型数据库管理系统.
关系型数据库:
存放实体之间的关系.
服务器:
一台安装数据库服务器的计算机.
存储方式:
数据库服务器的内部,通过数据库存储数据,(一个项目建一个数据库),数据库
中通过
表存储数据(一个实体创建一个表),表中会有多个记录(一个对象(实体)的实
例一条记录)
访问 :
mysql -u root -p
查看数据库服务器的参数: mysql --help
连接本地服务器可以省略: -h 和 -P
-h : hostname 指的是主机名或者是服务器的ip地址 -P : port 指的是端口
号(这个P是大写的)
SQL语法
概述:
结构化查询语言(Structured Query Language);访问数据库的语言,用于存
取数据以及
查询,更新和管理关系数据库系统;数据库脚本文件的扩展名.
SQL的分类
DDL:数据定义语言
create创建 drop删除 alter改变 等...
DCL:数据控制语言
grant权限操作 if 等...
DML:数据操纵语言(对表的增删改)
insert插入 update更新 delete删除 等...
DQL:数据查询语言
select选择
使用
对数据库的操作
创建:
create database 数据库名称 character set 字符集 collate 字符集校对规
则;
字符集就是编码表;字符集校对规则主要是数据库排序使用的.
查看:
查看所有的数据库: show databases;
查看某一数据库的字符集和校对规则: show create database 数据库名;
修改:(数据库的字符集和校对规则)
alter database 数据库名 character set 字符集 collate 校对规则;
删除:
drop database 数据库名;
切换数据库: use 数据库名:
java中的类型 MySQL中的类型
byte tinyint
short smallint
int int
long bigint
float float
double double
boolean bit
char/String char/varchar
Date date/time/datetime/timestamp
File BLOB/TEXT
查看正在使用的数据库: select database();
数据库表的操作
创建表
语法:
create table 表名(字段名 字段类型(长度) 约束,...); 多个字段用逗号隔开
字段的类型
字段: 一个实体的属性对应表的一个字段
SQL文件类型:
BLOB(指的是2进制的文件)/TEXT(值的是文本类型的文件)
SQL时间类型:
date只有日期
time只有时间
datetime既有时间又有日期,如果没有向这个字段存值,数据库使用null存入
timestamp既有时间又有日期,如果没有向这个字段存值,数据库使用当前
系统时间存入
SQL中字符/字符串:
char代表是固定长度的字符或字符串;数据的长度小于定义的长度会用空格
补齐;
varchar代表的是可变长度的字符串;数据的长度小于定义的长度会自动舍
弃多余的;
约束
作用:用来保证数据的完整性
分类:
主键约束: primary key 默认是唯一非空的
唯一约束: unique
非空约束: not null
自动增长: auto_increment
查看表
语法:
查看数据库下所有表: show tables;
查看某一个表的结构信息: desc 表名;
删除表
语法: drop table 表名;
修改表
语法:
添加列: alter table 表名 add 列名 类型(长度) 约束;
修改列类型,长度和约束: alter table 表名 modify 列名 类型(长度) 约束:
删除列: alter table 表名 drop 列名;
修改列名: alter table 表名 change 旧列名 新列名 类型(长度) 约束;
修改表名: rename table 旧表名 to 新的表名;
修改表的字符集: alter table 表名 character set 字符集;
表记录的操作
语法:
添加某些列: insert into 表名(列名1,列名2...) values(值1,值2...);
添加所有列: insert into 表名 values(值1,值2...); //这一列中有几个值就要
写几个值
注意:
##### 添加表记录
1. 值的类型与数据库中表列的类型一致.
2. 值的顺序与数据库中表列的顺序一致.
3. 值的最大的长度不能超过列设置最大长度.
4. 值的类型是字符串或日期类型,要使用单引号引起来.
5. 直接向数据库中添加中文会出现错误.
解决添加中文出错的方法:
1.输入show variables like '%character%';命令来查看数据库中与字符
集相关的参数;
2.将MySQL数据库服务器中的客户端部分(数据库服务器也分为客户端
和服务端)的字符集改为gbk(简体中文默认是gbk);
3.找到MySQL的安装路径:my.ini文件,修改文件中[client]下的字符集 4.
重新启动MySQL的服务器:打开运行窗口输入services.msc进到服务界
面找到MySQL,先停止,在启动;
修改表记录
语法: update 表名 set 列名=值,列名=值 where 条件; //修改几个写几个列
名,条件是可选的
注意事项:
1. 如果没条件,修改的就是这个表中这一列的所有值.
2. 值的类型与列的类型一致.
3. 值的最大长度不能超过列设置的最大长度.
4. 字符串类型和日期类型添加单引号.
删除表记录
语法: delete from 表名 where 条件; //条件是可选的
注意事项:
1. 删除表的记录,值的是删除表中的一行记录.
2. 删除如果没有条件,默认删除表中的所有记录.
删除表中的所有记录的两种方法(面试):
1. delete from 表名; 删除所有记录,属于DML语句,一条记录一条记录
删除。事务可以作用在DML语上,事物回滚可以找回.
2. truncate table 表名;
删除所有记录,属于DDL语句,将表删除,然后重新创建一个结构一
样的表。事务不能控制DDL的语句,删除后就无法在找回了.
查看表的记录
基本查询
语法: select [distinct] *或列名 from 表名 [where 条件];
注意:
1. 加上distinct后得到的数据是不重复的.
2. select语句后是可以执行运算的
3. 中括号内的都是可选的看实际情况选择是否要加
别名: as 别名名称;
条件查询
使用where子句:
别名示例: select name,english+chinese+math as sum from exam;
select name,english+chinese+math sum from exam;
注意: 取别名时这个as是可以省略的
> , < , >= , <= ,= , <>这个符号是不等于
like:模糊查询
in:范围查询
条件的关联: and并且 or或者 not不是
排序查询
语法: 使用order by 关键字; asc是升序(小到大) desc降序(大到小)
分组统计查询
聚合函数的使用:
在like子句中可以使用_或者%作为站位符;_只能代表一个字符,%是代表任意一个字符
代码示例: select * from exam where name like '李%' //查询所有姓李的学生
代码示例: select * from exam where english in (69,75,89); //查询英语成绩是69,
注意:这里所说的范围是括号内输入的这几个数据,并不是一个数到另一个数之间的范围!!!!
代码示例:
select * from exam order by chinese; //默认是升序,可以省略asc
select * from exam order by chinese desc;//按降序排列
//查询学生信息,先按照语文成绩进行倒序排序,如果成绩相同再按照英语成绩升序排序
select * from exam order by chinese desc,english asc;
//查询姓李的学生的信息,按照英语成绩降序排序
select * from exam where name like '李%' order by english
求和: sum() //括号内是要求和的列名
统计个数:count() //括号内是要统计个数的列名
最大值:max() //括号内是要求最大值的列名
最小值:min() //括号内是要求最小值的列名
平均值:avg() //括号内是要求平均值的列名
分组查询
语法: 使用group by 关键字; //要根据那个列名进行分组就写在group by关
键字后;
注意: 在分组后要是还需要条件过滤就需要使用一个关键字having
//下面两个语句都可以实现统计总分;但是有些时候会有不同;
select sum(english)+sum(chinese)+sum(math) from exam;
select sum(english+chinese+math) from exam;
上面的语句是按照列的方式统计,英语成绩总和+语文成绩总和+数学成绩总和。
下面的语句是先计算一行的英语+语文+数学然后再求和。
当有某个数据是null的时候下面的计算方法就不准了,因为null和任何数据相加都为null
解决方法:使用ifnull()方法
具体用法,用ifnull把是空的数据括起来给他设置成0就可以了
sun(ifnull(english,0)+chinese+math)这样就可以了
示例://统计每类商品花费的总金额在5000元以上的商品,并且按照总金额升序排序
select product,sum(price) from orderitem group by product having
总结
MySQL语句顺序的写法(可以有没有的但是顺序不可以颠倒):
S(select)… F(from)…W(where)…G(group by)…H(having)…O(order
by);
多表
多表约束
外键约束: 用来保证数据完整性;
使用场景: 当有一个表中的某列数据是来自于另一个表中的时候就用到了外
键约束
语法:
alter table 要添加外键的表名 add foreign key(要添加在那一列的列名)
references 要指向哪个表的表名(指向这个表的主键名); //实际开发中是不
会设置成真正的外键的
表与表之间的关系
1. 一对多
2. 多对多
3. 一对一
一对多的建表原则:
在多的一方创建外键指向一的一方的主键.
示例: alter table employee add foreign key (dno) references dept(did);
多对多建表原则:
需要创建第三张表(中间表),在中间表中至少有两个字段分别作为外键,指向
多对多双方的主键.
一对一的关系建表原则:(也可以合并为一张表) 1.唯一外键对应:假设成一对
多的关系,在多的一方创建外键指向一的一方的主键,将外键设置成
unique(唯一)的; 2.主键对应:将两个表的主键建立对应关系即可. //一般不
建议使用
多表查询的分类
连接查询
交叉连接: 关键字 cross join
关联条件: 表中哪两个列进行关联的就写哪个;
内连接: 关键字 inner join //inner可以省略不写
交叉连接:查询到的是两个表的笛卡尔积(笛卡尔积就是算的两个表的所有记录的积)
语法:
select * from 表1 cross join 表2;
select * from 表1,表2;
显示内连接:在SQL中显示的调用inner join关键字
语法: select * from 表1 inner join 表2 on 关联条件;
示例: select * from classes c inner join student s on c.cid = s
隐式内连接:在SQL中没有调用inner join关键字
语法: select * from 表1,表2 where 关联条件;
示例: select * from classes c,student s where c.cid = s.cno;
得到的数据: 得到的是两个表的共有的部分;
外连接: outer join //outer可以省略
得到的数据: 左外连接得到的是两个表的共有的部分和左表的所有数据; 右
外连接得到的是两个表的共有的部分和右表的所有数据;
子查询
概念: 一个查询语句条件需要依赖另一个查询语句的结果.
子查询比多表联查查询效率低
关键字:
in某一范围
exists是否存在
any任意一个
all所有
左外连接: select * from 表1 left outer join 表2 on 关联条件;
右外连接: select * from 表1 right outer join 表2 on 关联条件;
查询学生生日在91年之后的班级的信息。
示例:select * from classes where cid in (SELECT cno FROM student
查询学生生日大于91年1月1日的班级的信息,如果记录存在,前面的SQL语句就会执行
示例:select * from classes where exists (SELECT cno FROM student
事物
基本概念和使用
概念: 指的是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么全的成
功,要么全都失败;
事物的特性:
1. 原子性: 事务的不可分割,组成事务的各个逻辑单元不可分割.
2. 一致性: 事务执行的前后,数据完整性保持一致
3. 隔离性:事务执行不应该受到其他事务的干扰
4. 持久性:事务一旦结束,数据就会持久化到数据库中.
开启事物: start transaction;
提交事物: commit;
回滚事物: rollback;
事物的隔离级别
隔离性:一个事务的执行,不应该受到其他事物的干扰.
代码示例:
any任意一个
示例:SELECT * FROM classes WHERE cid > ANY (SELECT cno FROM student )
all所有
示例:SELECT * FROM classes WHERE cid > ALL (SELECT cno FROM student)
解决方法: 设置事务的隔离级别
设置的语法: set session transaction isolation level 隔离级别;
查看当前的隔离级别: select @@tx_isolation;
注解
@Test
作用:单元测试,在不写main方法的时候也可以执行程序
导包: import org.junit.Test;
JDBC
概念&作用
java data base connectivity(简称jdbc) java数据库连接;
如果不考虑隔离性会引发一些安全问题,主要体现在读取数据上:
1.脏读:一个事务读到另一个事务未提交的数据,导致查询结果不一致
2.不可重复读:一个事务读到另一个事务已经提交的update的数据,导致多次查询结果不一致
3.虚读/幻读:一个事务读到另一个事务提交的insert的数据,导致多次查询结果不一致.
read uncommitted :脏读,不可重复读,虚读都有可能发生
read committed:避免脏读。但是不可重复读和虚读是有可能发生
repeatable read:避免脏读和不可重复读,但是虚读有可能发生。
serializable:避免脏读,不可重复读,虚读。事务不允许出现并发A窗口需要等待B窗口事务执行完成(提交或回滚)以后,才会执行A窗口的事务.
是一种用于执行SQL语句的java API;
sun公司提供的一套规范(接口),类,用来连接到数据库的;
数据库驱动: 两个设备(应用)之间通信的桥梁.
使用步骤
1. 注册驱动 (DriverManager类)
2. 获得连接 (DriverManager -> Connection)
3. 自定义SQL语句 (得到SQL语句)
4. 获得SQL对象 (Connection -> 执行SQL对象)
5. 执行SQL语句 (执行SQL对象 -> Result或int)
6. 释放资源 (Connection、执行SQL对象、ResultSet)
注意
注册驱动:因为Driver类的静态代码中调用了
DriverManager.registerDriver()方法,所以 直接加载类即可
Class.forName("com.mysql.jdbc.Driver") //加载MySQL驱动
DriverManager(驱动管理类)
注册驱动 DriverManager.registerDriver(new Driver()); 此方式不使用,
存在两方面不足 1) 硬编码,后期不易于程序扩展和维护 2) 驱动被注册两
次。原因:实现类源码,静态代码块已经调用此方法进行注册
获取数据库连接对象
方法:static Connection getConnection(String url, String user, String
password)
Connection(接口,连接数据库)
作用一:创建执行SQL语句的对象
方法:
Statement createStatement() 实际开发不会使用,有sql注入漏洞
CallableStatement prepareCall(String sql) 执行数据库中存储过程
PreparedStatement prepareStatement(String sql)
创建一个 PreparedStatement 对象执行SQL,会对SQL进行预处理,解决
SQL注入漏洞
作用二:管理事务(后面详细讲解)
方法:
void setAutoCommit(boolean autoCommit)
设置是否自动提交事务。设置为false,相当于开启事务,后面的execute
可以commit或rollback
void commit() 提交事物 void rollback() 回滚事物
静态修饰的方法,返回一个Connection接口的对象
url数据库地址:"jdbc:mysql://数据库服务器主机地址:端口号/数据库名"
jdbc是连接数据库的协议。
mysql是jdbc的子协议(用来区分连接的不同的数据库的)
user:与数据库连接的用户名
password:与数据库连接的密码
连接本地可简写:"jdbc:mysql:///数据库名"
Statement 接口(开发不用)
作用一:执行SQL int executeUpdate(String sql)
执行(insert,update,delete)的SQL语句,返回影响的行数 ResultSet
executeQuery(String sql)
执行(select)的SQL语句,返回ResultSet(结果集) 作用二:执行批处理
需在url后添加参数 "rewriteBatchedStatements=true" addBatch(String
sql) //将SQL添加到批处理 clearBatch() //清空此对象的当前SQL命令列表
executeBatch() //将一批命令执行,不会清空批处理
PreparedStatement接口(执行SQL)
继承Statement接口
作用:执行sql语句
int executeUpdate()
执行(insert,update,delete)的SQL语句,返回影响的行数
ResultSet executeQuery()
执行(select)的SQL语句,返回ResultSet(结果集)
setXxx(int,值) 设置?占位符参数。位置从1开始
批处理:
示例:
String sql = "delete from user where id = ?"; //编写sql语句
pstmt.setInt(1, 4); //对sql语句设置值
模糊查询的时候把 (like '%李') 直接写成(like ?) 在设置参数的时候写
void addBatch() //将SQL添加到批处理
void clearParameters() //清空批处理
prepareStatement对象中,批处理中的sql只执行一次
ResultSet接口(结果集)
作用:结果集对象,通过select语句的查询结果获得;
遍历的方法: boolean next(); 将光标从当前位置向下移一行,没有数据返回
false;
获取的方法:
getXXX(int columnIndex);参数传入数据库的列号; getXXX(String
columnName); 参数传入数据库的列名(如果有取别名要写别名)
JDBC释放资源
Connection对象要做到尽量晚创建,尽早释放.
通常有:ResultSet,Statement,Connection。
释放资源的代码写入finally代码块中
标准的释放资源方式:
if(对象!=null){
try{
对象.close();
}catch(SQLException e){
e.printStackTrace();
}
对象=null; //断开引用指向,可以尽早回收不用的资源
}
配置文件
1. 属性文件
格式:扩展名是.properties
内容是: key=value形式存在的
2. XML文件
Properties类(获取属性文件内容)
方法: void load(InputStream inStream); 传入一个输入流; 参数可以写成:
new FileInputStream("配置文件的路径") 得到的是一个键值对类型的数据
getProperty(String key) ; 参数传入键,通过指定的键获取到值;
JDBC的注入漏洞
解释: 不用密码通过用户名来登陆到网站上进行相应的操作.
演示:
正确的用户名' or '1=1 密码随便写 正确的用户名' -- 密码随便写
产生原因: 在变量中存在SQL的关键字 or 或者 --空格是注释
解决方法:
用PreparedStatement对象解决SQL注入漏洞,因为这个对象会对SQL语句
进行预编译 使用?作为占位符?所代表内容是SQL所固定。再次传入变量
(包含SQL的关键字)。这个时候也不会识别这些关键字。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马