Mysql数据库

数据库分类
1.关系型数据库
Mysql、Oracle、Sql Server
通过表与表之间,行与列之间的关系进行数据的存储
2.非关系型数据库
Redis、MongDB
非关系型数据库,对象存储,通过对象的自身属性来决定
创建数据库
1 操作数据库:CRUD
2 C(Create):创建
创建数据库:
Create database 数据库名称;
创建数据库,判断不存在,再创建:
Create database if not exists 数据库名称;
创建数据库,并指定字符集:
Create database 数据库名称 character set 字符集名(gbk);
3 R(Retrieve):查询
查询所有数据库的名称:show databases;
4 U(Update):修改
修改数据库的字符集:
Alter database 数据库名称character set 字符集名称;
5 D(Delete):删除
删除数据库:
Drop database 数据库名称;
6 使用数据库
查询当前正在使用的数据库名称:
Select database();
使用数据库:
Use 数据库名称;
数据库的列类型
数值:
tinyint 十分小的数据 1个字节
smallint 较小的数据 2个字节
mediumint 中等大小数据 3个字节
int 标准的整数 4个字节 常用的int
bigint 较大的数据 8个字节
float 浮点数 4个字节
double 浮点数 8个字节(精度问题)
decimal 字符串形式的浮点数 金融计算的时候一般用

字符串:
char 字符串固定大小的 0~255
varchar 可变字符串 0~65535 常用的 String
tinytext 微型文本 2^8-1
text 文本串 2^16-1 保存大文本

时间日期:
date YYYY-MM-DD 日期格式
time HH: mm: ss 时间格式
datetime YYYY-MM-DD HH: mm: ss 最常用的时间格式
timestamp 时间戳, 1970.1.1到现在的毫秒数! 较常用
year 年份表示

null:
没有值,未知
==注意,不要使用NULL进行运算,结果为NULL

数据库的字段属性
unsigned:
无符号整数
声明了该列不能声明为负数
zerofill:
0填充的
不足的位数,使用0来填充
自增:
通常理解为自增,自动在上一条记录的基础上加1
通常用来设计唯一的主键~ index,必须是整数类型
可以自定义设计主键自增的起始值和步长
非空NULL not null:
假设设置为not null ,如果不给它赋值,就会报错
NULL,如果不填写值,默认就是null。
默认;
设置默认值
拓展:

/* 每一个表,都必须存在以下五个字段!做项目用的,表示一个记录存在的意义!
id 主键
‘version’ 乐观锁
is_delete 伪删除
gmt_creat 创建时间
gmt_update 修改时间
*/

案例:
目标:创建一个school数据库
创建学生表(列,字段)使用SQL创建
学号int 登陆密码varchar(20) 姓名,性别varchar(2),出生日期(datatime),家庭住址,email

注意点:使用英文(),表的名称

CREATE TABLE IF NOT EXISTS 'student'(
     'id' int(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
     'name' VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名''pwd' VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
     'sex' VARCHAR(2) 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

常用命令;

SHOW CREATE DATABASE school---查看创建数据库的语句
SHOW CREATE TABLE student---查看student数据表的定义语句
DESC student---显示表的结构

数据库引擎
INNODB 默认使用
MYSIAM 早些年使用的
在这里插入图片描述
常规使用操作:
MYSIAM:节约空间,速度较快
INNODB:安全性高,事务的处理,多表多用户操作
数据库的字符集编码
CHARSET=utf8 —支持中文
修改删除表
修改表:

--修改表名: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 age VARCHAR(11)--修改约束
--ALTER TABLE 表名 CHANGE 旧名字 新名字 列属性
ALTER TABLE teacher1 CHANGE age age1 INT(1)--字段重命名

--删除表的字段
--ALTER TABLE 表名 DROP 字段名
ALTER TABLE teacher1 DROP age1

---删除表
DROP TABLE IF EXISTS teacher

注意:所有的创建和删除操作尽量加上判断,以免报错

MySQL数据管理
1.外键
方式一:创建表成功后添加外键约束(不建议使用)

--ALTER TABLE 表 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES 哪个表(哪个字段)
ALTER TABLE 'student'
ADD CONSTRAINT 'FK_gradeid' FOREIGN KEY('gradeid') REFERENCES 'grade'('gradeid');

方式二:数据库就是单纯的表,只用来存数据,只有行和列。
外键在应用层解决(推荐)
2.DML语言
数据操作语言:
insert、update、delete
3.添加

--插入语句
insert into 表名(列名1 ,列名2…,列名n) 
values(1,值2,…值n);

4.修改

UPDATE 表名 set 列名1 =1,列名2 =2 where 条件;

WHERE 条件:
除了常见的>、<、=还有:
BETWEEN… AND …在某个范围内
AND &&
OR ||
注意:
1)列名尽量带上’ ’
2)条件,筛选的条件,如果没有指定则修改所有的列
3)value,是一个具体的值,也可以是一个变量
5.删除

