MySQL简单学习

Mysql

JavaEE:企业级java开发,web方面

  1. 前端:页面展示,本质是数据

  2. 后台:连接点,连接数据库,连接前端(控制视图跳转,给前端传递数据)

  3. 数据库:存数据

     

DBMS

DataBasic ManageSystem:数据库管理系统

数据库:存储数据

数据库管理系统:管理和操作数据

MySQL本质是关系型数据库管理系统,将数据保存在不同的表中,MySQL所使用的SQL语言适用于访问数据库的最常用标准化语言。开源的数据库软件,体积小、速度快、总体拥有成本低

 

连接数据库

1、命令行连接

 mysql -uroot -p123456   --连接数据库
 
 update mysql.user set authentication_string=password('123456') where user='root' and Host='localhost'; --修改密码
 flush privileges; --刷新权限
 
 ---------------------------------------------------------------------
 --所有的语句都是分号结尾
 show databases; --查看所有的数据库
 
 mysql> use school --use 数据库名 来切换数据库
 Database changed
 
 show tables; --查看数据库中所有的表
 
 describe students; --describe 表名 显示数据库中所有的表的信息
 
 create database school; --创建一个数据库名,create database 数据库名称
 
 exit; --推出连接
 
 -- 单行注释(SQL的本身注释) /**/多行注释
 
 

 

操作数据库

操作数据库>操作数据库中的表>操作数据库中表的数据

mysql关键字不区分大小写

 

操作数据库

1、创建数据库

 create database if not exists school(库名)

 

2、删除数据库

 drop database if exists school(库名)

 

3、使用数据库

 use 库名

如果表名或者字段名是一个特殊字符,需要带 ``

4、查看数据库

 show databases; --查看所有的数据库
 show tables; --查看数据库中所有的表

 

数据库的列类型

数值

整数:

  • tinyint 十分小的数据 占1个字节

  • smallint 较小的数据 占2个字节

  • mediumint 中等大小的数据 占3个字节

  • int 标准的整数 占4个字节 常用

  • bigint 较大的数据 占8个字节

浮点数:

  • float 浮点数 4个字节

  • double 浮点数 8个字节

  • decimal 字符串形式的浮点数(金融计算的时候,一般使用decimal)

 

字符串

  • char 字符串固定大小的 0-255

  • varchar 可变字符串 0-65535 常用

  • tinytext 微型文本 2^8-1

  • text 文本串 2^16-1 保存大文本

 

时间日期

java.util.Date

 

  • date YYYY-MM-DD 日期格式

  • time HH: mm: ss 时间格式

  • datetime YYYY-MM-DD HH: mm: ss 最常用的时间格式

  • timestamp 时间戳 1970.1.1到现在的毫秒数 也较为常用

  • year 年份表示

 

null

  • 没有值,未知

  • 注意:不要使用NULL进行运算

 

数据库的字段属性

Unsigned:

  • 不能声明为负数

  • 无符号的整数

 

zerofill:

  • 0填充的

  • 不足的位数使用0填充 比如:int(3) 5 会变成005

 

自增

  • 通常理解为自增,自动在上一条记录的基础上+1(默认)

  • 通常用来设计唯一的主键,并且必须为整数类型

  • 可以自定义主键自增的起始值和步长

 

非空

  • 假设设置为非空,如果不给它赋值,就会报错

 

默认

  • 设置默认的值

 

格式

 CREATE TABLE IF NOT EXISTS ‘student’ (
    ‘id’ INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
    ‘字段名’(单引号为中文) 列类型 属性 索引 注释(注释和默认值的单引号为英文)
    )

 

常用命令

  • 查看创建数据库的语句

 show create database school
  • 查看数据库中表的数据

 show create table student
  • 查看表的具体信息

desc student

数据表的类型

-- 关于数据库引擎
/*
默认使用INNODB
MYISAM 早些年使用
*/

 

修改和删除表

修改

修改表名

