黑马程序员技术交流社区
标题: 【石家庄校区】JDBC [打印本页]
作者: 林志博 时间: 2018-10-18 17:47
标题: 【石家庄校区】JDBC
本帖最后由 小石姐姐 于 2018-10-19 11:00 编辑
今日内容:
1.JDBC概述
2.JDBC常用API
3.JDBC工具类的封装
4.综合案例:通过JDBC对数据库进行CRUD操作
5.事务操作:通过JDBC完成事务的操作
一 概念
概念:Java database connectivity java 数据库连接,Java语言操作数据库
JDBC本质:其实是官方(SUN公司)定义的一套操作所有关系型数据库的规则,即接口.哥哥数据库厂商去实现这套接口,提供数去库驱动jar包.我们可以使用这套(JDBC)编程,真正执行的代码是JAR包中的实现类.
二 快速入门
步骤
1. 导入驱动jar包
a) 复制jar包到项目libs目录下(自己创建);
b) 右键àadd as library
2. 注册驱动
3. 获取数据库的连接对象 Connection
4. 定义SQL
5. 获取执行sql语句的对象 Statement
6. 执行sql,接受返回结果
7. 处理结果
8. 释放资源
Jdbc常见的异常:
Java.sql.exception:Accessdenied for user`root@localhost
JDBC中的实现类:
Drivermanager: 功能
1.注册驱动
2.获取数据库连接
视频4 视频5
一:
什么 是javaweb?
*使用Java语言开发互联网项目.简单理解:使用Java语言开发网站
课程介绍:30天
数据库:5天
网页前端:5天
web核心技术:15天
旅游管理系统:5天
二:
##1.数据库的基本概念
1.数据库的英文单词 DataBase简称 DB
2.什么是数据库?
*用于存储和管理数据的仓库
3.数据库的特点
1.持久化存储数据.其实数据库就是一个文件系统
2.方便存储和管理数据
3.使用了统一的方式来操作数据库
4.常见的数据库的软件
Oracle:大型数据库,收费昂贵
MySQL: 开源小型数据库,MySQL6.x版本也开始收费
Microsoft SQL Server:微软 中型服务器 收费
DB2:IBM 收费 常用与银行系统中
在web应用中,使用最多的就是MySQL数据库,原因如下:
1)开源,免费
2)功能足够强大,足以应付web应用开发(最高支持千万级别的并发访问)
*参见资料内<MySQL基础.pdf>文档
##2.MySQL数据库的软件
1)安装
MySQL默认端口号3306
选择字符集UTF-8
账号root 密码自己设置 建议设置成root
MySQL -uroot -proot
2)卸载
如果卸载不干净将再也无法安装
1.打开MySQL安装目录,找到my.ini文件,复制出数据文件夹路径 datadir= "路径"
2.卸载MySQL
3.根据数据文件夹路径找到文件夹(可能是隐藏的)删除文件夹
3)配置
*MySQL服务(没有界面的后台程序)
*MySQL服务的启动
win+R打开cmd 输入 services.msc 启动服务列表 找到MySQL服务,右击开始或停止(默认是已经开启的)
以管理员身份打开cmd,输入netstop mysql 来关闭MySQL的服务,输入net start mysql来开启MySQL的服务(mysql在这里是服务器的名字,默认mysql)
4)登录和退出
1)登录
cmd内输入 mysql -uroot-p密码
或者mysql -uroot -p 敲回车再输入密码(密码加密显示)
登录别人的服务器 mysql -hip -uroot -p连接目标的密码
mysql --host=ip --user=root -password=连接目标的密码
2)退出
输入exit
输入quit
5)MySQL的目录结构
1)MySQL的安装目录
MySQL\bin\二进制可执行文件
MySQL\data\数据目录,日志文件数据文件
MySQL\include\C语言头信息
MySQL\lib\支持运行库文件
MySQL\share\MySQL错误文件
my.ini 配置文件
basedir 安装路径
datadir 数据路径
character-set-server 编码字符集
2)MySQL的数据目录
mysql
performance_schema
test
当一台计算机安装了mysql软件我们就可以称这台计算机为mysql服务器
mysql服务器是指硬件加软件
数据库: 文件夹
表 :文件
数据 :数据
三. SQL
1)什么是SQL?
Structured Query Language:结构化查询语言
其实就是定义了操作所有关系型数据库的规则.
每一种数据库操作的方式存在不一样的地方 我们称为"方言"
2)SQL通用语法
1.SQL语句可以单行或多行进行书写,以分号进行结尾
所有语句写在mysql->后 登录mysql不算
2.可以使用空格和Tab来增强语句的可读性
3.MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
4.3种注释
单行注释:-- 注释内容(两个横杆一个空格)或# 注释内容(可以不加空格)
多行注释:/*注释内容*/
3)SQL的分类
SQL根据操作的对象和功能不同分为四大类
1. DDL(Data Definition Language)数据定义语言
用来定义创建数据库对象:数据库,表,列等。关键字:create, drop,alter等
2. DML(Data Manipulation Language)数据操作语言
用来对数据库中表的数据进行增删改。关键字:insert, delete, update等
3. DQL(Data Query Language)数据查询语言
用来查询数据库中表的记录(数据)。关键字:select, where 等
4. DCL(Data Control Language)数据控制语言(了解)
用来定义数据库的授权访问权限和安全级别,及创建用户。关键字:GRANT,REVOKE 等
## DDL:操作数据库,表
1.操作数据库 : CRUD
1.C(Create):创建
创建数据库:
create database数据库名称;
创建数据库 判断不存在 在创建:
create database if not exists 数据库名称;
创建数据库并指定字符集:
create database 数据库名称 character set 字符集;
创建数据库判断是否已经存在,并制定字符集:
create database if not exists 数据库名称character set 字符集;
2.R(Retrieve):查询
查询所有数据库的名称:
show databases;
查看某个数据库的创建语句(查询显示的信息包括字符集):
show create database 数据库名称;
3.U(Update):修改
修改数据库的字符集:
alter database数据库名称character set 字符集;
4.D(Delete):删除
删除数据库 :
drop database 数据库名称;
判断数据库存在,存在再删除:
drop database if exists 数据库名称;
5.使用数据库
查询当前正在使用的数据库名称:
select database();
使用数据库
use 数据库名称;
```````````````````````````````````````````````````````````````
表结构:表头(字段)和字段对应的类型(数据类型);
表记录:表头(字段)对应的值;
```````````````````````````````````````````````````````````````
2.操作表
1.C(Create)创建
(1)创建表的语法:
Create table 表名(
列名1 数据类型1,
列名2 数据类型2,
列名3 数据类型3
);
-- 注意最后一列不需要加逗号.
****sql的数据类型
在java中的数据类型分为两类:基本数据类型和引用数据类型;
基本数据类型包括 int double float long byte shortchar boolean
而在SQL中的数据类型有一些不同:
1.int:整数类型
age int,
2.double:小数类型(5.2)指定位数最多几位,小数点后保留几位.
score double(5.2),
3.date:日期类型 ,只包含年月日,yyyy-mm-dd
4.datetime:日期,包含年月日时分秒,yyyy-MM-dd HH:mm:ss
5.timestamp:时间戳类型 包含年月日时分秒,如果将来不给这个字段赋值,或赋值为null,默认使用当前系统时间自动赋值.
6.varchar:字符串类型
name varchar(20)姓名最大20个字符
(2)复制表:
create table 表名like 被复制的表名;
2.R(Retrieve)查询
查询某个数据库中所有表名称:
show tables;
查询表结构:
desc 表名;
查询表的字符集:
show create table 表名;
3U(Update)修改
*修改表名:
alter table 表名rename to 新的表名;
*修改表的字符集:
alter table 表名character set 字符集名称
*添加一列:
alter table 表名 add 列名数据类型;
*修改列的名称 类型:
alter table 表名change 列名 新列名 新数据类型;
*只修改数据类型:
alter table 表名modify 列名 新数据类型;
*删除列
alter table 表名 drop列名;
4.D(Delete)删除
*删除表:
drop table 表名;
*如果表存在的话,删除表:
drop table if exists 表名;
阶段总结:
修改表的结构:
规律: alter table 表名
操作:
新表名: rename to 新的表名
添加列: add 新列 类型;
修改列和类型: change 列 新的列名 类型;
修改类型: modify 列 新的类型
删除列: drop 列
SQLyog的使用小技巧:
(1)按ctrl 拖动滚轮窗口中的字体变大
(2)name 在SQLyog 中是大写表示其为关键字 可以用``括起来
(3)表名称处右键选择改变表,可以直接图形化操作,完成后保存刷新.
(4)shift+tab 反向缩进;
##DML:增删改表中的数据
(1)添加数据
insert into 表名(列名1,列名2,...列名3)values(值1,值2,值3);
注意: 1,列名和值要一一对应
2,如果表名后不定义列名则默认给所有列添加值
3,除了数字类型,其他类型需要使用引号引起来(单双都可以,包括字符串和日期)
(2)删除数据
delete from 表名[where 条件]
注意 如果不加条件,则删除表中所有记录;
如果要删除所有记录
1.delete from 表名 --不推荐使用,因为需要逐条删除,效率太低
2,Truncate table 表名(属于DDL的SQL语句)
删除表,然后创建一个一模一样的空表;
(3)修改数据
语法 :
update 表名 set 列名1=值1,列名2=值2[where 条件=??];
注意 如果不加任何条件 则会将表中所有记录修改
## DQL查询表中的记录
查询表中所有数据:
select * from 表名;
查询表中的某一列:
select 列名 from 表名;
[1]语法: select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order dy
排序
limit
分页限定
二.基础查询
*1.多个字段的查询
select 字段名1,字段名2....from 表名;
注意:如果查询所有字段,则可以使用*来替代字段列表,但一些时候为了方便备注仍然适合输入全部的列名(字段名)来查询表
*2.去除重复:
Select distinct 列名from 表名;
去除重复的结果集
*3.计算列:
select 列名1,列名2,列名3,列名2+列名3 from 表名;
一般可以使用size运算计算一些列的值(一般只会进行数值型的计算)
ifnull(表达式1,表达式2):如果有null参与的运算结果都为null,因此我们需要判断是否为null,然后将其替换为0;
select 列名1,列名2,列名3,列名2+ifnull(表达式1:可能为空的列名3,表达式2:将其替换为的值) from 表名;
例:
selectname,math,english,math+ifnull(english,0) from 表名;
表达式1:那个字段需要判断是否为null
表达式2:如果该字段为null后的替换值
*4.起别名
例:
selectname,math,english,math+ifnull(english,0) AS 总分 from 表名;
as:as也可以省略,用一个或多个空字符替代.
select name,math 数学,english英语,math+ifnull(english,0) 总分from 表名;
注意:
1.字段 ,列名称,表头 ,都表示一个意思,都是表的Field
2.字符集,编码格式,编码表,都表示一个意思,都是编码
常见的编码:
utf-8:万能的码表,支持所有的字符。
gbk,gb2312,gb18030: 中文的码表,支持中文,还支持其它字符,但不包含日文,韩文等字符
iso-8859-1:西欧的码表,支持西欧的字符,但不支持日文,韩文,中文等字符
三.条件查询
需要知道两件事
1.where子句后面跟条件
2.运算符
>,<,<=,>=,=,<>
Between ...and
in(集合)
Like
is null
and &&
or ||
not !
*例
select * from 表名where 列名 运算符 条件;
select * from student3 where age >= 20;-- 查询年龄大于等于20岁
select * from student3 where age != 20; -- 查询年龄不等于20岁
select * from student3 where age <>20; -- 查询年龄不等于20岁
-- 查询年龄大于等于条件1并且小于等于条件2的三种方式
select * from student3 where age >= 20&& age<=30;-- 不推荐
select * from student3 where age >= 20and age<=30;
select * from student3 where age between 20and 30;
-- 查询年龄22岁,18岁,25的信息
select * from student3 where age =22 or age=18 or age =25;
select * from student3 where age in(22,18.25);
-- 查询英语成绩为null(null值不能使用=或!=去判断)
select * from student3 where english isnull;
-- 查询英语成绩不为null
select * from student3 where english is notnull;-- not一定要写在is后面
*like: 模糊查询
select * from 表名where 列名 like _条件% ;(一个下划线代表一个字,一个%不管几个字符有没有都可以)
例:
-- 查询姓马的人有哪些?
select * from student3 where name like '马%' ;
-- 查询姓名第二个字是化的人
select * from student3 where name like '_化%' ;
-- 查询姓名是3个字的人
select * from student3 where name like'___' ;
-- 查询姓名中包含马的人
select * from student3 where name like '%德%' ;
模糊条件查询
分组条件查询
排序条件查询
子查询
聚合函数查询
1 单表查询
1.1模糊查询
Select *From 表名 Where 列名 Like '&_';
like
% 匹配零到N个字符
下划线 一个_代替一个字符
1.2条件查询
字段between 值1 值2 等同于 字段>=值1and字段<=值2
字段 in(值1,.....值n)等同于 字段=值1 or字段=值2
字段isnull ,如果值为null不能使用= 要使用 isnull
1.3排序查询
基本语法
Select * from 表名
order by 排序字段1 排序方式1, 排序字段2 排序方式2;
如果不写排序方式 默认以升序排列
ASC: 升序 默认的
DESC: 降序
如果有多个排序条件 则当前边的条件值一样时 才会判断第二条件
1.4聚合函数查询
将一列数据作为一个整体,进行纵向计算.
Select count(english) from student;
Select count(ifnull(english,0)) from student;
count: 计算个数
一般选择没有null的列:主键
count(*)
max: 速算最大值
min : 计算最小值
sum: 计算和
avg:计算平均值
注意: 聚合函数的计算,null值不参与计算
出了count例外 其他不受影响
解决方案有两种
选择不包含null的列进行计算
ifnull函数
*
聚合函数里的参数:表的字段
聚合函数在进行运算时 null值不参与运算
觉函数一般是对 int 类型进行计算,其他没有意义
特别是在使用count()时用主键 因为主键null为1
1.5分组查询
基础语法:
group by 分组字段
注意
分组字段 数据要有共同特点 这样查询才有意义
分组查询时
select 分组字段, 聚合字段 from ......
查询操作是,关键词的先后顺序
select 字段
from 表名
where 分组前的条件判断
group by 分组字段
having 分组后的条件判断
order by 排序字段
分组之后查询的字段:分组字段,聚合函数
where 和having的区别
where在分组之前进行限定,如果不满足条件,则不参与分组,having在分组
之后限定,如果不满足结果,则不会被查询出来
where不可以跟聚合函数,having后可以使用聚合函数的计算
1.6分页查询
什么是分页查询
limit
语法:limit 开始的索引,每页查询的条数
-- 公式 :开始的索引=(当前的页码-1)*每页的条数
Seletc * from 表名 limit 0.3; - - 第一页
Seletc * from 表名 limit 3.3; - - 第二页
limit分页语句操作是一个MYSQL方言
limit 参数1,参数2
参数1:数据的其实位置(索引),从0开始,表示第1条记录
参数2:每页显示的具体个数
规律:参数1 = (参数2-1)* 参数2
2.约束(对表记录进行规范)(重点)
概念:对表中的数据进行限定,保证数据的正确性,有效性和完整性.
(1).约束的分类:
主键约束:primary key
非空约束:not null
唯一约束:unique
外键约束:foreignkey
(2)各种类型约束的详解
1.非空约束: not null,某一列的值不能为null
*在创建时对字段2添加非空约束
create table 表名(
字段名1 字段类型1,
字段名2 字段类型2 not null --对字段2添加非空约束
);
*删除字段2的非空约束
alter table 表名 modify 字段名2 字段类型2; -- 其实就是直接修改字段名2为普通的字段
*对已经创建的表中的字段2添加非空约束
alter table 表名 modify 字段名2 字段类型 not null;
2.唯一约束:unique,某一列的值不能重复
*在创建时对字段2添加唯一约束
create table 表名(
字段名1 字段类型1,
字段名2 字段类型2 unique --对字段2添加唯一约束
);
*删除字段2的唯一约束(重点记忆)
alter table 表名 drop index 字段名2;
*对已经创建的表中的字段2添加唯一约束
alter table 表名 modify 字段名2 字段类型 unique;
注意:
某一列的值不能重复
唯一约束可以有null值 但是只能有一条记录为null
删除唯一约束
3.主键约束:primary key,
(1).注意
1.含义 :非空且唯一
2.一张表只能有一个字段为主键
3.主键就是表中记录的唯一标识
(2).在创建表时,添加主键约束
create table 表名(
id int primary key,
name varchar(20)
);
(3).删除主键
alter Table 表名 drop primary key;
(4).添加主键
alter table 表名 modify 列名 列类型 Pyimary key;
(5).自动增长
(1).概念:如果某一列是数值类型的,使用auto_increment
可以来完成值得自动增长
(2).在创建表时,添加主键约束,并完成自增长
create table 表名(
id int primary key auto_increment,
name varchar(20)
);
可以自动增长,也可以手动赋值 自动增长时在上一条记录加1 所有手动赋值后下一条加1 自动赋值时 输入时 主键的位置 输入 null
删除自动增长
ALTER TABLE 表名 MODIFY 列名 列类型;
添加自动增长
alter table 表名 modify 列名 列类型 auto_increment;
自动增长也可以不和主键一起使用,自增对所有int类型都有效
4.外键约束:foreign key
让表与表建立关联关系,从而保证数据的正确性
1.在创建表时 可以添加外键
语法
create table 表名(
......
外键列,
constraint 外键名称 foreighkey (外键列名称) references 主表名称(主表列名称)
);
加外键约束 需要在创建列的最后一列加逗号 因为创建列也算一行
2 删除外键
alter table 表名 dropforeign key 外键名称;
3添加建
alter table 表名 constraint外键名称 foreigh key (外键字段名称)references 主表名称(主表列名称);
外键作用: 让表和表建立关系(关联性),确保数据的有效性和正确性
外键特点: 外键的值不能随意写
外键的值引用于另一张表的主键值
外键的值可以为null(但是为null没有任何意义)
外键的设计原则:
主表
子表
== 级联操作
级联操作概述 只有表与表之间有关联关系 ,才能进行级联操作
作用:当主表的数据发生变化时 那么子表的数据会级联发生变化
级联操作:一般情况下 操作是对update 和delete
分两种情况
第一种情况 当主表的数据变化时 子表的数据和主表保持一致
on update cascade on delete cascade
第二种情况 当主表的数据变化时 子表的数据(外键的数据 )设置为null
语法 on update set null on delete set null
### 数据库的设计
1多表之间的关系
1 一对一
*如:人和身份证之间
在一对一里 主表可以是任意一方
2一对多(多对一) 最为常见也最为重要
如:部门与员工 一个员工只能对应一个部门 但一个部门可以有很多员工
在一对多里 一方表就是指部门表
多方表就是指的员工表
外键设计在子表里面
3多对多(通俗来说就是强化版的一对一)
如:学生和课程
一个学生可以选很多门课程 一个课程也可以被很多学生选择
主表和子表可以是任意一方(不拓建这样区分和设计外键)
外键设计原则是 提供一张中间表 来完成外键的关联
2 数据库设计的范式
3多表关联(重点)
4数据库的设计范式
1. 多表的查询(掌握)
2. 事务(了解)
3. DCL 授权:了解
多表查询
l 查询语法回顾:
Select
列名列表
From
表名列表
Where
条件
l 多表查询表名用逗号隔开
l 多表查询被称为笛卡尔积A表 B表相乘的数据就是总数据
笛卡尔积:有两个集合A,B 取这两个集合的所有组成情况
要完成有效的多表查询,需要消除无用的数据(笛卡尔积)
多表查询的分类:
1. 内链接查询
a) 隐式内连接:使用where条件消除内连接
Select A表名.需要查询的列名, B表名.需要查询的列名 from A表名,B表名 whereA表名.外键=B表名.主键;
SQL语句过长 不方便书写和阅读可以用起别名的方式
2. 显示内连接
语法:
内连接查询注意事项
1 从哪些表中查询数据
2 条件是什么
3 查询哪些字段
消除笛卡尔积的关键在于 通过主键和外键的关联
(因为外键的值 引用于主键的值)
内外连接都会出现笛卡尔积,消除笛卡尔积依靠的是条件,只有当条件有效时,才能真正消除笛卡尔积
外连接查询
1. 左外连接
a) 语法:select 字段列表 from 表1 left[outer] join 表2 on 条件
查询的是左表所有数据 以及右表的与左表产生交集的部分
2. 右外连接
B 语法:select 字段列表 from 表1 right [outer] join 表2 on 条件
查询的是右表所有数据 以及左表的与右表产生交集的部分
子查询
概念:查询中嵌套查询,称嵌套的查询为子查询
子查询第一种情况 子查询作为一个值(单行单列)
子查询可以作为条件使用运算符去进行判断
比如 salary=(select max(salary) from emp);
子查询第二种情况 子查询作为一个数组(多行单列)
子查询可以作为条件 使用运算符in 来判断
子查询第三种情况 子查询作为一个表(多行多列)
子查询可以作为一张虚拟表来进行表参与查询
数据库调优 用响应速度最快的方式查询数据
## 事务
事务的基本介绍
1. 概念
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败.
操作:
1. 开启事务:start transaction;
2. 回滚:rollback;
3. 提交: commit;
在MYSQL数据库中事务默认自动提交
一条 DML(增删改)语句会自动提交一次事务.
事务提交的两种方式
自动提交
Mysql就是自动提交的
手动提交
需要先开启事务,在提交
修改事务的默认提交方式
事务的四大特征(面试题)
原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败
持久性:如果事务一旦提交或回滚,数据库会持久化的保存数据
隔离性:多个事务之间相互独立.
一致性:事务操作前后 数据总量不变
事务的隔离级别(了解)
概念:多个事务之间隔离的,相互独立的,但是如果多个事务操作同一批数据则会引发一些问题设置不同的隔离级别就可以解决这些问题
存在问题
1脏读:一个事务,读到了另一个事务中没有提交的数据
2不可重复读(虚读):在同一个事务中,两次读取到的数据不一样
3幻读:一个事物操作(DML)在数据表中所有记录,另一个事物调到了一条数据,则第一个数据查不到自己的修改.
隔离级别:
1read uncommitted:读未提交
*产生的问题:脏读,不可重复读,幻读
2read committed 读已提交
*产生的问题: 不可重复读,幻读
3repeatable read :可重复读
*产生的问题:幻读
4 serializable :串行化
可以解决所有问题
注意:隔离级别从小到大安全性越来越高,但是效率越来越低
设置之后断开链接在打开才能生效
事务的总结
是这一组操作不可在分割的单元,要么一起成功,或者一起失败
事务的四大特性:
原子持久 隔离 一致
事务的三大读问题
脏读
不可重复读(虚读)
幻读
事物的四大隔离级别(解决上面的三大读问题)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |