MySQL简单学习
JavaEE:企业级java开发,web方面
-
-
后台:连接点,连接数据库,连接前端(控制视图跳转,给前端传递数据)
-
数据库:存数据
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、假设存在一种多张表查询,先查询两张表再慢慢查询
后续
自连接
自己的表和自己的表连接; 核心:一张表拆成两张一样的表即可
父类
| categoryid | categoryname |
|---|---|
| 2 | 信息技术 |
| 3 | 软件开发 |
| 5 | 美术设计 |
子类
| pid(父类categoryid) | category | categoryname |
|---|---|---|
| 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
使用了这些数据库连接池之后,我们在项目开发中就不需要编写连接数据库的代码了

浙公网安备 33010602011771号