ALTER TABLE ‘student’ RENAME AS teacher  	ALTER TABLE 旧表名 RENAME AS 新表名

增加表的字段

ALTER TABLE teacher ADD age INT(2)

修改表的字段(重命名,修改约束)modify:修改 change:改变

ALTER TABLE teacher MODIFY age VARCHAR(11)     -- 修改约束		 ALTER TABLE 表名 MODIFY 字段名 列属性()
ALTER TABLE teacher CHANGE age age1 INT(2)     -- 字段重命名	    ALTER TABLE 表名 CHANGE 旧名字 新名字

删除表的字段

ALTER TABLE teacher DROP age1 	ALTER TABLE 表名 DROP 字段名

 

删除

删除表

DROP TABLE IF EXISTS teacher	--DROP TABLE IF EXISTS 表名

 

DML语言

数据库管理语言:Database Manage Language

插入语句

  • insert into 表名(‘字段名’)values ('值'),数据和字段一一对应

INSERT INTO teacher(‘name’) VALUES('学习')
  • 插入多个字段

--每个字段对应一个数据
INSERT INTO teacher(`‘password’`,`’sex‘`,`‘birthday’`) VALUES ('111222333','女','1999:11:4')	

--一个字段多个数据
INSERT INTO teacher(`‘password’`) VALUES (‘111222333’),('222333'),('333444')

注意事项

1、字段和字段之间使用英文逗号隔开

2、可以同时插入多条数据,values后面的值,需要使用,用逗号隔开 values(),(),(),()

 

修改

语法:UPDATE 表名 SET 修改的字符名=‘修改的值’ WHERE 条件
UPDATE `teacher` SET `’name‘`='修改1' WHERE `‘id’`=2	-- 不指定条件的情况下,会改动所有表 

修改多个属性,用逗号隔开
UPDATE `teacher` SET `’name‘`='修改2',`‘email’`='1903467504@qq.com' WHERE `‘id’`=2

通过多个条件定位
UPDATE `teacher` SET `’name‘`='修改3' WHERE `‘password’`='123456' AND `’name‘`='学白'

where 的几个特殊条件:

between 2 and 5:2到5之间,包括2和5

and:表示&&

OR:表示||

 

删除

delete命令

--删除数据
DELETE FROM ‘student’

--删除指定数据
DELETE FROM 'student' WHERE 'id'=2

 

TRUNCATE命令

作用:完全清空一个数据库表,表的结构和索引约束不会变

TRUNCATE 'student'

delete和truncate的区别

  • 相同点:都能删除数据,都不会删除表结构

  • 不同点:truncate之后自增会归零、delete不会影响自增

    truncate不会影响事物

 

DQL语言

数据库查询语言:Database Query Language

关键字:select

指定查询字段

select语法

SELECT[ALL|DISTINCT]	-- ALL全部数据、DISTINCT去重
{字段名}
FROM  TABLE_NAME  AS  othername		--TABLE_NAME:表名		othername:表的别名
	[Left join| Right join| Inner join   TABLE_NAME2]		-- 联合查询
	[where ...]						--指定结果需满足的条件
	[GROUP BY ...]					--指定结果按照哪几个字段来分组
	[HAVING]						--过滤分组的记录必须满足的次要条件
    [ORDER BY ...]					--指定查询记录按一个或多个条件排序
    [LIMIT{}]						--指定查询的记录从哪条到哪条

[ ]代表可选 { }代表必选

select语法的顺序不能颠倒

 

-- 查询学生的全部信息	select 字段名 from 表     *表示全部
SELECT * FROM student
SELECT * FROM grade

-- 查询指定字段
SELECT `studentno`,`subjectno` FROM result

-- 别名,给查询结果起一个名字(关键字as)	 格式:select 字段名 AS 字段别名,...from 表名 AS 表的别名
SELECT `studentname` AS 学生姓名,`sex` AS 学生性别 FROM student AS 学生表

-- 函数  concat(a,b):拼接
SELECT CONCAT('学生姓名:',studentname) AS 新格式 FROM student