DELETE FROM 表名 WHERE 条件(id = 1);
--清空某一张表,两种
--DELETE FROM 表名
DELETE FROM 'student'
--TRUNCATE 表名
TRUNCATE 'student'

一般使用TRUNCATE。
相同点:都能删除数据,都不会删除表结构
不同:
TRUNCATE重新设置自增列,计数器会归零
TRUNCATE不会影响事务
DQL查询数据
SELECT 字段 FROM 表

--查询全部
SELECT * FROM 表名;
--查询指定字段
SELECT 'studentNo','studentName' FROM student
--别名,给结果起一个名字 AS,也可以给表起别名
SELECT 'studentNo' AS 学号,'studentName' AS 学生姓名 FROM student
--函数 Concat(a,b)
SELECT CONCAT('姓名:',studentName) AS 新名字 FROM student

去重

--查询一下有哪些同学参加了考试,成绩
SELECT * FROM result--查询全部的考试成绩
SELECT 'studentNo' FROM result--查询哪些同学参加了考试
SELECT DISTINCT 'studentNo' FROM result--发现重复数据,去重

数据库的列(表达式)
SELECT 表达式 FROM 表

SELECT VERSION()--查询系统版本(函数)
SELECT 100*2-1 AS 计算结果 --用来计算
--学员考试成绩+1分查看
SELECT 'studentNo','studentResult'+1 AS '提分后' FROM result

数据库中的表达式:文本值,列,NUll,函数,计算表达式,系统变量…
where条件字句
作用:检索数据中符合条件的值
搜索的条件由一个或多个表达式组成!结果为bool值
逻辑运算符:and/&&、or/||、Not/!

------where-----
SELECT studentNo,'studentResult' FROM result
--查询考试成绩在95-100分之间的,&&或AND
SELECT studentNo,'studentResult' FROM result
WHERE studentResult>=95 && studentResult<=100
--模糊查询
SELECT studentNo,'studentResult' FROM result
WHERE studentResult BETWEEN 95 AND 100
--除了1000号学生之外的同学的成绩,NOT或!
SELECT studentNo,'studentResult' FROM result
WHERE NOT studentNo=1000
//WHERE  studentNo!=1000

模糊查询:比较运算符
在这里插入图片描述

---模糊查询
-----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 '—狗—';

------IN------(具体的一个值)
--查询1001.1002,1004号学员信息
SELECT 'studentNo','studentName' FROM 'STUDENT'
WHERE studentNo IN (1001,1002,1004);
--查询在北京的学生
SELECT 'studentNo','studentName' FROM 'STUDENT'
WHERE 'Address' IN ('北京');

----NULL  |  NOT NULL---
---查询地址为空的学生null ' '
SELECT 'studentNo','studentName' FROM 'STUDENT'
WHERE 'Address' = '' OR 'ADDRESS' IS NULL;
---查询有出生日期的同学 不为空
SELECT 'studentNo','studentName' FROM 'STUDENT'
WHERE 'BornDate' IS NOT NULL;

联表查询
在这里插入图片描述

-----联表查询 join------
SELECT * FROM student
SELECT * FROM result
/*
思路:
1.分析需求,分析查询字段来自哪些表
2.确定使用哪种连接查询?7种
确定交叉点(这两张表中哪个数据式相同的)
判断的条件:学生表中的studentNo = 成绩表 studentNo
*/
---INNER JOIN---
SELECT s.studentNo, studentName,subjectNo, studentResult
FROM student AS s
INNER JOIN result AS r
WHERE s.studentNo = r.studentNo
----Right Join---
SELECT s.studentNo, studentName,subjectNo, studentResult
FROM student AS s
RIGHT JOIN result AS r
ON s.studentNo = r.studentNo
----LEFT Join---
SELECT s.studentNo, studentName,subjectNo, studentResult
FROM student AS s
LEFT JOIN result AS r
ON s.studentNo = r.studentNo

