JavaEE : 企业级Java开发 Web
前端(页面:展示,数据!)
后台(连接点 :连接数据库JDBC,连接前端(控制前端跳转,给前端传递数据))
数据库 (存数据,TXT,Excel,word )
1. 数据库
数据库 :(DB datebase)
概念 :数据仓库,软件,安装在操作系统之上(windows linuxmac ) 之上!SQL,可以存储大量的数据,500万
作用 :存储数据,管理数据
2. 数据库分类
关系型数据库 : 行和列 SQL
1、MySQL Oracle Sql Sever DB2 SQLlite
2、通过表和表之间,行和列之间的关系进行数据的存储
非关系型数据库 :{key vaule} NOSQL not only SQL
1、Redis MongDB
2、非关系型数据库,对象存储,通过对象的自身属性来决定。
DBMS(数据库管理系统)
1、数据库的管理软件,科学有效的管理我们的数据,维护和获取数据;
3. 连接数据库
命令行连接
mysql -uroot -p123456 连接数据库 show databases; 查看所有的数据库 use school; 切换数据库 show tables; -- 查看数据库所有的表 describe stedents; -- 显示数据库中所有表的信息 create database westos; -- 创建数据库 exit; --退出连接 -- 单行注释
(1、1.1 )
数据库 xxx 语言
DDL :数据库定义语言
DML :数据库管理语言
DQL :数据库查询语言
DCL :数据库控制语言
1.2 操作数据库
操作数据库 > 操作数据库中的表 > 操作数据库中表的数据
1. 操作数据库
-
创建数据库
CREATE DATABASE IF NOT EXISTS westos
-
删除数据库
DROP DATABASE IF EXISTS hell
-
使用数据库
-- 如果你的表名或者字段是一个特殊字符,就需要带`` USE `school`
-
查看数据库
SHOW DATABASE
2. 数据库的列类型
数值
-
tinyint 十分小的数据 1个字节
-
smallint 较小的数据 2个字节
-
mediumint 中等大小 3个字节
-
int 标准整数 4个字节
-
bigint 较大的数据 8个字节
-
float 浮点数 4个字节
-
double 浮点数 8个字节
-
decimal 字符串形式的浮点数 应用金融
字符串
-
char 固定大小 0~255
-
varchar 可变字符串 0~65535
-
tingtext 微型文本 2^8-1
-
text 文本串 2^16-1
时间日期
-
data YYYY-MM-DD 日期格式
-
time HH : MM : ss 时间格式
-
datatime YYYY-MM-DD HH-MM-SS 最常用的时间格式
-
timestamp 时间戳 1970、1、1 ~ 到现在毫秒数
-
year 年份表示
null
没有值,未知
不要使用null进行计算
3. 数据库的字段属性
Unsigned : 1. 无符号整数 2. 声明该列不能为负数
zerofill : 1. 0填充的 2. 不足的位数,使用0来填充 int(3), 5--005
自增 :1. 通常理解为自增,自动在上一条记录上加一 2. 通常用来设计唯一的主键~index,必须是整数
-
可以自定义设置组件的自增值 AUTO_INCREMENT
非空 :假设设置为非空,如果不给数值就会报错
(1、1.2 )
4. 创建数据库表
CREATE TABLE IF NOT EXISTS `students`( `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT'学号', `name` VARCHAR(10) NOT NULL DEFAULT '匿名' COMMENT'姓名', `pwd` VARCHAR(10) NOT NULL DEFAULT '123456' COMMENT '密码', `sex` VARCHAR(10) NOT NULL DEFAULT '女' COMMENT '性别', `birthday` DATETIME DEFAULT NULL COMMENT '出生日期', `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址', `email` VARCHAR(50) DEFAULT NULL COMMENT '电子邮箱', PRIMARY KEY (`id`) )ENGINE = INNODB DEFAULT CHARSET = utf8
(1、1.3 )
公式 [] : 代表非必填 最后一个不用填写英文逗号
creat table [if not exists] `表名`( `字段名` 列类型 [属性] [索引] [注释], `字段名` 列类型 [属性] [索引] [注释], `字段名` 列类型 [属性] [索引] [注释] )[表类型] [字符集设置] [注释]
常用命令
SHOW CREATE DATABASE school -- 查看创建数据库的语句 SHOW CREATE TABLE students -- 查看students数据表的定义语句 DESC students -- 查看表的结构
5. 数据表的类型
-- 关于数据库引擎 INNODB 默认使用~ MYISAM 早些年使用
MYISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间大小 | 较小 | 较大,约为前者两倍 |
常规使用操作 :
MYISAM : 节约空间,速度较快
INNODB :安全性高,事物的处理,多表多用户操作
在物理空间的存储位置
所有数据库文件都存在data目录下,本质还是文件存储,一个文件夹对应一个数据库
MySQL引擎在物理文件上的区别
1.innoDB 在数据库中只有一个 *.frm文件,以及上级目录下的 ibdata1文件
2.MYISAM对应文件 :*.frm - 表结构的定义文件 *.MYD - 数据文件(data) *.MYI - 索引 (index)
设置数据库表中字符集编码
CHARSET = UTF8 不设置的话,MySQL会是默认的字符集编码~ (不支持中文)
6. 修改删除表
1、修改
-- 修改表的名字 :ALTER TABLE 旧表名 RENAME AS 新表名 ALTER TABLE teacher RENAME AS teacher1 -- 添加表的字段 :ALTER TABLE 表明 ADD 字段名 属性 ALTER TABLE teacher1 ADD age INT(11) -- 修改表的字段的名字(重命名,约束修改!) :ALTER TABLE 表明 MODIFY 字段名 列属性 ALTER TABLE teacher1 MODIFY NAME VARCHAR(11) -- 修改约束 ALTER TABLE teacher1 CHANGE age age1 INT(1) -- 字段重命名 -- 删除表的字段 :ALTER TABLE 表明 DROP 字段名 ALTER TABLE students DROP NAME
2、删除
-- 删除表 DROP TABLE IF EXISTS teacher1
1.3 MySQL 的数据管理
1. 外键
-- 删除表 DROP TABLE IF EXISTS teacher1 CREATE TABLE `grade`( `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级', `gradename` VARCHAR(20) COMMENT '名字', PRIMARY KEY(`gradeid`) )ENGINE=INNODB DEFAULT CHARSET=utf8 -- 创建表的时候没有外键关系 ALTER TABLE `student` ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);
以上的操作都是物理外键,数据库级别的外键,我们不建议使用。(避免数据库过多造成困扰)
总结 :
1、数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
2、我们想使用多张表的数据,想使用外键(程序取实现)
2. DML语言
数据库存在意义:数据存储,数据管理
DML语言 :数据操作语言
1、Insert (添加)
2、update (修改)
3、delete (删除)
3. 插入
-- 插入语句 -- insert into 表名([字段名1,字段2,字段3]) values (`值1`),(`值2`),(`值3`) INSERT INTO `grade`(`gradename`) VALUES('大四') -- 由于主键自增我们可以省略(如果不写表的字段,他会一一匹配) INSERT INTO `grade` VALUES('大三') -- 一般插入语句,我们一定要数据和字段一一对应 -- 插入多个字段 INSERT INTO `grade` (`gradename`) VALUES('大二'),('大一')
4. 修改
update 修改谁 (条件) set 原来的值 = 新值
-- 修改学员名字,带了条件 UPDATE `student` SET `name`='狂神' WHERE id = 0; -- 不指定改动条件下,会改动所有的表。 UPDATE `student` SET `name` = '张三' -- 修改多个属性,用逗号隔开 UPDATE `student` SET `name` = '李四',`sex` = '女' WHERE id = 0; -- 语法 -- UPDATE 表名 set conlnum_name = value where 条件
条件:where子句 运算符 id等于某个值,大于某个值,在某个区间修改
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | ||
<> != | 不等于 | ||
< | 小于 | ||
> | 大于 | ||
<= | |||
>= | |||
BETWEEN...and | |||
AND | && | ||
OR | || |
(1、1.4 )
5. 删除
语法 :delete from 表名 [where 条件]
-- 删除数据 DELETE FROM `student` WHERE id = 1;
TEUNCATE 清除数据库
作用 :完全清空一个数据库表,表的结构和索引不会变。
(1、1.5 )
1.4 DQL查询语言
(1、1.6 )
1. 指定查询字段
-- 查询全部学生 select 字段 from 表 SELECT * FROM `student` -- 查询指定字段 SELECT `SubjectNo`,`SubjectName` FROM `subject` -- 别名 给结果起一个名字 AS SELECT `SubjectNo` AS 学号,`SubjectName` AS 学科名 FROM `subject` -- 函数 concat(a,b) SELECT CONCAT('姓名:',`SubjectName`) AS 新名字 FROM `subject`
2. 去重
去重 distinct
-- 查询一下有哪些同学参加了考试,成绩 SELECT * FROM `result` -- 去重 SELECT DISTINCT `StudentNo` FROM `result`
数据库的列(表达式)
-- 查询系统版本 (函数) SELECT VERSION() -- 用来计算 (表达式) SELECT 200*3-1 计算结果 -- 查询自增长 (变量) SELECT @@auto_increment_increment -- 给所有学生成绩加一分 SELECT `StudentNo`,`StudentResult`+1 AS '提分后' FROM result
3. where 子句之逻辑运算符
作用 :检查数据中符合条件的值
搜索的条件有一个或者多个表达式组成,结果为布尔值。
运算符 | 语法 | 描述 |
---|---|---|
and && | A and B A && B | 与 |
or || | A or B A || B | 或 |
not ! | not A ! A | 非 |
4. 模糊查询
模糊查询 :比较运算符
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | A IS NULL | 如果操作符为Null,结果为真 |
NOT IS NULL | A NOT IS NULL | 如果结果为Not Null,结果为真 |
BETWEEN AND | A BETWEEN B AND C | A在B和C中间 |
LIKE | A LIKE B | SQL匹配,如果A匹配B,则结果为真 |
IN | A IN (A1,A2,A3) | 假设A在A1或者A2.A3其中某一个 |
like(可以存在表信息的部分)
-- 查询姓刘的同学,like结合 %(代表0到任意个字符) _(代表一个字符) SELECT `StudentNo`,`StudentName` FROM `student` WHERE `StudentName` LIKE '刘%' -- 查询姓刘同学后面就带一个字的。 SELECT `StudentNo`,`StudentName` FROM `student` WHERE `StudentName` LIKE '刘_' -- 查询姓刘同学后面就带两个字的。 SELECT `StudentNo`,`StudentName` FROM `student` WHERE `StudentName` LIKE '刘__' -- 查询中间带有嘉字的 SELECT `StudentNo`,`StudentName` FROM `student` WHERE `StudentName` LIKE '%嘉%'
in(要完全与表信息一致)
- 查询1001,1002,1003学员信息 SELECT `StudentNo`,`StudentName` FROM `student` WHERE `StudentNo` IN (1001,1002,1003) -- 查询学生,地址要与表一致 SELECT `StudentNo`,`StudentName` FROM `student` WHERE `Address` IN ('中文');
5. 联表查询
JOIN 对比
inner join
right join
left join
(1、1.7 )
升序 :ASC 降序 :DESC
6. 常用函数
(1、1.8 )
7. 聚合函数
函数名称 | 描述 |
---|---|
COUNT() | 计数 |
SUM() | 求和 |
AVG() | 平均值 |
MAX() | 最大值 |
MIN() | 最小值 |
SELECT COUNT(`StudentName`) FROM `student` -- 会忽略所有的null值 SELECT COUNT(*) FROM Student -- 不会忽略null值 SELECT COUNT(1) FROM student -- 不会忽略null值
8. 总结
(1、1.9 )
1.5 事务
事务原则 :ACID 原则 —— 原子性,一致性,隔离性,持续性。
原子性 ( Atomiciry ) :要么都成功,要么都失败
一致性 ( Consistency ) : 事务前后的数据要保持一致
隔离性 ( Isolation ):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务操作的数据所干扰,事务之间要相互隔离
持久性 (Durability ) : 事务一旦提交则不可逆,被持久化到数据库中。
隔离所导致的事务
脏读 :一个事务读取了另一个事务未提交的数据
不可重复读 :在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)
虚读(幻读) :一个事务内读取到别的事务插入的数据,导致前后读取不一致。
1. 测试事务实施转账
MySQL是实施开启事物的自动提交的 下面是事务的开启与关闭
SET autocommit = 0 —— 关闭
SET autocommit = 1 —— 开启
-- 手动处理事务 -- 事务开启 START TRANSACTION -- 标记一个事务的开始,从这个之后的sql都在同一个事务内 INSERT XXX INSERT XXX -- 提交 :持久化 COMMIT -- 回滚 :回到原来的样子 ROLLBACK -- 事务结束 SET autocommit = 1 -- 开启自动提交 SAVEPOINT -- 保存点名 设置一个新事务保存点 ROLLBACK TO SAVEPOINT -- 保存点名 回滚到保存点 RELEASE SAVEPOINT -- 保存点名 撤销保存点
1.6 索引
索引是帮助MySQL高效获取数据的数据结构,提取句子主干,就可以得到索引的本质,索引是数据结构的。
1. 索引分类
1、主键索引 PRIMAY KEY : 唯一的标识,主键不可重复,只能有一个作为主键
2、唯一索引 UNIQEN KEY :避免重复的列出现,唯一索引可以重复,多个列都可以标识为唯一索引
3、常规索引 KEY :默认的,index ,key关键字来设置
4、全文索引 FULLTEXT :在特定的数据库下才有,以前在MYISAM才有,作用是快速定位数据
索引的使用
在创建表的时候给字段增加索引
创建完毕后,增加索引
显示所有的索引信息 :SHOW INDEX FROM STUDENT
2. 索引原则
1、索引不是越多越好
2、不要对进程变动的数据加索引
3、小数据不要加索引
索引的数据结构
Hash类型的索引
BTree : InnoDB的默认数据结构
3. 权限管理
用户管理
SQL yog : 可视化管理
用户表 :mysql.user
本质:对这张表进行增删改查
4. 数据库备份
备份目的 :
-
保证重要数据不会丢失
-
数据转移
MYSQL备份 :
-
在物理层面备份,直接去拷贝data文件进行备份。
-
在SQL yog 可视化工具中手动导出
-
使用命令导出 mysqldump 在命令行使用
语法公式 :mysqldump -h + 主机 -u + 用户名 -p + 密码 数据库 表名 >导出位置+文件名 mysqldump -hlocalhost -uroot -p123456 school student >d:/1.sql 导入备份文件 先登录MYSQL source 备份文件 source d:/a.sql
5. 三大范式
为什么要数据规范化
1、信息会重复
2、更新会导致异常
3、插入异常 :无法正常显示信息
4、删除异常 :丢失有效的信息
三大范式
第一范式( 1NF )
原子性 :保证每一列都不可再分
第二范式 ( 2NF )
前提 :满足第一范式 每张表只描述一件事
第三范式 ( 3NF )
前提 :满足第一范式和第二范式 确保数据中每一列的数据都与主键直接相关,而不能间接相关
(1、1.10 )
1.7 JDBC
1. 数据库驱动
应用程序通过驱动连接数据库
2. JDBC程序
package com.kuang.lesson01; import java.sql.*; public class jdbc { public static void main(String[] args) throws ClassNotFoundException, SQLException { //1.加载驱动 Class.forName("com.mysql.jdbc.Driver"); //2.用户信息和url //使用安全连接useSSL=true //支持中文编码useUnicode=true //设置中文utf8 characterEncoding=utf8 //语法 :jdbc:mysql://主机号:端口号/数据库名?参数1&参数2&参数3 String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=false"; String username = "root"; String password = "123456"; //3.连接成功,数据库对象 Connection connection = DriverManager.getConnection(url, username, password); //4.执行SQL对象 执行SQL对象 Statement statement = connection.createStatement(); //5.执行SQL,去执行SQL,可能存在结果,查看返回结果 String sql = "SELECT * FROM result"; ResultSet resultSet = statement.executeQuery(sql);//返回的结果集 while (resultSet.next()){ System.out.println("id"+resultSet.getObject("StudentNo")); System.out.println("name"+resultSet.getObject("SubjectNo")); System.out.println("date"+resultSet.getObject("ExamDate")); System.out.println("subject"+resultSet.getObject("StudentResult")); } //6.释放连接 resultSet.close(); statement.close(); connection.close(); } }
总结 :
1、导入JAR包的时候要先把库添加,添加完成后才能正常加载驱动。
2、加载驱动格式都一样
3、用户信息的要准确 语法 :jdbc:mysql://主机号:端口号/数据库名?参数1&参数2&参数3
4、连接成功的格式也一样
5、执行SQL结果要和数据库对应一样
6、最后释放连接,关闭
端口号 :mySQL —— 3306 Oralce —— 1521
3. Statement对象详解
jdbc中的statement对象用于向数据库发送SQL语句,想要完成对数据库增删改查,只需要通过这个对象向数据库发送增删改查即可。
statement.executeQuery 用于向数据库发送查询语句
statement.executeUpdate 用于数据库增删改查
提取工具类
package com.kuang.lesson02.utils; import java.io.InputStream; import java.sql.*; import java.util.Properties; public class jdbcUtils { private static String driver = null; private static String url = null; private static String username = null; private static String password = null; static{ try { InputStream in = jdbcUtils.class.getClassLoader().getResourceAsStream("dp.properties"); Properties properties = new Properties(); properties.load(in); driver = properties.getProperty("driver"); username = properties.getProperty("username"); url = properties.getProperty("url"); password = properties.getProperty("password"); //1.加载驱动只用加载一次 Class.forName(driver); } catch (Exception e) { e.printStackTrace(); } } //获取连接 public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, username, password); } //释放连接资源 public static void release(Connection coon, Statement sta, ResultSet res){ if (res!=null){ try { res.close(); } catch (SQLException e) { e.printStackTrace(); } } if (sta!=null){ try { sta.close(); } catch (SQLException e) { e.printStackTrace(); } } if (coon!=null){ try { coon.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
编写增删改的方法
package com.kuang.lesson02.utils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class testInsert { public static void main(String[] args) { Connection conn = null; Statement sta = null; ResultSet res = null; try { conn = jdbcUtils.getConnection();//获取数据库连接 sta = conn.createStatement();//获得SQL的执行对象 String sql = "INSERT INTO result(`StudentNo`,`SubjectNo`,`ExamDate`,`StudentResult`)" + "VALUES(1,1,'2013-11-11 16:00:00',1)"; int i = sta.executeUpdate(sql); if (i>0){ System.out.println("插入成功"); } } catch (SQLException e) { e.printStackTrace(); } finally{ jdbcUtils.release(conn,sta,res); } } }
总结 :需要改变的语句就是编写增删改语句中sql语句中的语法,而sql语句中的语句中的改变就是SQL语法一样。
4. PreparedStatement 对象
可以防止SQL注入,并且效率更高
5. 数据库连接池
数据库连接--------执行---------释放
连接到释放是十分浪费资源的,系统资源
池化技术 :准备一些预先的资源,过来就连接预先准备好的。
编写连接池,实现一个接口,DataSource
开源数据库实现
DBCP
C3P0
Druid : 阿里巴巴