语法:select 字段,... from 表

有的时候,列名字不是那么的见名知意,我们可以起别名(AS) 字段名 AS 别名 表名 AS 别名

 

查询MySQL系统版本

SELECT VERSION()

加减乘除查询

SELECT 100*2/4+15-20 AS 计算的结果	-- 加减乘除查询

 

去重

关键字:distinct

作用:去除select语句查询出来的的结果中重复的数据,重复的数据只显示一条

SELECT DISTINCT 'studentNo' FROM result  -- 发现重复数据,去重

数据库的列

-- 查询MySQL系统版本
SELECT VERSION()
-- 查询自增的步长
SELECT @@auto_increment_increment

数据库中的表达式:文本值,列,NULL,函数计算表达式,系统变量

SELECT 表达式 from 表

where条件子句

作用:检索数据中符合条件的值

逻辑运算符

运算符语法描述
and && a and b 逻辑与,两个都为真,结果为真
or || a or b 逻辑或,其中一个为真,则结果为真
Not !(取反) not a 逻辑非,真为假,假为真
-- 查询考试成绩在80-100分的学生
SELECT `studentno`,`studentresult` FROM result
WHERE studentresult>=80 AND studentresult<=100

-- 模糊查询(区间)
SELECT studentno,studentresult FROM result
WHERE studentresult BETWEEN 90 AND 100

-- 除了1000号学生之外的同学的成绩
SELECT studentno,studentresult FROM result
WHERE studentresult !=95

SELECT studentname,sex,phone FROM student
WHERE NOT sex=1

模糊查询

比较运算符

运算符语法描述
IS NULL a is null 如果操作符为null,结果为真
IS NOT NULL a is not null 如果操作符为 not null,结果为真
between 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关键字  %(代表0到任意个字符)	_(代表一个字符)

-- 查询姓张的同学
SELECT `studentno`,`studentname`,`address`,`sex` FROM student
WHERE studentname LIKE '张%';
-- 查询名字当中有强的同学
SELECT `studentno`,`studentname`,`address`,`sex` FROM student
WHERE studentname LIKE '%张%';

-- In关键字
-- 查询课程时长在100和110小时的克
SELECT `subjectno`,`subjectname`,`classhour` FROM `subject`
WHERE classhour IN (110,100)

-- null和not null

联表查询

Join对比

left join、inner join、right join

操作描述
Inner join 如果表中至少有一个匹配,就返回行
left join 会从左表中返回所有的值,即使右表中没有匹配
right join 会从右表中返回所有的值,即使左表中没有匹配
-- ====================联表查询=====================
-- left join	Inner join	Right join
-- join (连接的表)on (判断条件) 连接查询(这是个语法)
-- where 等值查询(这是个条件)

-- Inner join
SELECT s.`studentno`,`studentname`,`address`,`subjectno`,`studentresult` 
FROM student AS s
INNER JOIN result AS r
ON s.studentno=r.studentno

-- Left join
SELECT s.`studentno`,`studentname`,`address`,`subjectno`,`studentresult` 
FROM student AS s
LEFT JOIN result AS r
ON s.studentno=r.studentno

-- Right join
SELECT s.`studentno`,`studentname`,`address`,`subjectno`,`studentresult` 
FROM student AS s
RIGHT JOIN result AS r
ON s.studentno=r.studentno

-- 查询
SELECT s.`studentno`,`studentname`,`address`,`subjectno`,`studentresult` 
FROM student AS s
LEFT JOIN result AS r
ON s.studentno=r.studentno
WHERE studentresult IS NULL

-- 查询参加了考试的同学信息,包括学号、学生姓名、科目名、分数
/*
思路:
1、分析需求,分析查询的字段来自哪些表
2、确定使用哪种连接查询
3、确定交叉点(这两个表中的哪个数据是相同的)

*/