---查询缺考的同学
---JOIN ON(判断的条件)连接查询
---where 等值查询
SELECT s.studentNo, studentName,subjectNo, studentResult
FROM student AS s
LEFT JOIN result AS r
ON s.studentNo = r.studentNo
WHERE studentResult IS NULL;
------------
SELECT s.studentNo, studentName,subjectNo, studentResult
FROM student AS s
INNER JOIN result AS r
ON s.studentNo = r.studentNo
INNER JOIN subject AS sub
ON r.subjectNo = sub.subjectNo
WHERE subjectName = '数据库结构-1'

在这里插入图片描述
left join 就是以左边的表为基准,right join就是以右边的表为基准
分页与排序

---分页limit与排序 order by----
---排序:升序ASC, 降序DESC---
---ORDER BY 通过哪个字段排序
---查询的结果根据成绩排序
SELECT s.studentNo, studentName,subjectNo, studentResult
FROM student AS s
INNER JOIN result AS r
ON s.studentNo = r.studentNo
INNER JOIN subject AS sub
ON r.subjectNo = sub.subjectNo
WHERE subjectName = '数据库结构-1'
ORDER BY StudentResult ASC

分页:缓解数据库压力
语法:limit(查询起始下标,pageSize)

----分页,每页只显示五条数据---
---语法:limit 当前页,页面的大小
---limit 0,5 1~5
---limit 1,5 2~6
SELECT s.studentNo, studentName,subjectNo, studentResult
FROM student AS s
INNER JOIN result AS r
ON s.studentNo = r.studentNo
INNER JOIN subject AS sub
ON r.subjectNo = sub.subjectNo
WHERE subjectName = '数据库结构-1'
ORDER BY StudentResult ASC
LIMIT 05
----第一页 limit 0,5    (1-1)*5
----第二页 limtt 5,5    (2-1)*5
----第三页 limtt 10,5   (3-1)*5
----第三页 limit     (n-1)*pageSize , 5
---思考题:查询JAVA第一学年,课程成绩排名前十的学生,
---并且分数要大于80的学生信息(姓名,学号,课程名称,分数)
SELECT s.studentNo, studentName,subjectName, studentResult
FROM student AS s
INNER JOIN result AS r
ON s.studentNo = r.studentNo
INNER JOIN subject AS sub
ON r.subjectNo = sub.subjectNo
WHERE subjectName = 'JAVA第一学年' AND studentResult>=80
ORDER BY studentResult DESC
LIMIT 0,10

子查询
where(这个值是计算出来的)
本质:在where语句中嵌套一个子查询语句
where (select * from)

----where----
---1.查询数据库结构-1的所有考试结果(学号,科目名称,成绩),降序排列
---方式一:使用连接查询
SELECT studentNo,subjectName,studentResult
FROM result r
INNER JOIN subjiect sub
ON r.subjectNo = sub.subjectNo
WHERE subjectName = '数据库结构-1'
ORDER BY studentResult DESC
---方式二:使用子查询
SELECT studentNo,subjectName,studentResult
FROM resul
WHERE subjectNo = (
      SELECT subjectNo FROM 'subject'
      WHERE subjectName = '数据库结构-1'
)
ORDER BY studentResult DESC

----分数不小于80分的学生的学号和姓名
SELECT 'studentNo','sudentName'
FROM student s
INNER JOIN result r
ON r.studentNo = s.studentNo
WHERE 'studentResult' >= 80
----在此基础上增加一个科目 高等数学-2
----查询高等数学 -2的编号
SELECT 'studentNo','sudentName'
FROM student s
INNER JOIN result r
ON r.studentNo = s.studentNo
WHERE 'studentResult' >= 80 AND 'subjectNo' = (
    SELECT 'subjectNo' FROM 'subject'
    WHERE subjectName' = '高等数学 -2'
)

MySQL函数
常用函数:

------常用函数------
---数学运算
SELECT ABS(-8) ---绝对值
SELECT CEILING()9.4 ---向上取整
SELECT FLOOR(9.4) ----向下取整
SELECT RAND() -----返回0--1之间的随机数
SELECT SIGN()  ----判断一个数的符号
      ---
---字符串函数
SELECT CHAR_LENGTH('ASFAFAFAF') ---字符串长度
SELECT CONCAT('DDD','D','H') ---拼接字符串
---时间与日期函数--
SELECT CURRENT_DATE() ----获取当前日期---
SELECT NOW() ---获取当前时间
SELECT LOCALTIME() --- 获取本地时间
SELECT SYSDATE() ---获取系统时间
----系统
SELECT SYSTEM_USER()
SELECT USER()
SELECT VERSION()

聚合函数(常用):
在这里插入图片描述

-----聚合函数----
---count统计表中的数据---
SELECT COUNT(studentName) 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
---查询不同课程的平均分,最高分,最低分,平均分大于80
---核心:根据不同的课程分组
SELECT subjectName,AVG(studentResult) AS 平均分,MAX(studentResult),MIN(studentResult)
FROM result r
INNER JOIN 'subject' sub
ON r.subjectNo = sub.subjectNo
GROUP BY r.subjectNo
HAVING 平均分>80

数据库级别的MD5加密

---加密
UPDATE testMd5 SET pwd = MD5(pwd) WHERE id=1

SELECT总结
在这里插入图片描述
事务
要么都成功,要么都失败。
将一组SQL放在一个批次中去执行…
事务原则(ACID):
原子性:要么一起成功,要么一起失败,不能只发生其中一个动作
一致性:事务前后的数据完整性要保证一致
隔离性:针对多个用户同时操作,主要排除其他事务对本次事务的影响
持久性:事务结束后的数据不随着外界原因导致数据丢失,事务没有提交,恢复到原状;事务已经提交,持久化到数据库。
隔离导致的问题:
脏读:指一个事务读取到了另一个事务未提交的数据。
不可重复读:在一个事务内读取表内的某一行数据,多次读取结果不同。
幻读:是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致
执行事务

-----事务-------
---MySQL是默认开启事务自动提交的
SET autocommit = 0 ---关闭
SET autocommit = 1 ---开启(默认的)
---手动处理事务
---事务开启
START TRANSACTION ---标记一个事务的开始,从这个之后的sql都在同一个事务内
INSERT...
 ...
---提交:持久化(成功!)
COMMIT
---回滚:回到原来的样子
ROLLBACK
---事务结束
SET AUTOCOMMIT = 1 --开启自动提交

案例:

---转账
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
USE shop
CREATE TABLE 'account'(
    'id' INT(3) NOT NULL AUTO_INCREMENT
    'name' VARCHAR(30) NOT NULL,
    'money' DECIMAL(9,2) NOT NULL,
    PRIMARY KEY('id')
)ENGINE = INNODB DEFAULT CHARSET=utf8

INSERT INTO account('name','money')
VALUES('A','2000'),('B','10000')
---模拟转账:事务
SET autocommit = 0 ;---关闭自动提交
START TRANSACTION;---事务开启
UPDATE account SET money = money-500 WHERE 'name' = 'A'; --A减500
UPDATE account SET money = money+500 WHERE 'name' = 'B';--B加500
COMMIT; --提交事务
ROLLBACK;--回滚
SET autocommit = 1 ---恢复默认值

索引
索引是帮助MySQL高效获取数据结构的数据结构。
提取句子主干,就可以得到索引的本质:索引是数据结构。
主键索引:PRIMARY KEY
唯一的标识,主键不可重复,只能有一个列作为主键
唯一索引:UNIQUE KEY
避免重复的列出现,唯一索引可以重复,多个列都可以标识位 唯一标识
常规索引:KEY / INDEX
默认的,index、key关键字来设置
全文索引
在特定的数据库引擎才有,MylSAM

--索引的使用
--1.在创建表的时候给字段添加索引
--2.创建完毕后,增加索引
--显示所有的索引信息
SHOW INDEX FROM student
--增加一个全文索引
ALTER TABLE school.student ADD FULLTEXT INDEX 'studentName'('studentName')
--EXPLAIN 分析sql执行的状况
EXPLAIN SELECT * FROM student;--常规索引
SELECT * FROM student WHERE MATCH(studentName) AGAINST('刘')

