狂神说mysql笔记
1、mysql
基本操作
Windows-->Mysql5.7打开
输入用户名和密码
查看数据库 :show databases;查询所有数据库,记住一定要加分号结尾
这里必须全部为 英文空格 英文符号
选择 day4_6数据库:use day4_6;
查看这个数据库的所有表: show tables;
创建命名为westos的数据库:create databases westos;
再次查询所有的数据库:show databases;
show databases;-- 查看所有数据库
mysql> use day4_6 -- 选择数据库中的day4_6表
Database changed
show tables;-- 查看day4_6数据库中的所有表
describe student;-- 显示库所有表的信息 没有设计过表或者没有信息则不会显示出来
create database westos;-- 创建一个名为westos的数据集
exit; -- 退出连接
-- 单行注释
/*
多行注释
*/
数据库 语言 crud增删改查
DDL 定义
DML 操作
DQL 查询
DCL 控制
2、操作数据库
这里在Navicat premium中操作
2.1、创建数据库
创建一个名叫 westos的数据表:create database westos;
删除数据库
这里创建了一个day4_27的数据库
在旁边输入命令 drop databases day4_27 这里多输入了一个s 操作不成功
当命令行输入drop database day4_27;则删除成功
使用数据库
选择 westos数据库 :use day4_6;
当数据库是关键字时应该用``两个飘将他包含例如
查看表结构sql语句
show create tbale 表名
;
粘贴的语句为:
查看数据库
只执行第二行语句 show tables 查看数据库中的所有表
2.2、数据库的类型
数值
- 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 保存大文本
时间日期
java.util.Date
- data YYYY-MM-DD 日期格式
- time HH:mm:ss 时间格式
- datetime YY-MM-DD HH:mm:ss 最常用的格式、
- timestamp 时间戳 1970.1.1到现在的毫秒数!也较为常用
- year年份的表示
null
空值
2.3、数据库的字段属性(重点)
unsigned:
- 无符号的整数
- 声明该列不能为负数
zerofill:
- 填充0
- 不足位数的,用0来填充 例如 int(3),输入5 输出结果为005
自增:
- 自动在上一条的记录上+1
- 通常设计在唯一的主键~index,必须是整形类型
- 还可以自定义设置自增的起始值和步长
非空:null和 not null
- 假设设置为not null 如果不给它赋值就会报错
- null,如果不填写,默认值就是null还有可能为空白
2.4、创建数据库表
CREATE TABLE `student` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` varchar(20) DEFAULT '匿名' COMMENT '姓名',
`sex` varchar(10) DEFAULT '男' COMMENT '性别',
`pwd` varchar(20) NOT NULL COMMENT '密码',
`birthday` datetime DEFAULT NULL COMMENT '出生日期',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE if not exists`student`(
// 当表不存在时 创建student数据表
// 字段名--'id' 列类型--int(字节) 默认值--DEFAULT'' 备注--comment'' AUTO_INCREMENT, //用逗号隔开
AUTO_INCREMENT//表自增
`birthday` datetime NOT NULL,//这里需要版本足够高否则会报错 结尾后最后一个字段不加点,
)
常用命令
show create database student --查看创建数据库的语句 这里student表示数据库
show create table student --查看创建数据库表的语句 这里student表示数据库表
desc student --显示数据库表的结构
2.5、数据表的类型
-- 关于数据库引擎
/*
INNODB 默认使用
MYISAM 早些年使用的
*/
MYUSAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间大小 | 较小 | 较大,约为2倍 |
常规使用的操作:
- MYUSAM 节约空间,速度较快
- INNODB 安全性高,事务的处理,多表多用户操作
物理空间位置
MySQL 引擎在物理文件上的区别
- InnoDB在数据库中只有一个 *.frm 文件,以及上级目录下的ibdata1文件
- MYSAM 对应文件
- *.frm 表结构的定义文件
- *.MYD 数据文件(data)
- *.MYI 索引文件(index)
设置数据库表的字符集编码
CHARSET=utf8
不设置的话会是mysql默认的字符集编码(不支持中文!)
mysql的默认编码是Latin1,不支持中文
在my.ini中配置默认的编码
character-set-server=utf8
2.6、修改删除表
-- 修改表名: alter table 旧表名 RENAME as 新表名
ALTER TABLE student RENAME as studentD
-- 增加表的字段 ALTER TABLE 表名(student2) 添加(ADD) 字段名(age) 列属性int(11)
ALTER TABLE student2 ADD age int(11)
-- 修改表的字段 (重命名,修改约束)
-- ALTER TABLE 表名 MODIFY 字段名 列属性[]
ALTER TABLE studentd MODIFY name VARCHAR(11) -- 修改约束
-- ALTER TABLE 表名 CHANGE 旧名称 新名称 列属性[]
ALTER TABLE studentd CHANGE name name1 int(1) -- 字段重命名
-- 结论:change用来字段的重命名,不能修改字段类型和约束
-- modify不能用来字段的重命名,只能修改字段类型和约束
-- 删除表的字段 ALTER TABLE 表名 drop 字段名
ALTER TABLE studentd drop email
删除
-- 如果 存在student7 则删除
DROP TABLE IF EXISTS student7
所有创建和删除尽量加上判断,以免报错~
注意点:
- `` 字段名用这个包裹
- 注释用 -- 或者/**/
- sql 关键字大小写不敏感,建议使用小写
- 所有的符号全部用英文!
3、MySQL数据管理
3.1外键
3.2DML语言(全部记住)
数据库意义:数据存储 ,数据管理
3.3添加
-- 插入语句 (添加)
-- insert into '表名'('列名') 'VALUES('值1')
INSERT INTO `grade`(`gradename`) values('大二')
-- 由于主键自增我们可以省略(如果不写表的字段,会一一匹配)
-- 插入多个字段
insert into `index`(id,xb,age) VALUES('1111','男','20')
语法:**insert into `表名`(`字段名1`,`字段名2`,`字段名3`)VALUES('值1'),('值2'),('值3')**
注意事项:
1.字段和字段之间使用 英文逗号 隔开
2.字段是可以省略的,但是后面的值必须要对应
3.可以同事插入多条数据,values后面的值,需要使用,隔开即可 values()),(),()
3.4修改
update
-- 指定条件下,修改特定的信息 BETWEEN 2 and 3 从2-3行
UPDATE `index` set `xm`='海儿' where id=1027;
-- 不指定条件的情况下,会改动表中所有的数据
UPDATE `index` set `xm`='小海儿' ;
-- 修改多个属性 需要,逗号隔开
UPDATE `index` set `xm`='小小小海儿' ,`xb`='男',`age`='20' where id=1027;
-- 语法:
-- update 表名 set colum_name=value
语法:update 表名 set colnum_name=value,[colnum_name =value,...]where[条件]
注意:
- colnum_name 是数据库的列,尽量带上``符号
- 条件,筛选的条件,如果没有指定,则会修改所有的列
- value,是一个具体的值,也可以是一个变量
- 多个设置的属性之间,使用英文逗号隔开
3.5删除
delete 命令
语法:delete from 表名[where 条件]
-- delete命令
-- 删除数据(避免这样写,会全部删除)
DELETE FROM `student`
-- 删除指定数据
DELETE FROM `student3` WHERE id=1;
truncate 命令
作用:完全清空一个数据表,表的结构和索引约束都不会变
-- 清空student6表
TRUNCATE `student6`
4、DQL查询数据(最重点)
4.1、指定查询字段
-- 查询全部的学生 select字段from表
select * from student
-- 查询指定字段
select `StudentNo`,`StudentName` from student
-- 别名,给结果起另外一个名称 as 可以给字段起别名,也可以给表起别名
SELECT `StudentNo` as 学号,`StudentName` as 学生姓名 FROM student as s
-- 函数 concat(a,b)
SELECT CONCAT('姓名:',StudentName) as 新名字 from student
去重 distinct
作用:去除select查询出来的结果中重复的数据,重复的数据只显示一条
SELECT * from result -- 查询全部的考试成绩
select `StudentNo` from result -- 查询有哪些同学参加考试,但发现有重复数据
SELECT DISTINCT `StudentNo` FROM result -- 去重
数据库的列 (表达式)
SELECT VERSION() -- 查询系统版本 5.7.13 函数
SELECT 100*2-100 as 计算结果 -- 用于计算 (表达式)
SELECT @@auto_increment_increment -- 查询自增的步长
-- 学院考试成绩+1分查看
select `StudentNo`,`StudentResult`+1 as '加一分后结果' FROM result
数据库中的表达式:文本值,列,null,函数,计算表达式,系统变量
4.2 where条件子句
-- =============where==========================
SELECT StudentNo, `StudentResult` from result-- 查询 列属性,`列属性` from 表名
-- 查询成绩在95-100之间
SELECT StudentNo,`StudentResult` FROM result WHERE StudentResult>=80 and StudentResult<=100
-- and 和&&
SELECT StudentNo,`StudentResult` FROM result WHERE StudentResult>=80 && StudentResult<=100
-- 模糊查询(区间) BETWEEN between
SELECT StudentNo,`StudentResult` FROM result WHERE StudentResult BETWEEN 5 and 100
-- 除了1000号学生之外的同学的成绩
select StudentNo, `StudentResult` from result where
StudentNo!=1000
-- 方法二 not
select StudentNo, `StudentResult` from result where
not StudentNo =1000
模糊查询:比较运算符
运算符 | 语法 | 描述 |
---|---|---|
is null | a is null | 当操作符为null,结果为真 |
is not null | a is not null | 当操作符不为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...其中的某一个值中,结果为真 |
-- =============模糊查询========================
-- 查询姓赵的同学
-- 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('四川达州','四川宣汉')
-- 查询地址为空的的学员
SELECT `StudentNo`,`StudentName` from `student`WHERE
`address`=''or `address` is null
4.3、联表查询
join
-- ================联表查询 join===========================
-- 查询参加考试的同学 (学号,姓名,考试编号,分数)
select * from student
select * from result
/*
1.分析需求,分析查询字段来自哪些表
2.确定哪种连接查询? ------------7种
确定交叉点(这两个表中哪些数据是相同的)
判断的条件:学生表中的studentNo=成绩表中的studentNo
*/
-- jion on 判断条件 连接查询
-- where 等值查询
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
操作 | 描述 |
---|---|
inner join | 如果表中至少有一个匹配,就返回行 |
left join | 会从左表返回所有值,即使右表没有匹配 |
right join | 会从右表返回所有值,即使左表中没有匹配 |
-- 查询 参加考试同学的信息: 学号studentNo,学生姓名studentName。科目名Subjectname,分数studentResult
SELECT s.StudentNo,StudentName,r.SubjectNo,StudentResult
-- 这里曾出现问题表意不明SubjectNo因为result表 和subject表中都有SubjectNo
-- 所以这里的SubjectNo 需要指明 是sub 还是r 的表
FROM student s
RIGHT JOIN result as r
on r.StudentNo=s.StudentNo
INNER JOIN `subject` sub
on r.SubjectNo=sub.SubjectNo
自连接
父类
categoryid | categoryName |
---|---|
2 | 信息技术 |
3 | 软件开发 |
5 | 美术设计 |
子类
pid | categoryid | categoryName |
---|---|---|
3 | 4 | 数据库 |
2 | 8 | 办公信息 |
3 | 6 | web开发 |
5 | 7 | ps技术 |
操作:查询父类对应子类关系
父类 | 子类 |
---|---|
信息技术 | 办公信息 |
软件开发 | 数据库 |
软件开发 | web开发 |
美术设计 | ps技术 |
-- 查询父子信息
select c.categoryname as '父类', d.categoryname as '子类'
FROM category as c,category as d
WHERE c.categoryid=d.pid
-- 查询学院所属的年级(学号,学生的姓名,年级)
SELECT StudentNo,StudentName,GradeName
FROM student as s
INNER JOIN grade g
on s.GradeId=g.GradeId
4.4分页和排序
分页
-- 为什么要分页
-- 缓解数据库压力,给人的体验更好
-- 分页,每页显示五条数据
-- 语法: limit 当前页,页面的大小
SELECT s.`StudentNo`,`StudentName`,`SubjectName`,StudentResult
FROM student s
INNER JOIN `result` r
ON s.`StudentNo`=r.`StudentNo`
INNER JOIN `subject` sub
ON r.`subjectNo`=sub.`subjectNo`
WHERE SubjectName='数据库结构-1'
ORDER BY StudentResult ASC
LIMIT 0,4
5、mysql函数
5.1常用函数
-- 数学运算
SELECT ABS(-10) -- 绝对值
SELECT CEILING(10.2) -- 向上取整
select FLOOR(10.5)-- 向x下取整
select RAND() -- 生成0-1之间的随机数
select SIGN(100) -- 判断一个数的符号0 就是0 负数返回-1,整数为1
-- 字符串函数
select CHAR_LENGTH('海摆开摆') -- 返回字符串长度
SELECT CONCAT('海儿','还得是海儿') -- 拼接字符串
select INSERT('小小海儿',1,2,'开摆') -- 从某个位置开始替换长度
SELECT UPPER('avc') -- 小写转换大写
select LOWER('ABC') -- 大写转小写
select REPLACE('坚持就能成功','坚持','努力')-- 匹配要换的字体
-- 查询姓 赵 的同学,改成 海儿
SELECT REPLACE(StudentName,'赵','海') from student
where StudentName like '赵%'
-- 时间跟日期函数(记住)
SELECT CURRENT_DATE -- 获取今天日期
select CURDATE() -- 获取今天日期
SELECT now() -- 获取当前时间 精确分秒
SELECT LOCALTIME() -- 本地时间
-- 系统
SELECT SYSTEM_USER()
SELECT USER()
SELECT VERSION()
5.2聚合函数(常用)
函数名称 | 描述 |
---|---|
count() | 计数 |
sum() | 求和 |
avg() | 平均值 |
max() | 最大值 |
min() | 最小值 |
-- =======聚合函数=======
-- 都能够统计表中的数据
SELECT COUNT(`Email`) FROM student -- count(字段),会忽略所有的null null也会计数
SELECT COUNT(*) FROM student
SELECT COUNT(1) FROM student
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) as 最高分, min(StudentResult) as 最低分
FROM result r
INNER JOIN `subject` sub
on r.`SubjectNo`=sub.SubjectNo
GROUP BY r.`SubjectNo`
HAVING 平均分>80
5.3 数据库级别MD5加密
什么是MD5?
主要增强算法复杂度 不可逆。
MD5不可逆,具体的MD5是一样的
MD5破解原理,背后有一个字典,MD5加密后的值,加密前的值
CREATE TABLE testmd5(
`id` INT(4) not NULL,
`name` VARCHAR(20) not null,
`pwd` VARCHAR(50) not null,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 铭文密码
INSERT INTO testmd5 VALUES(1,'张三','123456'),(2,'李四','123456'),(3,'王五','123456')
-- 加密
UPDATE testmd5 set pwd=MD5(pwd) WHERE id=1
UPDATE testmd5 set pwd=MD5(pwd) WHERE id!=1
-- 插入时加密
INSERT INTO testmd5 VALUES(4,'小明',MD5('123456'))
-- 如何校验,将用户传递过来的密码,进行md5加密
SELECT * FROM testmd5 WHERE `name`='小明' and pwd=MD5('123456')
6、事务
要么都成功要么都失败
1.sql执行 A给B 转账 A1000->200 B 200
2.sql执行 B收到A转账 A800 ->B400
将一组sql放在一个批次中 去执行~
事务原则:ACID原则 原子性,一致,隔离性,持久性
原子性:要么全部完成,要么全部不完成
一致性:事务前后的数据完整性要保证一致,1000
持久性:事务一旦提交则不可逆,被持久化到数据库中!
隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所千扰,多个并发事务之间要相互隔离
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.00),('B',1000.00) -- 金额必须保留两位小数
-- 模拟转账:事务
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; -- 回滚 --navicat 需要提交事务才能看到结果
set autocommit = 1;
7、索引
mysql 官方对索引的定义为:索引是帮助mysql 高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构
索引的分类
- 主键索引(primary key)
- 主键不可重复
- 唯一索引(unique key)
- 避免重复的列出现,唯一索引可以重复,多个列都可以标识位 - 常规索引(key/inedex)
- 全文索引 FULLTEXT
-- 索引的使用
-- 1、在创建表的时候给字段增加索引
-- 2、创建完毕后增加索引
SHOW INDEX FROM student -- 显示所有的索引信息
-- 增加一个全文索引 (索引名) 列名
ALTER TABLE school.student add FULLTEXT INDEX `haibai`(`StudentName`)
-- explain 分析sql执行的状况
explain select * from student; -- 非全文索引 5列
EXPLAIN SELECT * from student where MATCH(StudentName) against('赵'); -- 全文索引
8、 权限管理和备份
8.1、用户管理
SQL可视化管理
-- 创建用户
CREATE USER haibai IDENTIFIED BY '123456'
-- 修改密码(修改当前用户密码)
SET PASSWORD = PASSWORD('123456')
-- 修改密码(修改指定用户密码)
SET PASSWORD FOR haibai = PASSWORD('123456')
-- 错位重命名 RENAME USER 原用户名 TO 新用户名
RENAME user haibai to bobohai; -- 版本不一致这里会报错 需要添加@%
-- 正确重命名
rename user'haibai'@'localhost'to'haibai2'@'localhost';
-- 用户授权 grant all privileges(全部权限)库, 表 to用户
-- all privileges 除了给别人授权 其他都能干
GRANT all PRIVILEGES on *.* to haibai2@localhost
-- 查询权限 show grants for 用户
show grants for 'haibai2'@'localhost' -- 查看指定用户的权限
show grants for 'root'@'localhost' -- 查看root用户权限
-- 撤销权限 REVOKE 权限,在哪个库,哪个表撤销,给谁撤销
REVOKE ALL PRIVILEGES ON *.* FROM haibai2@localhost
-- 删除用户
drop user haibai2@localhost
8.2、mysql备份
为什么要备份:
- 保证重要的数据不丢失
- 数据转移
mysql数据库备份方式
- 直接拷贝物理文件
- 在可视化工具上导出
- 使用命令行导出mysqldump 命令行cmd才叫命令行
-- mysqldump -hlocalhost -uroot -p123456 school student >F:/mysqlwenjian/1.sql
-- mysqldup -h主机 —u用户名 -p密码 数据库表名 >到F盘mysqlwenjian物理磁盘 重命名为1.sql
-- 导入多张表
-- mysqldup -h主机 —u用户名 -p密码 数据库表名1 表名2 表名3 >到F盘mysqlwenjian物理磁盘 重命名为1.sql
-- 导入数据库
-- mysqldump -hlocalhost -uroot -p123456 school >F:/mysqlwenjian/10.sql
-- source f:/mysqkwenjian/2.sql 导入文件
9、规范数据库设计
9.1、为什么需要设计
当数据库比较复杂的时候,就需要设计了
糟糕的数据库设计:
- 数据冗余,浪费空间
- 数据的插入和删除都会麻烦、异常【避免使用物理外键】
- 程序的性能差
良好的数据库设计:
- 节省内存空间
- 保证数据库的完整性
- 方便开发系统
软件开发中,关于数据库的设计
- 分析需求:分析业务和需要处理的数据库的需求
- 概要设计:设计关系图E-R图
设计数据库的步骤:(个人博客)
收集信息,分析需求
- 用户表(用户登录注销,用户的个人信息,写博客,创建分类)
- 分类表(文章分类,谁创建的)
- 文章表(文章的信息)
- 评论表
- 友链表(友链信息)
- 自定义表(系统信息,某个关键的字,或者一些主字段)key : value
- 说说表(发表心情.. id... content....create_time)
标识实体(把需求落地到每个字段)
标识实体 之间的关系
- 写博客:user--> blog
- 创建分类:user -> category
- 关注:user-> user
9.2三大范式
为什么需要数据规范化
- 信息重复
- 更新异常
- 插入异常
- 无法正常显示信息
- 删除异常
- 丢失有效的信息
范式
第一范式(1NF)
原子性:保证每个列不可以再分
第二范式(2NF)
前提:满足第一范式
每张表只表示一件事
第三范式(3NF)
前提:满足第一范式
前提:满足第二范式
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
规范性 和 性能的问题
关联查询的表不要超过三张
- 考虑商业化的需求和目标,(成本,用户体验!)数据库的性能更加重要
- 在规范性能的问题的时候,需要适当考虑一下规范性!
- 故意给某些表增加一些冗余的字段。(从多表查询中变为单表查询)
- 故意增加一些计算列(从大数据量降低为小数据量的查询:索引)
10、JDBC
10.1数据库驱动
驱动:声卡、显卡、数据库
10.2 JDBC
Sun公司为了简化开发人员对数据库的统一的操作,提供了一个(java操作数据库)规范,JDBC
这些规范的实现有具体的厂商去做
对于开发人员来说,我们只需要掌握JDBC的接口操作即可
10.3、第一个JDBC程序
创建测试数据库
1.创建一个普通项目
2.导入数据库驱动
步骤总结:
1、加载驱动
2、链接数据库DriverManager
3、执行sql的对象
4、获得返回的结果集
5、释放链接
//我的第一个jdbc程序
public class JdbcFirstDemo {
public static void main(String[] args) throws Exception {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.用户信息和url
String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
String username = "root";
String password="123456";
//3.链接成功,数据库对象
Connection connection = DriverManager.getConnection(url, username, password);
//4执行SQL的对象 statement
Statement statement = connection.createStatement();
//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"));
System.out.println("PASSWORD="+resultSet.getObject("PASSWORD"));
System.out.println("email="+resultSet.getObject("email"));
System.out.println("birthday="+resultSet.getObject("birthday"));
}
resultSet.close();
statement.close();
connection.close();
}
}
步骤总结:
1、加载驱动
2、连接数据库 DriverManager
3、获得执行sql的对象Statement
4、获得返回的结果集
5、释放连接
DriverManager
//DriverManager.registerDriver(new com.mysql.jdbc.Driver(0));
Class.forName("com.mysql.jdbc.Driver");//固定写法,加载驱动
Connection connection = DriverManager.getConnection(url, username, password);
//connection 代表数据库
//数据库设置自动提交
//事务提交
//事务滚回
resultSet.close();
statement.close();
connection.close();
URL
String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
//mysql --3306
//协议://主机地址:端口号/数据库名?参数1&参数2&参数3
// oralce --1521
// jdcbc:oracle:thin:@localhost:1521:sid
10.4、statement对象
jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
statement对象的executeupdate方法,用于向数据库发送增、删、改的sql语句,executeupdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发送了变化)。
statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询的结果的ResultSet对象
CRUD操作-create
使用executeUpdate(String sql)方法完成数据添加操作,示列操作:
Statement st= com.createStement();
String sql ="insert into user(...) values(...)";
int num= st.executeUpdate(sql);
if(num>0){
System.out.println("插入成功!!!");
}
CRUD操作-delete
使用executeUpdate(String sql)方法完成数据删除操作,示列操作:
Statement st= com.createStement();
String sql ="delete from user where id=1";
int num= st.executeUpdate(sql);
if(num>0){
System.out.println("删除成功"!!!");
}
CRUD操作-update
使用executeUpdate(String sql)方法完成数据修改操作,示列操作:
Statement st= com.createStement();
String sql ="update user set name='' where name='' ";
int num= st.executeUpdate(sql);
if(num>0){
System.out.println("修改成功"!!!");
}
CRUD操作-read
使用executeQuery(String sql)方法完成数据修改操作,示列操作:
Statement st= com.createStement();
String sql ="select * from user where id=1 ";
int num= st.executeUpdate(sql);
while(rs.next()){
// 根据获取列数据类型,分别调用rs的相应方法映射到java对象中
}
10.5、使用idea链接数据库
- 点击database,选择+号,再点击date source选择mysql
- 输入账号密码后点击测试链接
- 如出现时区问题:则更改下方
- 写sql语句的地方
- 修改数据时,回车后,点击DB提交
10.6 事务
狂神说mysql笔记的更多相关文章
- MySQL笔记汇总
[目录] MySQL笔记汇总 一.mysql简介 数据简介 结构化查询语言 二.mysql命令行操作 三.数据库(表)更改 表相关 字段相关 索引相关 表引擎操作 四.数据库类型 数字型 字符串型 日 ...
- 涂抹mysql笔记-数据库中的权限体系
涂抹mysql笔记-数据库中的权限体系<>能不能连接,主机名是否匹配.登陆使用的用户名和密码是否正确.mysql验证用户需要检查3项值:用户名.密码和主机来源(user.password. ...
- centos7.2下安装Mysql笔记
centos7.2下安装Mysql笔记 安装 MySQL 适用于 CentOS 7.0 或以后版本: yum install mariadb mariadb-server 适用于 CentOS 6.8 ...
- MySQL笔记(六)游标练习
23.3.1 Trigger Syntax and Examples 意义不明的几道练习,留着备用. 感觉不好写,而且难以调试..不知道以后会不会有实际的应用场景. 环境:MySQL 笔记(三)由 t ...
- mysql 笔记(一)
mysql 笔记 预留 mysql> use mysql; mysql> grant all privileges on *.* to root@'%' identified by &q ...
- 【MySQL笔记】SQL语言四大类语言
SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL. 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句,FROM子句, ...
- Mysql 笔记二
Mysql 笔记二 Mysql 笔记二 Table of Contents 1. 前言 2. Master Thread 工作方式 2.1. 主循环(loop) 2.2. 后台循(backgroup ...
- 深入浅出mysql笔记---1、mysql下载安装
深入浅出mysql笔记---1.mysql下载安装 一.总结 一句话总结: linux下rpm安装即可 1.linux的wget命令作用? 下载文件的工具:比如wget http://cn.wordp ...
- 深入浅出mysql笔记---0、序
深入浅出mysql笔记---0.序 一.总结 一句话总结: 心得:买书之前建议先找找电子书,纸质书太难带了 1.开源作用? 开源对mysql的发展至关重要 2.mysql在2002年就全面支持了事务, ...
随机推荐
- LuoguP3047 [USACO12FEB]附近的牛Nearby Cows(树形DP,容斥)
\[f[u][step] = \begin{cases} C[u] & step = 0 \\ (\sum{f[v][step - 1]}) - f[u][step - 2] \cdot (d ...
- 统计 Word 文档字数的方式
描述 欲统计某文档的字数,有两种方式. "审阅"选项卡--"校对"组--字符统计 点击左下角字数统计 审阅查看字数 此步骤较为复杂,在审阅选项卡中可以查询文档的 ...
- 分布式id生成器,雪花算法IdWorker
/** * <p>名称:IdWorker.java</p> * <p>描述:分布式自增长ID</p> * <pre> * Twitter的 ...
- flask 可插拔视图
Flask 0.7 版本引入了可插拨视图.可插拨视图基于使用类来代替函数,其灵感来自于 Django 的通用视图.可插拨视图的主要用途是用可定制的.可插拨的视图来替代部分 实现.普通的函数视图 演示代 ...
- 【Java】学习路径30-可变参数 Variable Parameter
定义一个add函数,要求其功能:传入任意数量的参数然后返回相加的结果. public class VariableParameter { public static void main(String[ ...
- React报错之Parameter 'event' implicitly has an 'any' type
正文从这开始~ 总览 当我们不在事件处理函数中为事件声明类型时,会产生"Parameter 'event' implicitly has an 'any' type"错误.为了解决 ...
- 五 工厂方法模式【Factory Method Pattern】 来自CBF4LIFE 的设计模式
女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是"造人"的工作,这个词被现代人滥用了.这个故事是说,女娲在补了天后,下到凡间一看,哇塞,风景太优美了,天空是湛 ...
- IO_对象流
对象流 对象的本质是用来组织和存储数据的,对象本身也是数据.那么,能不能将对象存储到硬盘上的文件中呢?能不能将对象通过网络传输到另一个电脑呢?我们可以通过序列化和反序列化实现. java对象的序列化和 ...
- 部署Netlify站点博客
Netlify站点部署静态博客 今天尝试把站点部署在Netlify上,因为部署在GitHub Pages上,国内访问速度太慢了,所以就尝试一下别的站点,部署成功之后发现速度还是不太行,后边继续找找原因 ...
- Python数据科学手册-前言
读Python数据科学手册 笔记 系列 数据科学 data science https://img2022.cnblogs.com/blog/2827305/202205/2827305-202205 ...