SELECT s.`studentno`,`studentname`,`address`,r.`subjectno`,`studentresult`,`subjectname` 
FROM student AS s
RIGHT JOIN result AS r
ON s.studentno=r.studentno
INNER JOIN `subject` AS sub
ON r.subjectno=sub.subjectno

查询数据的语法

1、查询数据:select

2、FROM 表 join 连接的表 on 交叉条件

3、假设存在一种多张表查询,先查询两张表再慢慢查询

 

后续

 

自连接

自己的表和自己的表连接; 核心:一张表拆成两张一样的表即可

 

父类

categoryidcategoryname
2 信息技术
3 软件开发
5 美术设计

子类

pid(父类categoryid)categorycategoryname
3 4 数据库
2 8 办公信息
3 6 web开发
5 7 ps技术

查询父类对应的子类关系

父类子类
软件开发 数据库
信息技术 办公信息
软件开发 web开发
美术设计 ps技术
-- 查询父类对应的子类关系
-- 将一张表拆成两张 a.category,b.category

SELECT FROM a.`categoryname` AS '父栏目',b.`categoryname` AS '子栏目'
FROM category AS a ,category AS b
WHERE a.category.id=b.pid

分页和排序

排序:

-- ORDER BY	排序:升序ASC,降序DESC	  语法:order by 字段名 asc\desc
-- 查询的结果根据 成绩降序 排序
SELECT s.`studentno`,`studentname`,`studentresult`,`subjectname`
FROM student AS s
LEFT JOIN result r
ON s.studentno=r.studentno
INNER JOIN `subject` sub
ON r.subjectno=sub.subjectno
WHERE sub.subjectname='高等数学-1'
ORDER BY studentresult ASC

分页:

-- 分页	  语法:limit  查询起始下标,页面的大小(几个数据)
-- 作用:1、缓解数据库压力  2、给人更好的体验

-- 每页只显示1条数据
SELECT s.`studentno`,`studentname`,`studentresult`,`subjectname`
FROM student AS s
LEFT JOIN result r
ON s.studentno=r.studentno
INNER JOIN `subject` sub
ON r.subjectno=sub.subjectno
WHERE sub.subjectname='高等数学-1'
ORDER BY studentresult ASC
LIMIT 0,2			-- 0表示从赵强开始,1表示从张伟开始

 

子查询

where(子查询语句)

-- where(子查询语句)
-- 本质:在where语句中嵌套一个子查询语句
-- 查询的结果根据 成绩降序 排序

SELECT `studentno`,`studentresult`,`subjectno`
FROM result
WHERE subjectno=(
	SELECT subjectno FROM `subject`
	WHERE subjectname='高等数学-1'
)

 

MySQL函数

一般函数:

-- 数学运算
SELECT ABS(-8)		-- 绝对值
SELECT CEILING(9.5)  	-- 向上取整
SELECT FLOOR(9.5)	-- 向下取整
SELECT RAND()		-- 返回一个0-1之间的随机数
SELECT SIGN(2)		-- 判断一个数的符号 正数返回1,负数返回-1,0返回0

-- 字符串函数
SELECT CHAR_LENGTH('我爱学习java')	-- 返回字符串长度 
SELECT CONCAT('我','喜','欢','你')	-- 拼接字符串
SELECT INSERT('我爱编程')
SELECT LOWER('LOL')	-- 转小写 
SELECT UPPER('lol')	-- 转大写

-- 时间、日期函数 current:现在的,当前的
SELECT CURRENT_DATE()	-- 获取当前日期
SELECT NOW()		-- 获取当前时间
SELECT LOCALTIME()	-- 获取本地时间
SELECT SYSDATE()	-- 获取系统时间
SELECT YEAR(NOW())	-- 获取当前时间的年份

-- 系统
SELECT SYSTEM_USER()
SELECT USER()
SELECT VERSION()	-- 当前版本

 

聚合函数(常用)

 

函数描述名称
count() 计数
sum() 求和
avg() 平均值
MAX() 最大值
MIN() 最小值
   
