本帖最后由 小石姐姐 于 2018-12-13 09:10 编辑
day02_MySQL基础
数据库 DATABASE 简称 DB 数据库管理系统
数据存储到硬盘里其实就是一个文件系统
对数据增删改查
MYSQL->很多数据库->很多表->很多列->具体数据
操作数据库和表 DDL
-- CRUD
CREATE:创建 RETRIEVE:查询 UPDATE:修改 DELETE:删除 USE:使用
--创建指定名称数据库
create database 数据库名称;
-- 判断是否已创建数据库如果存在不创建 如果不存在 创建
create database if not exists 数据库名称;
-- 指定数据库的字符集
create database 数据库名称 character set 字符集名;
-- 指定数据库的字符集并判断是否存在
create database if not exists 数据库名称 character set gbk;
-- 查询所有的数据库名称
show databases;
-- 查询对应的数据库的字符集
show create database 数据库名称;
-- 修改数据库的字符集名称
alter database 数据库名称 character set 字符集名;
--删除指定数据库
Drop database 数据库名称
-- 判断数据库存在删除
Drop database if exists 数据库名称 ;
--使用数据库
select database();
use 数据库名称;
-------------------------------------------------
操作表
CREATE:创建 RETRIEVE:查询 UPDATE:修改 DELETE:删除
--查询某个数据库中所有的表
show tables;
-- 查询表结构
desc 表名 ;
--查询表名;
Show create table 表名;
-- 创建表
create table 表名 (
列名1 数据类型1,
列名2 数据类型2,
列名.. 数据类型...,
列名n 数据类型n
);
create table 表名 (
id int(3),
name varchar(20),
age int(3),
score double(4,1),
birthday date,
insert_time timestamp
);
数据类型
日期 date
datetime
timestamp
区别 :timestamp有默认值 为当前系统时间
字符串(char和varchar 定义的时候必须给长度)
char
varchar
text 超大文本/文本文件的保存
注意:
varchar(50)
区别 char和varchar
char(11)
varchar(11)
存入长度不能超出指定长度
varchar 长度是不在超范围的情况下可以根据内容改变,char会把长度固定,同时不足的部分会用空格补全
hello (六个空格)
hello (无空格)
--删除表
DROP database if exists 表名;
drop database 表名;
--删除表并复制相同表
create table 表名 like 复制的表名
--修改表名
alter table 表名 rename to 新的表名;
--修改表的字符集
show create table 表名;
alter table 表名 character set 字符集;
--添加一列
alter table 表名 add 列名 数据类型 ;
--修改名称 类型
alter table 表名 change 列名 新列名 (新数据类型);
alter table 表名 modify 列名 新数据类型;
--删除列
alter table drop 列名 ;
--修改表名称
RENAME TABLE 旧表名 to 新表名
(alter table 表名 add/drop/modify 列名 数据类型;)
增删改查表中数据 DML
-- 添加数据
insert into 表名 (列名1,列名2...,列名n)
values (数据名1,数据2...,数据n);
--删除数据:
1.delete from 表名 where 列=值; 删除的是数据 可以通过事务进行还原
如果不加条件则删除所有记录
2.truncate table 表名
-- 先删除表 在创建一张一样的表 删除的是表 不能通过事务进行还原
--修改数据
UPDATE 表名 set 列名1=值1,列名2=值3...列名n=值n...where 条件;
day03_MySQL约束
查询表中的数据 DQL
SELECT * FROM 表名 ;
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
基础查询
1. 多个字段的查询
SELECT 字段名1,字段名2...from 表名 ;
2. 去除重复
select DISTINCT 字段名 from 表名 ;
3. 计算列
select 字段名1,字段名2,字段名1+字段名2 from 表名; //数值型计算
null 参与的运算 计算结果都为null
4. select 字段名1 别名,字段名2 别名,字段名1+字段名2 别名 from 表名;
//也可以用As +别名
条件查询
1.where 子句后跟条件
2.运算符
select *from 表名 where age between 20 and 30 ;
select *from 表名 where age=22 or age=22 or age=25 ;
select *from 表名 where age in(18,22,25);
select *from 表名 where age is/is not null ;
3.模糊查询
select *from 表名 where name like '马%'; //姓马的人 字符+%
select *from 表名 where name like '_马%'; //第二个姓马的人 下划线+字符+%
select *from 表名 where name like '___'; //姓名为三个字的人 三个下划线
select *from 表名 where name like '%马%'; //姓名中包含马的人 %+字符+%
select *from 表名 where name like
4.排序查询 order by
SELECT *FROM 表名 ORDER BY 列名 DESC; 降序排列
SELECT *FROM 表名 ORDER BY 列名 ASC; 升序排列
聚合函数通常都是配合分组进行分配的
5.group by
SELECT 列名1,列名2,...,列名N FROM 表名 GROUP BY 列名;
SELECT brand,SUM(price) AS 'prices' FROM a
WHERE brand LIKE '%海塞%' GROUP BY brand ORDER BY price DESC;
SELECT 列名1,列名2,...,列名N FROM 表名 GROUP BY 列名 HAVING 条件;
注意:分组之后查询的字段:分组字段 聚合函数
where 和having的区别 ?
1.where 在分组之前进行限定 如果不满足条件 则不参与分组 having在分组之后限定
如果不满足 则不会被查询出来
2.wher e后不可以跟聚合函数 having 可以进行聚合函数的判断
6.分页查询 语法 limit 开始的索引 ,每页查询的条数;
公式:开始的索引=当前页码-1 *每页显示的条数
limit 是MySQL的方言
约束 :
概念 对表中的数据进行限定 保证数据的正确定 有效性 完整性
1.主键约束 primary key
非空且唯一
主键只有一个字段为主键
主键就是表中记录的唯一标识
1. id int primary key; 添加
2. alter table 表名 drop primary key ; 删除主键
3. alter table 表名 modfiy id int primary key ; 添加 主键
4. 自动增长
如果 某一列是数值类型的 使用AUTO_INCREMENT 可以来完成值得自动增长
id int primary key AUTO_INCREMENT ; 自动增长
alter table 表名 modfiy id int ;
alter table 表名 modfiy id int AUTO_INCREMENT;
2.非空约束 not null ;
在创建表时添加约束
name varchar (20) not null
alter table 表名 modfiy name varchar(20) not null;
alter table 表名 modfiy name varchar(20) ;
3.唯一约束 unique
某一列的值不能重复
phone_number varchar(20) unique ; --手机号
1.注意 唯一约束可以有null 值
只能有一条为null
alter table 表名 drop index phone_number;
alter table 表名 modfiy phone_number varchar(20) unique;
4.外键约束
-- 谁有外键谁就是从表
-- 谁没有外键谁是主表
外键(在创建完表以后创建外键)
eg
员工(从表)
id
名字
年龄
部门id
部门 (主表)
id
部门名称
部门地址
alter table 从表 add foreign key 从表列 references 主表(主键列)
从表 创建外键约束
添加 alter table 从表 add foreign key 外键字段名 references 主表(主键字段名);
删除 alter table 从表 drop foreign key 外键字段名;
级联 ON UPDATE CASCADE;
ON DELETE CASCADE;
班级学生 1-n
学生和课程多对多
create table tab_favorite(
rid int ,
uid int ,
primary key(rid,uid) --联合主键
foreign key(rid) references 主表(rid)
foreign key (uid) references 主表(uid)
);
数据库设计的范式
第一范式: 每一列都是不可分割的原子数据项
第二范式:在第一范式基础上 非码属性必须完全依赖候选码
1.函数依赖 :A->b 如果通过a属性值可以确定唯一b属性的值 则称b依赖于A
例如 学号->>姓名 (学号,课程名称)->分数
2.完全函数依赖:A->b 如果A是一个属性组 则B属性值就需要依赖于A属性组中所有的属性值
(学号,课程名称)->分数
3.部分函数依赖 AB->B 若干A是个属性组 则B属性值得确定只需要依赖A属性组中某些值即可
学号,课程名称)->姓名
4.传递函数依赖: A->b b->c 如一B属性的值 在通过B属性的值可以获取C属性的值则称C传递函数依赖A
学号->系名, 系名->系主任果通过A属性的值 可以确定唯
5.码 如果在一张表中 一个属性或属性组 被其他所有属性所完全依赖,则称这个属性为该表的码
主属性: 码属性组中所有的属性
非主属性:除码属性组的属性
第三范式: 在第二范式基础上 任何非主属性不依赖于其他非主属性 消除传递依赖
day04_MySQL多表&事务
1.多表查询
查询语法
select 列名列表 from 表名列表 where
迪卡热积 两个集合 A,B 取这两个集合组合所有情况
隐式查询:
select name,gender,name(表名的限定:表名.列) from 表1表2where 表1.列名=表2.列名
起别名更方便
显示内连接
SELECT *FROM 表1 JOIN 表二 ON 表1.id =表2.id;
select *from 表1 join 表二 on 关联条件 where 条件
左外链接:
select 列名 from 表1 left join 表二 on 条件
右外连接:
select 列名 from 表1 right join 表二 on 条件
左外连接查询的是左表的所有数据及其交集部分
右外连接查询的是游标的所有数据及其交集部分
子查询:
查询中嵌套查询:
子查询结果是单行单列 --> 作为条件
子查询结果是多行单列 -->条件in
子查询结果是多行多列 -->作为虚拟表(要注意和目标的 关联条件)
2.事务
事务的四大特征:
1. 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
2. 持久性:当事务提交或回滚后,数据库会持久化的保存数据。
3. 隔离性:多个事务之间。相互独立。
4. 一致性:事务操作前后,数据总量不变
day 05 06_JDBC及连接池&JDBCTemplate
面向接口编程(多态)
jdbc使用步骤:
1.注册驱动(DriverManager)
Class.forName("com.mysql.jdbc.Driver")
2.获取数据库连接对象(Connection)
方法: static Connection getConnection (String url,String user,String password)
参数:
url:指定连接的路径
jdbc:mysql://ip地址(域名):端口号/数据库名称,"账号密码";
例子:jdbc :mysql://localhost :3306/db3
细节:如果连接的是本机mysql,并且mysql 服务器默认端口是3306,则url可简写为 jdbc:mysql:///数据库名称
3.定义sql语句并且创建执行sql对象(Statement ,PreparedStatement)
* Statement createStatement()
* PreparedStatement prepareStatement(String sql)
4.执行sql获取结果
管理事务:
* 开启事务:con.setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
* 提交事务:con.commit()
* 回滚事务:con.rollback()
5.遍历结果 对结果进行操作
6.释放资源
导入三方jar包:
在module下创建libs目录
拷贝jar包到目录
右键jar包 add as libirary
ResultSet:结果集对象,封装查询结果
* boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
* getXxx(参数):获取数据
* Xxx:代表数据类型 如: int getInt() , String getString()
数据库连接池
Spring JDBC :JDBC Template
概念:
其实就是一个容器集合,存放数据库连接的容器
2.好处
节约资源 用户访问高效
实现"
标准接口 : DataSourse
1.方法:
获取连接:getConnection();
归还连接: 如果连接对象 Connnection 是从连接池中获取的
那么调用Connection .colse 方法 就不会关闭了.而是归还连接
2.一般不使用
1.C3PO:数据库连接池实现技术
2.Druid: 数据库连接池实现技术,由阿里巴巴提供的
C3P0:数据库连接池技术
* 步骤:
1. 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,
* 不要忘记导入数据库驱动jar包
2. 定义配置文件:
* 名称: c3p0.properties 或者 c3p0-config.xml
* 路径:直接将文件放在src目录下即可。
3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
4. 获取连接: getConnection
1. 步骤:
1. 导入jar包 druid-1.0.9.jar
2. 定义配置文件:
* 是properties形式的
* 可以叫任意名称,可以放在任意目录下
3. 加载配置文件。Properties
4. 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory
5. 获取连接:getConnection
. 定义工具类
1. 定义一个类 JDBCUtils
2. 提供静态代码块加载配置文件,初始化连接池对象
3. 提供方法
1. 获取连接方法:通过数据库连接池获取连接
2. 释放资源
3. 获取连接池的方法
JDBCTemplate
1. 导入jar包
2. 创建JdbcTemplate对象。依赖于数据源DataSource
* JdbcTemplate template = new JdbcTemplate(ds);
SPRING (基于jdbc来简化数据库的操作)
!!!如果有占位符需要传入参数
DataSource dataSource = new ComboPooledDataSource();
JdbcTemplate template = new JdbcTemplate(dataSource);
增删改
template.update("sql",[具体参数]);
查询
单条结果
Map<String,Object> map = template.queryForMap("sql",[具体参数]);
Bean bean = template.queryForObject("sql",new BeanPropertyRowMapper<Bean>(Bean.class),[具体参数]);
多条结果
List<Map<String,Object>> list = template.queryForList("sql",[具体参数]);
List<Bean> list = template.query("sql",new BeanPropertyRowMapper<Bean>(Bean.class),[具体参数]);
JdbcUtils实现思路
1.获取数据源(连接池) DataSource
2.获取连接对象 Connection
3.释放资源 重载
思路:
1,2:
DataSource在类加载的时候就应该初始化,为了保证对象能够及时创建,在 static{} 静态代码块中创建的对象
Properties pro = new Properties();
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"))
dataSource = DruidDataSourceFactory.createDataSoure(pro)
提供返回数据源的方法 getDataSource() ---> return dataSource
提供返回连接 getConnection() ---> return dataSource.getConnection()
3:
在关闭之前做非空判断!!! |