索引测试
索引在大数据时区别明显。

CREATE TABLE `app_user`(
   `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
   `name` VARCHAR(50) DEFAULT ' ' COMMENT '用户昵称',
   `email` VARCHAR(50) NOT NULL COMMENT '用户邮箱',
   `phone` VARCHAR(20) DEFAULT ' ' COMMENT '手机号',
   `gender` TINYINT(4) UNSIGNED DEFAULT '0' COMMENT '性别(男:1,女:0)',
   `password` VARCHAR(100) NOT NULL COMMENT '密码',
   `age` TINYINT(4) DEFAULT '0' COMMENT '年龄',
   `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
   `update_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='app用户表'

-- 插入一百万条数据
DELIMITER $$-- 写函数之前必须要写,标志
CREATE FUNCTION mock_data()
RETURNS INT DETERMINISTIC
BEGIN
   DECLARE num INT DEFAULT 1000000;
   DECLARE i INT DEFAULT 0;
   
   WHILE i<num DO
      -- 插入语句
       INSERT INTO app_user(`name`,`email`,`phone`,`gender`,`password`,`age`)
       VALUES(CONCAT('用户',i)
       ,'24444@qq.com'
       ,CONCAT('18',FLOOR(RAND()*((999999999-100000000)+100000000)))
       ,FLOOR(RAND()*2)
       ,UUID()
       ,FLOOR(RAND()*100));
      SET i = i +1; 
   END WHILE;
   RETURN i;
 END;
SELECT mock_data();

SELECT * FROM app_user WHERE `name`='用户99999' -- 0.99sec

EXPLAIN SELECT * FROM app_user WHERE `name`='用户99999'

-- id_表名_字段名
-- CREATE INDEX 索引名 on 表(字段) 
CREATE INDEX id_app_user_name ON app_user(`name`)
SELECT * FROM app_user WHERE `name`='用户99999' -- 0.01sec

EXPLAIN SELECT * FROM app_user WHERE `name`='用户99999'

索引原则
1)索引不是越多越好
2)不要对经常变动数据加索引
3)小数据量的表不需要加索引
4)索引一般加在常用来查询的字段上
索引的数据结构
Hash类型的
Btree:innoDB的默认数据结构
详见:http://blog.codinglabs.org/articles/thory-of-mysql-index.html

权限管理与备份
权限

--创建用户
CREATE USER shuai IDENTIFIED BY '123456'
--修改密码(当前用户密码)
SET PASSWORD = PASSWORD('修改当前用户密码')
--修改密码(指定用户)
SET PASSWORD FOR shuai = PASSWORD('修改当前用户密码')
--重命名
RENAME USER shuai TO shuai11
--用户授权,全部的权限
GRANT ALL PRIVILEGES *.* TO shuai11
--查看权限
SHOW GRANT FOR shuai11
--撤销权限(全部权限)
REVOKE ALL PRIVILEGES ON *.* FROM shuai11
--删除用户
DROP USER shuai11

备份
保证重要的数据不丢失;
数据转移;
MySQL数据库备份的方式
1)直接拷贝物理文件(data里面)
2)在Sqlyog工具可视化导出
3)使用命令行导出 mysqldump命令行使用
在这里插入图片描述
规范的数据库设计
当数据库比较复杂的时候,需要设计
良好的数据库设计:
1.节省内存空间
2.保证数据库的完整性
3.方便我们开发系统
软件开发中,关于数据库的设计
分析需求:分析业务和需要处理的数据库的需求
概要设计:设计关系图E-R图
设计数据库的步骤:(个人博客)
1.收集信息,分析需求
用户表(用户登录注销,用户的个人信息,写博客,创建分类)
分类表(文章分类,谁创建的)
文章表(文章的信息)
友链接(友链信息)
自定义表(系统信息,某个关键的字,或者一些主字段)
2.标识实体(把需求落实到具体字段)
3.标识实体之间的关系
写博客:user–>blog
创建分类:user–>category
关注:user–>user
友链:links
评论:user–>user–>blog

三大范式
规范数据库的设计。
第一范式(1NF)
原子性:保证每一列不可再分
第二范式(2NF)
前提:满足第一范式
每张表只描述一件事情,每一列数据都与主键相关
第三范式(3NF)
前提:满足第一范式和第二范式
需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关
规范性和性能的问题
关联查询的表不超过三张表

JDBC
概念:Java语言操作数据库
JDBC本质:官方(sun公司)定义的一套操作所有关系型数据库的规则(接口)。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
步骤:
1.加载驱动
2.获取数据库连接对象Connection
3.获取执行sql语句的对象statement
4.执行sql,接受返回结果
5.释放资源

//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");//固定写法
//2.用户信息和url
String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true"
String username = "root";
String password = "123456"
//3.连接成功,数据库对象 Connection 代表数据库
Connection connection = DriverManager.getConnection(url,username,password);
//4.执行SQL的对象 Statement 执行sql的对象
Statement statement = connection.createStatement();
//5.执行SQL的对象 获取返回结果
String sql = "SELECT * FROM user"
ResultSet resultSet = statement.executeQuery(sql);//返回的结果集,结果集中封装了全部结果
while(resultSet.next()){
    System.out.println("name=" + resultSet.getObject("NAME"))
}
//6.释放连接
resultSet.close();
statement.close();
connection.close();

Connection对象:数据库连接对象:
connection代表数据库
功能:
1)获取执行sql的对象:
Statement createment();
PreparedStatement preparedStatement(String sql);
2)管理事务:
开启事务:setAutoCommit(Boolean autoCommit):调用该方法设置参数为false,即开启事务
提交事务:Commit()
回滚事务:rollback()
Statement对象:执行sql的对象
查询操作:statement.executeQuery(sql);
执行任何sql:statement.execute(sql);
执行更新、插入、删除:statement.executeUpdate(sql);
RessultSet对象:查询结果集
1)遍历:next()方法:游标向下移动一行
2)getxxx():获取数据,xxx表示数据类型(getInt())
参数:int:代表列的编号,如getString(1)
String:代表列的名称,如getDouble(“balance”)
SQL注入问题
在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性的问题
1)输入用户随便,数入密码:a’ or ‘a’ = ‘a
2) Sql: select * from use where username = ‘fdf’ and password = ‘a’ or ‘a = ‘a’
解决sql注入问题
1)使用PreparedStatement对象来解决

Connection conn = JdbcUtils.getConnection();
//区别
//使用?占位符代替参数
String sql = "insert into users(id,name,password) values(?,?,?,?)";
PrepareStatement st = conn.prepareStatement(sql);
//手动给参数赋值
st.setInt(1,4);
st.setString(2,"shuai");
st.setString(3,"123456");
//执行
st.excuteUpdate();
//释放对象
st.close();
conn.close();

2)预编译的SQL:参数使用?作为占位符
JDBC操作事务
1)开启事务:conn.setAutoCommit(false);
2)一组业务执行完毕,提交事务
3)可以在catch语句中显示的定义回滚语句,但默认失败就会回滚。

Connection conn = JdbcUtils.getConnection();
//关闭数据库的自动提交,自动会开启事务
conn.setAutoCommit(false);
String sql1 = "update account set money = money-100 where name = 'A'";
PrepareStatement st = conn.prepareStatement(sql1);
st.excuteUpdate();

String sql2 = "update account set money = money+100 where name = 'B'";
PrepareStatement st = conn.prepareStatement(sql2);
st.excuteUpdate();
//业务完毕,提交事务
conn.commit();
try{
    //失败回滚事务
    conn.rollback();
}
catch(SQLException e1){
    e1.printStackTrace();
}
finally{
    //释放对象
    st.close();
    conn.close();
}

数据库连接池
概念:其实就是一个容器(集合),存放数据连接的容器。
好处:节约资源;用户访问高效。
实现:标准接口:DataSource
方法:获取连接:getConnection()
归还连接:Connection.close()
DPCP、C3P0:数据库连接池技术
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.创建核心对象:数据库连接池对象 ComboPooleDataSource
4.获取连接:getConnection
5.归还连接
Druid
步骤:1.导入jar包druid-1.0.1.jar
2.定义配置文件:Properties形式,可以叫任意名称,可以放任意目录下
3.加载配置文件.Properties
4.获取数据库连接池对象:通过工厂来获取 DruidDataSourceFactory
5.获取连接:getConnection

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值