SELECT COUNT(studentno) FROM `student`	 -- count(指定列或字段),会忽略所有的null值
SELECT COUNT(*) FROM `student`		 -- 不会忽略null值
SELECT COUNT(1) FROM `student`		 -- 不会忽略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`

-- 查询不同课程的平均分、最高分、最低分
-- 核心:根据不同课程分组
SELECT `subjectname`,AVG(`studentresult`) AS 平均分,MAX(`studentresult`),MIN(`studentresult`)
FROM result AS r
INNER JOIN `subject` AS sub
ON r.`subjectno`=sub.`subjectno`
GROUP BY sub.`subjectno`	-- 通过什么字段来分组
-- having:过滤分组的记录必须满足的次要条件
HAVING 平均分>=80	-- having子句的作用是筛选满足条件的组,在分组之后过滤

 

数据库级别的MD5加密

MD5:信息摘要算法

MD5不可逆 具体的值的MD5是一样的

MD5 破解网站的原理,背后有一个字典,MD5加密后的值,加密前的值

-- 明文密码
INSERT INTO testmd5 VALUES(1,'张撒旦','21382914rwjdfksa'),
(2,'东方瑞通','2138dsad4rwjdfksa'),
(3,'讽德诵功说','wqe2344rwjdfksa');

-- 加密
UPDATE testmd5 SET psw=MD5(psw)
-- 如何校验:将用户传递进来的密码,进行MD5加密,然后比对加密后的值

 

事务

要么都成功,要么都失败

事务是一组SQL语句,要么全部执行成功,要么全部执行失败。通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)

事物原则:ACID原则:原子性 ;一致性;隔离性;持久性(脏读,幻读...)

原子性(Atomicity):针对同一个事务,一起成功,或者一起失败,不能只发生其中一个动作

A->转账200->B B->收到转账200->A 不能只发生一个动作

操作前:A:800 B:200

操作后:A:600 B:400

一致性(Consistency): 事务前后的数据完整性要保持一致

A有1000,B有200,A->转账200->B,A和B的总价值不变

持久性(Isolation):事务一旦提交则不可逆,被持久化到数据库中

如果在操作前(事务还没有提交)服务器宕机或断电,那么重启数据库以后,数据库状态应为A:800,B:200

如果在操作后(事务已经提交)服务器宕机或者停电,那么重启数据库以后,数据库状态应为A:600,B:400

隔离性():事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,事务之间要相互隔离

A给B转账,C也给B转账,不会产生影响

 

事物的隔离级别

脏读:指一个事务读取了另一个事务未提交的数据

不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同

虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致

-- MySQL是默认开启 事务自动提交的
SET autocommit=0  -- 关闭
SET autocommit=1  -- 开启

-- 手动处理事务
SET autocommit=0	-- 1、关闭自动提交
-- 标记一个事务的开始,从这个之后的sql都在同一个事务内
SET TRANSACTION		-- 2、事务开启

INSERT xx
INSERT xx

COMMIT			-- 3、提交(成功)
ROLLBACK		-- 回滚:回到原来的样子(失败)

SET autocommit=1	-- 4、事务结束	重新开启mysql自动提交 



-- =================测试事务实现转账===================
-- 创建一个数据库  语法:create database 库名 character set utf8 collate utf8_geberal_ci
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
USE shop
-- 创建一个表
DROP TABLE IF EXISTS `account`
CREATE TABLE `account`(
	`id` INT(4) NOT NULL AUTO_INCREMENT,	-- 自增
	`name` VARCHAR(20) NOT NULL,
	`money` DECIMAL(9,2) NOT NULL,	-- decimal(9,2)表示共有9位数字,7位整数,2位小数
	PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `account`(`name`,`money`)VALUES
('张三',2000.33),('李四',12232.32)

 SET autocommit=0;
 START TRANSACTION	-- 开启一个事务(一组sql语句)
 UPDATE `account` SET money=money-200 WHERE `name`='张三'
 UPDATE `account` SET money=money+200 WHERE `name`='李四'
 COMMIT;
 ROLLBACK;
 SET autocommit=1;

 

索引

索引的定义

索引是帮助MySQL高效获取数据的数据结构。提取句子的主干,就可以得到索引的本质:索引是数据结构

在一个表中,主键索引只能有一个,唯一索引可以有多个

1、索引的分类

1、主键索引:(primary key)

特性:唯一标识,主键不可重复,只能有一个列作为主键

2、唯一索引:(UNIQUE KEY)

特性:避免重复的列出现,唯一索引可以重复,多个列都可以标识为唯一索引

3、常规索引:(key/index)

默认的,index,key设置

4、全文索引:(FullText)

在特定的数据库引擎下才有,如:MyiSam

快速定位数据

-- 显示所有的索引信息
SHOW INDEX FROM student

-- 增加一个索引	语法:Alter table 表名 add 索引 索引名(需要增加索引的字段名)
ALTER TABLE student ADD FULLTEXT INDEX studentname(`studentname`);

2、索引原则

  • 索引不是越多越好

  • 不要对经常变动的数据加索引

  • 小数据量的表不需要加索引

  • 索引一般加在常用来查询的字段上

 

权限管理

1、用户管理

sql命令操作:

用户表:mysql.user 本质就是对这张user表进行增删改查

-- 创建用户 
-- 语法:create user 用户名 identified by 密码
CREATE USER xuebai IDENTIFIED '123456'

-- 修改当前用户密码  语法:set password=password('新密码')
SET PASSWORD=PASSWORD('111111')
-- 修改指定用户密码  语法:set password for 用户名=password('新密码')
SET PASSWORD FOR xuebai=PASSWORD('111111')

-- 给用户重命名  语法:rename user 老用户名 to 新用户名
RENAME USER xuebai TO newuser

-- 用户授权 grant:授予  privileges:特权	
-- 权限没root高,因为不能给其他人授权
GRANT ALL PRIVILEGES ON *.* TO 用户	   -- *.*表示全部的库全部的表

-- 撤销权限 revoke:撤销
REVOKE ALL PRIVILEGES ON *.* FROM 用户

-- 删除用户
DROP USER 用户名

2、MySQL备份

作用:保证重要的数据不丢失,可以做数据转移

方式:1、直接拷贝date文件 2、在sqlyog等可视化工具中手动导出 3、使用命令行导出(mysqldump)

 

JDBC设计

步骤总结:

1、加载驱动 2、连接数据库DriverManager

3、获得执行的对象Statement

4、获得返回的结果集 5、释放连接

public class TestJdbc {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //步骤:1、加载驱动
        Class.forName("com.mysql.jdbc.Driver");     //固定写法,加载驱动

        //2、用户信息和url  固定写法
        String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=false";
        //jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8&useSSL=false
        //  useUnicode=true:unicode  支持中文编码
        //  characterEncoding=utf8  设置字符集编码,防止乱码
        //  useSSL=true  保证使用安全

        String username="root";
        String password="123456";

        //3、连接成功,返回一个数据库对象  drivermanager:驱动管理  Connection代表数据库
        Connection connection = DriverManager.getConnection(url, username, password);

        //4、创建执行SQL的对象
        Statement statement = connection.createStatement();

        //5、执行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"));
            System.out.println("password="+resultSet.getObject("PASSWORD"));
            System.out.println("email="+resultSet.getObject("email"));
            System.out.println("birthday="+resultSet.getObject("birthday"));
            System.out.println("========================================");
        }
        //6、释放连接
        resultSet.close();
        statement.close();
        connection.close();

    }
}

 

SQL注入的问题

sql存在漏洞,会被攻击导致数据泄露

‘ ’ or 1=1

sql会被拼接

 

PrepareStatement对象

和Statement对象相比,它可以防止SQL注入,并且效率更高

本质:把传递进来的参数当作字符,假设其中存在转义字符,会被直接转义

 

1、新增

import com.xuebai.lesson02Jdbc.utils.JdbcUtils;
import java.sql.*;
import java.util.Date;

public class TestInsert {
    public static void main(String[] args) {

        Connection connection=null;
        PreparedStatement st=null;

        //获取连接
        try {
            connection = JdbcUtils.getConnection();
            //使用问号占位符代替参数
            String sql="insert into users(id,`NAME`,`PASSWORD`,`email`,`birthday`) values(?,?,?,?,?)";
            st = connection.prepareStatement(sql);     //需要一个预编译的参数,先写SQL然后不执行

            //手动给参数赋值
            st.setInt(1,5);
            st.setString(2,"撒旦");
            st.setString(3,"1234567");
            st.setString(4,"321435643@qq.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(i>0){
                System.out.println("插入成功");
            }

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            JdbcUtils.release(connection,st,null);
        }
    }
}

2、删除

import com.xuebai.lesson02Jdbc.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class TestDelete {
    public static void main(String[] args)  {
        Connection connection =null;
        PreparedStatement st=null;
        try {
            connection = JdbcUtils.getConnection();
            String sql="delete from users where id=?";
            st=connection.prepareStatement(sql);

            st.setInt(1,4);

            int i=st.executeUpdate();
            if(i>0){
                System.out.println("删除成功");
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally{
            JdbcUtils.release(connection,st,null);
        }
    }
}

3、更新

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class TestUpdate {
    public static void main(String[] args) {
        Connection connection=null;
        PreparedStatement s=null;
        try {
            connection = JdbcUtils.getConnection();
            String sql="update users set `NAME` = ? where id=?;";
            s=connection.prepareStatement(sql);

            s.setString(1,"name");
            s.setInt(2,2);

            int i=s.executeUpdate();
            if(i>0){
                System.out.println("更新成功");
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            JdbcUtils.release(connection,s,null);
        }
    }
}

 

使用IDEA连接数据库

 

JDBC操作事务

ACID原则

原子性:要么全部完成,要不都失败

一致性:事务前后的数据完整性保持一致

持久性:事务一旦提交则不可逆,被持久化到数据库中

隔离性:多个线程互不干扰

 

**隔离性的问题

  • 脏读:指一个事务读取了另一个事务未提交的数据

  • 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同

  • 虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致

 

代码实现:

  • 开启事务:connection.setAutoCommit(false)

  • 一组sql执行完毕,提交事务

import com.xuebai.lesson02Jdbc.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

//JDBC操作事务
public class TestTransation {
    public static void main(String[] args) {
        Connection connection=null;
        PreparedStatement s=null;
        ResultSet r=null;

        try {
            connection = JdbcUtils.getConnection();
            //关闭数据库的自动提交,事务会开启
            connection.setAutoCommit(false);

            String sql01="update account set money=money-100 where name='A'";
            s=connection.prepareStatement(sql01);
            s.executeUpdate();

            String sql02="update account set money=money+100 where name='B'";
            s=connection.prepareStatement(sql02);
            s.executeUpdate();

            //事务完毕,提交事务
            connection.commit();
            System.out.println("操作成功");

        } catch (SQLException throwables) {
            try {
                connection.rollback();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            throwables.printStackTrace();
        }finally {
            JdbcUtils.release(connection,s,r);
        }
    }
}

 

数据库连接池

数据库连接----执行完毕----释放 连接到释放十分浪费资源

池化技术:准备一些预先的资源,过来就连接预先准备好的

例:银行:-----开门-----业务员------等待-----服务----- 关门

最少连接数:10

最大连接数:100 业务最高承载上限

等待超时:100ms

 

编写连接池,实现一个接口DataSource

开源数据源:DBCP、C3P0、Druid

使用了这些数据库连接池之后,我们在项目开发中就不需要编写连接数据库的代码了

 

 

 

 

posted @ 2021-05-09 18:24  privateRR  阅读(108)  评论(0)    收藏  举报