免费网站的软件网站开发任务需求书
免费网站的软件,网站开发任务需求书,大型网站开发用什么语言,网站图片引导页怎么做Mysql
数据库是所有软件体系中最核心的存在 DBA
1.1什么是数据库
数据库#xff08;DB#xff0c;DataBase#xff09;
概念#xff1a;数据仓库#xff0c;软件#xff0c;安装在操作系统上#xff08;window#xff0c;linux...#xff09;
作用#xff1a;存…Mysql
数据库是所有软件体系中最核心的存在 DBA
1.1什么是数据库
数据库DBDataBase
概念数据仓库软件安装在操作系统上windowlinux...
作用存储数据
1.2DBMS数据库管理系统
数据库分类
关系型数据库
1.Mysql ,Oracel,SqlServer,DB2,SQLlite
2.通过表和表之间行和列之间的关系进行数据的存储 非关系型数据库(NoSQL)
1.Redis MongDB
2.非关系型数据库对象存储通过对象的自身属性来决定
DBMS
数据库的管理软件维护和获取数据
1.3MySQL(开源的数据库软件)
MySQL 是最流行的关系型数据库管理系统在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System关系数据库管理系统)应用软件之一。
sc delete mysql,清空mysql然后重新安装
C:\Windows\System32mysql -u root -p123456 --在命令提示符里连接数据库
--所有的语句都用分号结尾
show databases;--查看所有的数据库
use school--切换数据库使用use命令
Database changed
show tables--查看数据库中所有的表
describe student;--显示数据库中所有表的信息
create databbase westos;--创建一个数据库
exit--退出连接
-- 单行注释
/* */ 多行注释
数据库xxx语言
DDL 定义
DML 操作
DQL 查询
DCL 控制
2.操作数据库
操作数据库操作数据库中的表操作数据库中表的数据
2.1操作数据库(了解)
mysql关键字不区分大小写 1.创建数据库
CREATE DATABASE [IF NOT EXISTS] westos
-- []代表可选 2.删除数据库
DROP DATABASE [IF EXISTS] westos 3.使用数据库
USE school
-- tab上面的键 如果你的表明或者字段名是一个特殊字符就需要带 飘
4.查看数据库
SHOW DATABASES
2.2数据库列的数据类型
1.数值 tinyint 十分小的数据 1个字节 smallint 较小的数据 2个字节 mediumint 中等大小的数据 3个字节 int 标准的整数 4个字节 bigint 较大的数据 8个字节 float 浮点数 4个字节 double 浮点数 8个字节(精度问题) decimal 字符串形式的浮点数 (金融) char 字符串固定大小的 0-255 varchar 可变字符串 0-65535 常用的变量 String tinytext 微型文本 2^8-1 text 文本串 2^16-1 保存大文本 3.时间日期 date YYYY-MM-DD,日期格式 time HHmmss时间格式 datetime YYYY-MM-DD HH:mm:ss 最常用的时间格式 timestamp 时间戳1970.1.1到现在的毫秒数 较为常用 4.null
不要用null进行结算结果为null
2.3数据库的字段属性
1.Unsigned:
无符号的整数
声明了该列不能声明为负数
2.zerofill:
0填充的
不足的位数使用0来填充 int(3) 5 005
3.自增
通常理解为自增自动在上一条记录的基础上1(默认)
通常用来设计唯一的主键必须是整数类型
可以自定义设计主键自增的起始值和步长
4.非空
如果选上非空 如果不给她赋值就会报错
null如果不填写值默认就是null
5.默认
默认的值
6.拓展
每个表都必须存在的5个字段
/*
id 主键
version 乐观锁
is_delete 伪删除
gmt_create 创建时间
gmt_update 修改时间
*/
2.4创建数据库表
-- 表的名称和字段尽量使用括起来
-- AUTO_INCREMENT自增
-- 字符串使用单引号括起来
-- 所有的语句后面加,最后一句不加
--PRIMARY KEY 一般一个表只有一个唯一的主键 CREATE TABLE IF NOT EXISTS student(
id INT(4) NOT NULL AUTO_INCREMENT COMMENT 学号 ,
name VARCHAR(30) NOT NULL DEFAULT 匿名 COMMENT 姓名,
sex VARCHAR (20) NOT NULL DEFAULT 女 COMMENT 性别,
birthday DATETIME DEFAULT NULL COMMENT出生日期,
address VARCHAR(100) DEFAULT NULL COMMENT地址,
email VARCHAR (50) DEFAULT NULL COMMENT 邮件,PRIMARY KEY(id)
)ENGINEINNODB DEFAULT CHARSET utf8
格式create table [if not exists] 表名(字段名 列类型[属性][索引][注释],字段名 列类型[属性][索引][注释],字段名 列类型[属性][索引][注释],......字段名 列类型[属性][索引][注释]
)[表类型][字符集设置][注释]
2.4.1常用命令
SHOW CREATE DATABASE school -- 查看创建数据库的语句
CREATE DATABASE school /*!40100 DEFAULT CHARACTER SET utf8 */
SHOW CREATE TABLE student -- 查看数据表student的定义语句
CREATE TABLE student (id INT(4) NOT NULL AUTO_INCREMENT COMMENT 学号 ,name VARCHAR(30) NOT NULL DEFAULT 匿名 COMMENT 姓名,sex VARCHAR(20) NOT NULL DEFAULT 女 COMMENT 性别,birthday DATETIME DEFAULT NULL COMMENT 出生日期,address VARCHAR(100) DEFAULT NULL COMMENT 地址,email VARCHAR(50) DEFAULT NULL COMMENT 邮件,PRIMARY KEY (id)
) ENGINEINNODB DEFAULT CHARSETutf8
DESC student -- 显示表的结构 2.5数据表的类型 /* 关于数据库引擎INNOB 默认使用~ 安全性高事务的处理多表多用户操作MYISAM 早些年使用的 节约空间速度较快*/
MYISAMINNODB事务支持不支持支持数据行锁定不支持支持外键约束不支持支持全文索引支持不支持表空间的大小较小较大约为2倍
所有的数据库文件都存在data目录下一个文件夹就对应一个数据库
本质还是文件的存储
MySQL引擎在物理文件上的区别
INNODB在数据库表中只有一个.frm文件以及data目录下的ibdata1文件
MYISAM对应文件
.frm 表结构的定义文件
.MYD 数据文件(data)
.MYI 索引文件(index)
2.5.1设置数据库表的字符集编码
CHARSET utf8
也可以在my.ini中配置默认的编码
character -set-server utf8 2.6修改数据表
-- 修改表名 ALTER TABLE 旧表名 RENAME AS 新表名
ALTER TABLE teacher RENAME AS teacher1
-- 增加表的字段 ALTER TABLE 表名 ADD 字段名 列属性
ALTER TABLE teacher1 ADD age INT(11)
-- 修改表的字段(重命名修改约束)
ALTER TABLE teacher1 MODIFY age VARCHAR(11) -- modify 只能修改字段的数据类型
ALTER TABLE teacher1 CHANGE age age1 INT(2) -- change既能重命名也可以改约束
-- 删除表的字段
ALTER TABLE teacher1 DROP age1
-- 删除表
DROP TABLE IF EXISTS teacher1
3.MySQL数据管理
3.1外键 CREATE TABLE grade (gradeid INT(10) NOT NULL AUTO_INCREMENT COMMENT 年纪id,gradename VARCHAR(50) NOT NULL COMMENT 年纪名称,PRIMARY KEY (gradeid)
) ENGINEINNODB DEFAULT CHARSETutf8
-----------------------------------------------------
定义外键key
CREATE TABLE student (id INT(4) NOT NULL AUTO_INCREMENT COMMENT 学号 ,name VARCHAR(30) NOT NULL DEFAULT 匿名 COMMENT 姓名,sex VARCHAR(20) NOT NULL DEFAULT 女 COMMENT 性别,birthday DATETIME DEFAULT NULL COMMENT 出生日期,gradeid INT(10) NOT NULL COMMENT 学生年纪,address VARCHAR(100) DEFAULT NULL COMMENT 地址,email VARCHAR(50) DEFAULT NULL COMMENT 邮件,PRIMARY KEY (id),KEY FK_gradeid(gradeid),CONSTRAINT FK_gradeid FOREIGN KEY (gradeid) REFERENCES grade(gradeid)
) ENGINEINNODB DEFAULT CHARSETutf8
-----------------------------------------------------
在表外面创建外键
alter table student
add CONSTRAINT FK_gradeid FOREIGN KEY (gradeid) REFERENCES grade(gradeid);
alter table 表名 add CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES (引用哪一个表)(哪一个字段) 3.2DML语言全部记住
数据库意义 数据存储数据管理
DML语言数据操作语言
3.2.1添加(insert)
INSERT INTO student1 (email) VALUES (119)-- INSERT INTO 表名 ( 字段) values (数据)
INSERT INTO student1 (email) VALUES(222),(666) -- 一个字段插入多个数据
INSERT INTO student1 (sex ,email,address) VALUES (女,9999,**)-- 多个字段插入多个数据
--字段可以省略但是后面的数据要一一对应
3.2.2修改update
UPDATE student1 SET name长江一号 -- 不指定会改变所有
UPDATE student1 SET name长江二号 WHERE id1 -- where 指定改哪里
UPDATE student1 SET name长江二号 ,sex 男 WHERE id1 -- 修改多个属性用逗号隔开
update 表名 set 字段 值或变量 where
UPDATE student1 SET name长江5号 ,sex 男 WHERE id3 AND name长江一号
逻辑运算符含义范围结果等于56false或!不等于56trueBETWEEN....and...在某个范围内闭区间[2,5]AND 与我和你OR 或||not ! 非not a ! a
操作符会返回布尔值 3.2.3删除(delete)
DELETE FROM student1 WHERE id1 -- 删除指定数据
truncate 作用
完全清空一个数据库表 表的结构和索引约束不会变
TRUNCATE student1 -- 清空表
相同点都能删除不会删除表结构
不同 truncate 重新设置自增列计数器会归零
delete自增不会归零
CREATE TABLE test(
id INT(4) NOT NULL AUTO_INCREMENT,
coll VARCHAR(20) NOT NULL,PRIMARY KEY (id)
)ENGINEINNODB DEFAULT CHARSETutf8
INSERT INTO test (coll) VALUES (1),(2)
TRUNCATE TABLE test-- 自增归零
了解
delete删除以后重启数据库
引擎是innodb自增会从1开始存在内存当中的断电即失
是myisam 继续从上一个自增量开始(存在文件中的不会丢失)
4.DQL查询数据最重点
4.1DQL
(Data Query LANGUAGE数据查询语言)
1.所有的查询操作都用它 Select
2.简单的查询 复杂的查询都能做
3.数据库中最核心的语言最重要的语句
4.使用频率最高的语句
4.2查询 -- select 字段,... from 表名SELECT *FROM student -- 查询全部的学生SELECT studentno ,studentname FROM student -- 查询指定的字段
SELECT studentno AS 学号,studentname AS 学生姓名 FROM student AS s-- 别名给结果起一个名字 as 字段表名都可以SELECT CONCAT ( 姓名 ,studentname) AS 新名字 FROM student -- 函数 concatab
去重 distinct SELECT *FROM resultSELECT studentno FROM resultSELECT DISTINCT studentno FROM result -- 发现重复数据 去重 SELECT VERSION() -- 查询系统版本 函数
SELECT 100*2-1 AS 计算结果 -- 用来计算 表达式
SELECT auto_increment_increment -- 查询自增的步长变量
4.3where条件返回布尔值
作用 检索数据中符合条件的值
见3.2.2 逻辑与算符 模糊查询比较运算符
运算符语法描述is nulla is null如果操作符为null结果为真is not nulla is not null如果操作符不为null结果为真betweena between b and c若a在b和c之间结果为真likea like b 小红lile小红1真sql匹配如果a能匹配到b结果为真ina in a1a2a3...如果a在a1或者a2其中的某一个值结果为真
-- 查询姓刘的同学 -- like结合 %(代表0到任意一个字符) _一个字符 SELECTstudentno,studentnameFROM student WHERE studentname LIKE 刘%-- 查询姓刘的同学 名字后面只有一个字 SELECTstudentno,studentnameFROM student WHERE studentname LIKE 刘_-- 查询姓刘的同学 名字后面只有2个字 SELECTstudentno,studentnameFROM student WHERE studentname LIKE 刘__ -- 查询名字中有楠的SELECTstudentno,studentnameFROM student WHERE studentname LIKE %楠% -------------------------------------------------------------------------------------- in (具体的精确的一个或者多个值)---- 查询 100110021003学员 SELECT studentnostudentname FROM student WHERE IN (1001,1002,1003) -- null not null -- -- 查询地址为空的学生 SELECT studentnostudentname FROM student WHERE address OR address IS NULL -- 查询有出生日期的同学 SELECT studentnostudentname FROM student WHERE borndate IS NOT NULL 4.4联表查询
join on 连接查询 语法
where 等值查询 JOIN
操作描述Inner join交集left join会返回左表中所有的值即使右表中是空值right join返回右表中所有的值即使左表是空值 SELECT s.studentno,studentname, subjectno,studentresult
FROM student AS s INNER JOIN result AS r
WHERE s.studentno r.studentno -- 两个表的交集
SELECT s.studentno,studentname, subjectno,studentresult
FROM student AS s RIGHT JOIN result AS r
ON s.studentno r.studentno
SELECT s.studentno,studentname, subjectno,studentresult
FROM student AS s LEFT JOIN result AS r
ON s.studentno r.studentno
SELECT s.studentno,studentname, subjectname,studentresult
FROM student AS s RIGHT JOIN result AS r
ON s.studentno r.studentno
INNER JOIN subject AS sub
ON r.subjectno sub.subjectno
-- 要查 学号 学生姓名 科目名 分数
/*
从三张表查 student result subject
SELECT s.studentno,studentname, subjectname,studentresult
FROM student AS s RIGHT JOIN result AS r
ON s.studentno r.studentno 这里查询到 student和result中学号姓名 分数
内联一个 从subject表中找到和result表中学科名一样的 就找到了
*/
from表 xxx join 连接的表 on 交叉条件
/*
思路
分析查询的字段来自那几张表
确定使用哪种连接查询 7种
确定交叉点 (这两个表中那个数据是相同的)
判断条件s.studentno r.studentno
*/
4.5自连接
自己的表和自己的表连接核心一张表实际上是两张表组成的
SELECT a.categoryName AS 父栏目 ,b.categoryName AS 子栏目
FROM category AS a ,category AS b
WHERE a.categoryidb.pid
4.6分页和查询
-- 排序 升序asc 降序desc
SELECT s.studentno,studentname, subjectname,studentresult
FROM student AS s RIGHT JOIN result AS r
ON s.studentno r.studentno
INNER JOIN subject AS sub
ON r.subjectno sub.subjectno
WHERE subjectname 数据库结构
ORDER BY studentresult ASC
-- 排序 升序asc 降序desc
-- limit 分页 (起始值页面的大小)
-- limit 05 表示1-5的数据 页面大小都是5
-- limit 15 表示2-6的数据 页面大小都是5
-- limit 65
SELECT s.studentno,studentname, subjectname,studentresult
FROM student AS s RIGHT JOIN result AS r
ON s.studentno r.studentno
INNER JOIN subject AS sub
ON r.subjectno sub.subjectno
WHERE subjectname 数据库结构
ORDER BY studentresult ASC
LIMIT 0,5
-- pagesize 页面大小 n当前页
-- 第n页 (n-1)*5,5 (当前页-1)*页面大小页面大小
-- 数据总数/页面大小总页数 有余数1
4.7子查询
本质在where语句中嵌套一个子查询语句
where( select *from)
-- 查询 学号 学科号 学生成绩并且科目为数据库结构的学生成绩降序排序
-- 联表查询
SELECT studentno,r.subjectno,studentresult
FROM result r
INNER JOIN subject sub
ON r.subjectno sub.subjectno
WHERE subjectname数据库结构
ORDER BY studentresult DESC
-- 子查询 (由里及外)
SELECT studentno,r.subjectno,studentresult
FROM result r
WHERE (SELECT subjectnameFROM subjectWHERE subjectname z数据库结构)
ORDER BY studentresult DESC 4.8 分组和过滤 ----------------查询不同课程的平均分最高分最低分平均分80 核心;(根据不同的课程进行分组)-------SELECT subjectname,AVG(studentresult) AS 平均分,MAX(studentresult),MIN(studentresult)FROM result r INNER JOIN subject sub ON r.subjectno sub.subjectnoGROUP BY r.subjectno -- 通过什么字段来分组HAVING 平均分80 5.MySQL函数
5.1常用函数
-- 数学运算
SELECT ABS(-8) -- 绝对值
SELECT CEILING(9.4) -- 向上取整
SELECT FLOOR(9.4) -- 向下取整
SELECT RAND() -- 返回一个0-1之间的随机数
SELECT SIGN(5) --返回参数的符号 0是0 负数是-1 正数是1
-- 字符串函数
SELECT CHAR_LENGTH (我爱你) -- 字符串长度 3
SELECT CONCAT (老鼠,爱,大米) -- 拼接字符串
SELECT INSERT(我非常热爱编程,2,4,特别特别) -- 结果是 我特别特别编程 从某个位置开始替换某个长度
SELECT LOWER (qiannan) -- 转为小写
SELECT UPPER(qiannan) -- 转为大写
SELECT INSTR (qiannan,n) -- 返回第一次出现的字串的索引
SELECT REPLACE (我说坚持就能成功,坚持,努力)-- 替换出现的指定字符串
SELECT SUBSTR (狂神说坚持就能成功,4,6) -- 返回指定的字符串46 起始位置截取长度SELECT REVERSE (狂神说坚持就能成功) -- 反转------------------------ 时间和日期函数 ----------SELECT CURRENT_DATE() -- 获取当前日期SELECT NOW() -- 获取当前的时间SELECT LOCALTIME () -- 本地时间SELECT SYSDATE() -- 系统十几件SELECT YEAR (NOW())SELECT MONTH (NOW())SELECT DAY (NOW())SELECT HOUR (NOW())SELECT MINUTE (NOW())SELECT SECOND (NOW())--------- 系统 --------SELECT USER()
5.2聚合函数常用
函数名称描述count()计数sum()求和avg()平均值max()最大值min()最小值 -------------------------- 计数 ----------------SELECT COUNT(borndate) FROM student -- count(字段)会忽略所有的null值SELECT COUNT(*) FROM student -- count(*) 不会忽略null值本质 计算行数SELECT COUNT(1) FROM student -- count(1) 不会忽略null值本质 计算行数SELECT SUM(studentresult) AS 总和 FROM result -- 总分SELECT AVG(studentresult) AS 总和 FROM result -- 平均分SELECT MAX(studentresult) AS 总和 FROM result -- 最高分SELECT MIN(studentresult) AS 总和 FROM result -- 最低分 数据库级别的MD5数据加密
不可逆
CREATE TABLE testmd5(
id INT(4) NOT NULL,name VARCHAR(20) NOT NULL,pwd VARCHAR(50) NOT NULL,PRIMARY KEY (id)
)ENGINEINNODB DEFAULT CHARSETutf8
INSERT INTO testmd5 VALUES(1,zhangsan,123456),(2,lisi,123456),(3,wangwu,123456)-- 加密全部的密码-- UPDATE testmd5 SET pwdMD5(pwd) -- 插入的时候加密 -- INSERT INTO testmd5 VALUES(4,zhangsan,MD5(123456)) 6.事务 要么都成功要么都失败
事务原则 ACID原则 原子性 一致性最终一致性 隔离性 持久性 (脏读幻读..
原子性要么都成功要么都失败
一致性事务前后的数据完整性要保证一致
持久性 事务提交 事务一旦提交则不可逆被持久化到数据库中
隔离性事务的隔离性是多个用户并发访问数据库时数据库为每一个用户开启的事务不能被其他事务的操作数据所干扰多个并发事务之间要相互隔离。
脏读指一个事务读取了另外一个事务未提交的数据
不可重复读在一个事务内读取表中的某一行数据多次读取结果不同。这个不一定是错误只是某些场合不对
虚读(幻读)是指在一个事务内读取到了别的事务插入的数据导致前后读取数量总量不一致。多了一行
-- 模拟转账 事务SET autocommit 0; -- 关闭自动提交
START TRANSACTION -- 开启一个事务
UPDATE ACCOUNT SET moneymoney-50 WHERE name A -- A-500
UPDATE ACCOUNT SET moneymoney50 WHERE name B -- A500
COMMIT -- 提交事务 就被持久化ROLLBACK -- 回滚 SET autocommit 1 -- 恢复默认值
7.索引
索引是帮助MySQL高效获取数据的数据结构
索引的分类:
1.主键索引(primary key)
唯一的标识主键不可重复只能有一个列作为主键 非空且唯一
2.唯一索引 (unique key)
避免重复的列出现唯一索引可以重复多个列都可以标识为唯一索引 索引列的值必须唯一可以出现空值
3.常规索引 (key/index)
默认的indexkey关键字来设置
4.全文索引 (fulltext)
在特定的数据库引擎下才有 myism
快速定位数据 -- 显示所有的索引信息 SHOW INDEX FROM student -- 增加一个全文索引 (索引名) 列名 ALTER TABLE school.student ADD FULLTEXT INDEX studentname(studentname) -- explain 分析sql执行情况 EXPLAIN SELECT * FROM student -- 非全文索引 EXPLAIN SELECT * FROM student WHERE MATCH(studentname)AGAINST(刘) -- 非全文索引
-- id_表名_字段名
-- create index 索引名 on 表名 (字段)
-- 创建完索引以后在查找 速度就很快 因为给每一条数据都创建了一个btreeCREATE INDEX id_appuser_name ON appuser(name)
SELECT *FROM appuser WHERE name 用户9999
EXPLAIN SELECT *FROM appuser WHERE name 用户9999
索引原则
1.索引不是越多越好
2.不要对进程变动数据加索引
3.小数据量的表不需要加索引
4.索引一般加在常用来调查的字段上
索引的数据结构
Hash类型的索引
Btree InnoDB的默认数据结构
8.权限管理和备份
8.1用户管理
SQLyog可视化管理
SQL命令操作
用户表 mysql.user
-- 创建用户 CREATE USER 用户名 IDENTIFIED BY 密码
CREATE USER kuangshen IDENTIFIED BY 123456
-- 修改密码 修改当前用户密码
SET PASSWORD PASSWORD(123456)
-- 修改密码 修改指定用户密码
SET PASSWORD FOR kuangshen PASSWORD(111111)
-- 重命名 RENAME USER 原名字 TO 新名字
RENAME USER kuangshen TO kuangshen2
-- 用户授权 ALL PRIVILEGES 全部的权限 库.表
-- ALL PRIVILEGES 除了给别人授权其他都能干GRANT ALL PRIVILEGES ON *.* TO kuangshen2-- 查询权限SHOW GRANTS FOR kuangshen2 -- 查看指定用户的权限-- GRANT ALL PRIVILEGES ON *.* TO kuangshen2%SHOW GRANTS FOR rootlocalhost-- root用户权限 GRANT ALL PRIVILEGES ON *.* TO rootlocalhost WITH GRANT OPTION-- 撤销权限 revoke哪些权限 在哪个库撤销给谁撤销REVOKE ALL PRIVILEGES ON *.*FROM kuangshen2-- 删除用户DROP USER kuangshen2
8.2数据库备份
为什么要备份
1.保证重要的数据不丢失
2.数据转移
MySQL数据库备份的方式
1.直接拷贝物理文件
2.在sqlyog这种可视化工具中手动导出
3.使用管理员身份命令行导出 mysqldump 命令行使用
mysqldump -hlocalhost -uroot -p123456 school student D:/a.sql
mysqldump -h主机 -u 用户名 -p密码 数据库 表1 表2 磁盘位置/文件名
导入
登录的情况下切换到指定的数据库
source D/a.sql
mysql -u用户名 -p密码 库名备份文件
9.规范数据库设计
软件开发之中关于数据库的设计
1.分析需求分析业务和需要处理的数据库的需求
2.概要设计设计关系图E-R图
9.1三大范式
为什么需要数据规范化 信息重复 更新异常 插入异常 无法正常显示信息 删除异常 丢失有效的信息
三大范式 第一范式(1NF) 原子性保证每一列不可再分 第二范式(2NF) 满足原子性 每张表只描述一件事情 第三范式(3NF) 满足第一范式和第二范式 确保每一列数据和主键直接相关不能间接相关
规范性和性能问题
关联查询的表不得超过3张表
1.考虑商业化的需求和目标成本用户体验数据库的性能更加重要
2.在规范性能问题的时候需要适当的考虑一下规范性
3.故意给某些表增加一些冗余的字段从多表查询变为单表查询
4.故意增加一些计算列从大数据量降低为小数据列的查询 索引
10.JDBC
数据库驱动
我们的程序会通过数据库驱动和数据库打交道 SUN公司为了简化开发人员的(对数据库的统一)操作提供了一个(java操作数据库的)规范俗称JDBC这些规范的实现由具体的厂商去做
对于开发人员来说我们只需要掌握JDBC接口的操作即可
框架没有什么是加一层解决不了的 //1.加载驱动// DriverManager.registerDriver(new com.mysql.jdbc.Driver());Class.forName(com.mysql.jdbc.Driver) ; //固定写法//2.用户信息和url//useUnicodetruecharacterEncodingutf8useSSLtrueString url jdbc:mysql://localhost:3306/jdbcstudy?useUnicodetruecharacterEncodingutf8useSSLtrue;String username root;String password 123456;
// mysql -- 3306
//协议//主机地址端口号/数据库名?参数1参数2参数3
// oralce --1521
//jdbc:oracle:thin:localhost:1521:sid//3.连接成功数据库对象 Connection代表数据库Connection connection DriverManager.getConnection(url, username, password);//connection.commit();//事务提交// connection.rollback();//事务回滚// connection.setAutoCommit();//数据库设置自动提交//4.执行sql的对象 Statement执行sql的对象Statement statement connection.createStatement();//statement.executeQuery();//查询操作返回ResultSet//statement.execute();//执行任何sql//statement.executeUpdate();//更新插入删除都是用这个返回一个受影响的行数
//5.执行sql的对象去 执行sql 可能存在结果查看返回结果String sql SELECT *FROM users ;ResultSet resultSet statement.executeQuery(sql); //返回的结果集封装了我们所有查询的结果while (resultSet.next()){System.out.println(id resultSet.getObject(id));System.out.println(name resultSet.getObject(Name));}
//6.释放连接resultSet.close();statement.close();connection.close();
10.1statement对象详解 1.编写工具类
package lesson02.util;
import java.io.IOException;
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 inputStream jdbcutils.class.getClassLoader().getResourceAsStream(db.properties);Properties properties new Properties();properties.load(inputStream);
driver properties.getProperty(driver);url properties.getProperty(url);username properties.getProperty(username);password properties.getProperty(password);//驱动只用加载一次Class.forName(driver);
} catch (IOException e) {throw new RuntimeException(e);} catch (ClassNotFoundException e) {throw new RuntimeException(e);}}//获取连接public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url, username, password);}
//释放连接public static void release(Connection co, Statement st, ResultSet rs) throws SQLException {if(rs!null){rs.close();}if(st!null){st.close();}if(co!null){co.close();}}
} 2.代码实现 都用 executeUpdate 增删改
public class Testinsert {public static void main(String[] args) throws SQLException {Connection co null;Statement st null;ResultSet rs null;
co jdbcutils.getConnection(); //获取数据库连接st co.createStatement(); //获取执行sql的对象String sql INSERT INTO users(id,NAME,PASSWORD,email,birthday) VALUES (4,qiannan,123456,1196691345qq.com,2003-02-25);int i st.executeUpdate(sql);if(i0){System.out.println(插入成功);}jdbcutils.release(co,st,rs);
}
}
查 executeQuery
public class TestSlect {public static void main(String[] args) throws SQLException {Connection co null;Statement st null;ResultSet rs null;
co jdbcutils.getConnection();st co.createStatement();//sqlString sql select * from users where id1;rs st.executeQuery(sql);//查询完毕while(rs.next()){System.out.println(rs.getString(NAME));}jdbcutils.release(co,st,rs);
}
}
sql注入问题
sql存在漏洞会被攻击导致数据泄露 sql会被拼接or
public class TestSlect {public static void main(String[] args) {//login(kuangshen,123456)login( or11, or 11); //空或者为1}public static void login (String username,String password) throws SQLException {Connection co null;Statement st null;ResultSet rs null;
co jdbcutils.getConnection();st co.createStatement();//sqlString sql select * from users where id1;rs st.executeQuery(sql);//查询完毕while(rs.next()){System.out.println(rs.getString(NAME));}jdbcutils.release(co,st,rs);
}
}
10.2PreparedStatement对象
PreparedStatement可以防止SQL注入并且效率更高
本质是把传递进来的参数当作字符假设其中存在转义字符比如说会被直接转义
插入
public class Testinsert02 {public static void main(String[] args) throws SQLException {Connection co null;PreparedStatement st null;
co jdbcutils.getConnection();//区别//使用占位符代替参数String sql INSERT INTO users(id,NAME,PASSWORD,email,birthday)values(?,?,?,?,?);st co.prepareStatement(sql); //预编译sql 先写sql然后不执行//手动给参数赋值st.setInt(1,4);st.setString(2,qiannan);st.setString(3,123456);st.setString(4,1196691345qq.com);//注意点// sql.date 数据库 java.sql.Date时间戳// util.date java new Date().getTime() 获得时间戳st.setDate(5,new java.sql.Date(new Date().getTime()));//执行int i st.executeUpdate();if(i0){System.out.println(插入成功);}jdbcutils.release(co,st,null);}
}
删除
public class TestDelete {public static void main(String[] args) throws SQLException {Connection co null;PreparedStatement st null;
co jdbcutils.getConnection();//区别//使用占位符代替参数String sql delete from users where id?;st co.prepareStatement(sql); //预编译sql 先写sql然后不执行//手动给参数赋值st.setInt(1,4);
//注意点// sql.date 数据库 java.sql.Date时间戳// util.date java new Date().getTime() 获得时间戳st.setDate(5,new java.sql.Date(new Date().getTime()));//执行int i st.executeUpdate();if(i0){System.out.println(删除成功);}jdbcutils.release(co,st,null);}
}
改
public class Testupdate {public static void main(String[] args) throws SQLException {Connection co null;PreparedStatement st null;
co jdbcutils.getConnection();//区别//使用占位符代替参数String sql update users set name? where id?;st co.prepareStatement(sql); //预编译sql 先写sql然后不执行//手动给参数赋值
st.setString(1,qiannan);st.setInt(2,1);
//注意点// sql.date 数据库 java.sql.Date时间戳// util.date java new Date().getTime() 获得时间戳st.setDate(5,new java.sql.Date(new Date().getTime()));//执行int i st.executeUpdate();if(i0){System.out.println(更新成功);}jdbcutils.release(co,st,null);}
}
查
public class TestSelect {public static void main(String[] args) throws SQLException {Connection co null;PreparedStatement st null;ResultSet rs null;co jdbcutils.getConnection();String sql select *from users where id?; //编写sqlst co.prepareStatement(sql); //预编译st.setInt(1,1);//传递参数//执行rs st.executeQuery();//执行if(rs.next()){System.out.println(rs.getString(NAME));}jdbcutils.release(co,st,rs);//释放
}
}
10.3事务
要么都成功要么都失败
ACID原则
原子性 要么全部完成要么都不完成
一致性总数不变
隔离性多个进程互不干扰
问题
脏读 一个事务读取了另一个没有提交的事务
不可重复读在同一个事务内重复读取表的数据表数据发生了改变
虚读(幻读) 在一个事务内读取到了别人插入的数据导致前后读出来的结果不一致 持久性:一旦提交不可逆
public class TestTransaction {public static void main(String[] args) throws SQLException {Connection co null;PreparedStatement st null;ResultSet rs null;co jdbcutils.getConnection();//关闭数据库的自动提交自动会开启事务co.setAutoCommit(false);String sql1 update account set money money-100 where name A;st co.prepareStatement(sql1);st.executeUpdate();
String sql2 update account set money money100 where name B;st co.prepareStatement(sql2);st.executeUpdate();//业务完毕提交事务co.commit();System.out.println(成功);jdbcutils.release(co,st,rs);}
}
10.4数据库连接池
数据库连接 - 执行完毕-释放 连接--释放 十分浪费系统资源
池化技术准备一些预先的资源过来就连接预先准备好的
最小连接数
最大连接数
等待超时 编写连接池实现一个接口 DataSource
DBCP
C3P0
Druid 阿里巴巴
使用了这些数据库连接池后我们在项目开发中就不需要编写连接数据库的代码了
DBCP
无论使用什么数据源本质还是一样的 DataSource不会变方法也不变
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/86578.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!