MySQL数据库

本章主要讲述sql语句中的创建,删除,查找的方法,以及java与mysql数据库的交互

目录

一、DDL

1.创建数据库并设置编码格式:

2.删除数据库

3.修改字符集

4.数据库表的基本概念

1、数据表

2、字段

3、记录

4.设计表

数据类型:

创建表语法:

二、DML

插入数据

修改数据

删除数据

三、DQL

● 基础查询

查询结果处理:

单行函数

字符函数

逻辑处理

 数学函数

日期函数

分组函数

条件查询

1、UNION 的语法如下:

2、UNION ALL 的语法如下:

排序

数量限制

分组查询

四、多表设计_关联查询

数据库设计范式

1.第一范式(确保每列保持原子性)

2. 第二范式就是要有主键,要求其他字段都依赖于主键。

3.第三范式,确保每列都和主键列直接相关,而不是间接相关,要求一个数据库表中不包含 已在其它表中包含的非主关键字信息

外键:

关联查询

五、JDBC

一、概述

二、搭建

注册JDBC驱动程序:

获得Satement执行sql语句

获得PrepareStatement执行sql语句

关闭与数据库的链接通道

三、PreparedStatement和Statement

四、结果集处理


一、DDL

数据(结构)定义语言DDL(Data Definition Language),是用于创建和修改数据库表结构的语言。 ● 常用的语句:create ,alter,drop,rename

1.创建数据库并设置编码格式:

        CREATE DATABASE [if not exists] 数据库名 [ CHARSET utf8 ]

2.删除数据库

        DROP DATABASE 数据库名 / [IF EXISTS 数据库名];

3.修改字符集

        ALTER DATABASE 数据库名 CHARSET gbk;

在对数据库进行操作时,比如删除操作时,不能只是将语句删除,然后重新运行,这样是删不掉的,要进行删除操作,就必须要执行操作语句进行删除.修改字符集的操作也是同理,如果只是将CREATE DATABASE [if not exists] 数据库名 [ CHARSET utf8 ]里面的utf8改为gbk然后运行是行不通的,必须要进行修改字符集的语句操作.

-- 创建数据库
CREATE DATABASE IF NOT EXISTS schooldb CHARSET utf8
-- 删除数据库
 DROP DATABASE IF EXISTS schooldb

-- MySQL中数据库一旦创建,名字不能修改

-- 修改数据库字符集
ALTER DATABASE schooldb CHARSET utf8

4.数据库表的基本概念

1、数据表

表(table)是数据存储的最常见和最简单的形式,是构成关系型数据库的基本元素。 表的最简单形式是由行和列组成,分别都包含着数据。 每个表都有一个表头和表体,表头定 义表名和列名 .表中的行被看作是文件中的记录,表中的列被看作是这些记录的字段。

2、字段

字段是表里的一列,用于保存每条记录的特定信息。如客户订单表的字段包括“订单 ID”、“姓名”、“客户ID”、“职务”、“上级”、“地区”、“运货商”、“国家”等。 数据表的一列包含了特定字段的全部信息。

3、记录

记录也被称为一行数据,是表里的一行数据。

4.设计表

对于具体的某一个表,在创建之前,需要确定表的下列特征:

● 表名(表信息)

● 表中的字段

● 字段的数据类型和长度

● 哪些约束

数据类型:

char(n) 长度为n的定长字符串,最大长度255个字符

varchar(n) 最大长度为n的可变长字符串

date 日期, 包含年月日

datetime 年月日 时分秒

MySQL数据库_第1张图片

decimal 数据类型(M,D) M:精度,数据的总长度; D:标度,小数点后的长度

主键: 

在一张表中代表唯一的一条记录,不能为空,不能重复

一般的,表的第一列为主键,命名为id,再有题目要求的情况下,根据题目进行修改

约束:

PRIMARY KEY 设置主键约束

NOT NULL 不能为空约束

UNIQUE 唯一性约束 检查约束 设置条件

外键约束

主键自动增长,设置为自动增长时,只能为整数类型 AUTO_INCREMENT

字段注释: comment '注释'

创建表语法:

CREATE TABLE 表名(列名 数据类型 [约束] [默认值] [ 注释],......)

CREATE TABLE student(
	number INT,
	NAME VARCHAR(6),
	gender CHAR(1),
	birthday DATE,
	phone VARCHAR(11),
	height DECIMAL(3,2),
	reg_time DATETIME
)

这是简单的表创建,没有加任何的约束和注释,主要是方便第一次了解语法

CREATE TABLE student(
	number INT PRIMARY KEY AUTO_INCREMENT COMMENT '学号主键',
	NAME VARCHAR(6) NOT NULL COMMENT '姓名',
	gender CHAR(1) COMMENT '性别',
	birthday DATE COMMENT '生日',
	phone VARCHAR(11) NOT NULL UNIQUE COMMENT '电话',
	height DECIMAL(3,2) CHECK(height<3) COMMENT '身高',
	reg_time DATETIME
)

这段代码则加了主键的约束,对其他的列也添加了约束和注释

对表的删除修改操作同对项目的操作,都需要有专门的语句进行修改

删除表 DROP TABLE [if exists]表名

修改表名 RENAME TABLE 旧表名 TO 新表名

复制表结构 CREATE TABLE 新表名 LIKE 被复制表名

-- 删除表结构
DROP TABLE student

-- 修改表名
RENAME TABLE student TO stu

-- 复制表结构
CREATE TABLE student LIKE stu

二、DML

数据操纵语言DML(Data Manipulation Language)

● 常用语句: insert,delete,updat

插入数据

方式1: INSERT INTO 表名(列1,列2……,列n) VALUES(值1,值2…..,值n);

方式2: INSERT INTO 表名 set 列名1=值1,..列名n=值n;

方式3: INSERT INTO 表名(列1,列2……,列n) VALUES(值1,值2…..,值n),(值1,值2…..,值n);

方式4:INSERT INTO 表名(列1,列2……,列n) 查询语句(查询的列数与插入列数匹配)

INSERT INTO student (NAME ,gender ,birthday,phone,height,reg_time)VALUES('詹姆斯','男','1985-2-3','15555555555',1.98,NOW())
INSERT INTO student SET NAME='科比',gender='男',birthday='1986-2-3',phone='13333333333'
INSERT INTO student(NAME,gender ,birthday,phone,height,reg_time)
		    VALUES('库里','男','1998-2-2','22222222222',1.93,NOW()),
		          ('欧文','男','1998-2-2','11111111111',1.93,NOW())
		        
INSERT INTO stu (number,NAME ,gender ,birthday,phone,height,reg_time)SELECT*FROM student

修改数据

UPDATE 表名 SET 列名 = ‘新值’WHERE 条件

-- 修改记录 注意条件
UPDATE stu SET NAME='梅西',height=1.70 WHERE number = 1

删除数据

DELETE FROM 表名 WHERE 条件

TRUNCATE TABLE 表名;清空整张表

-- 删除
DELETE FROM student WHERE number =2
INSERT INTO student (NAME ,gender ,birthday,phone,height,reg_time)VALUES('杜兰特','男','1985-12-3','15566666666',1.98,NOW())

注意:

        删除,修改后就不可恢复了,所以要注意操作,避免不必要的法麻烦

三、DQL

DQL(Data Query Language)数据查询语言查询是使用频率最高的一个操作, 可以从一个表中查询数据,也可以从多个表中查询数据。

● 基础查询

● 语法: select 查询列表 from 表名;

● 特点: 查询列表可以是:表中的字段、常量、表达式、函数

                查询的结果是一个虚拟的表格

查询结果处理:

特定列查询:select column1,column2 from table

全部列查询: select * from table

算数运算符:+ - * /

排除重复行: select distinct column1,column2 from table

查询函数:select 函数; / 例如version()

函数:类似于java中的方法,将一组逻辑语句事先在数据库中定义好,可以直接调用

分类: 单行函数:如concat、length、ifnull等

分组函数:做统计使用,又称为统计函数、聚合函数、组函数

单行函数

字符函数

length():获取参数值的字节个数

char_length()获取参数值的字符个数

concat(str1,str2,.....):拼接字符串

upper()/lower():将字符串变成大写/小写

substring(str,pos,length):截取字符串 位置从1开始

instr(str,指定字符):返回子串第一次出现的索引,如果找不到返回0

trim(str):去掉字符串前后的空格或子串,trim(指定子串 from 字符串)

lpad(str,length,填充字符):用指定的字符实现左填充将str填充为指定长度

rpad(str,length,填充字符):用指定的字符实现右填充将str填充为指定长度

replace(str,old,new):替换,替换所有的子串

-- leghth(列名) 以字节为单位
SELECT LENGTH(NAME),gender FROM student

-- CHAR_LENGTH(列名) 以字符为单位
SELECT CHAR_LENGTH(NAME),gender FROM student

-- concat(str1,str2...)链接多个字符串 as 别名
SELECT CONCAT(NAME,':',CHAR_LENGTH(NAME))AS NAME,gender FROM student

-- upper()转为大写 lower()转为小写
SELECT UPPER(NAME),LOWER(NAME)FROM student

-- substring(字符串,开始位置,截取长度) 开始位置从1开始
SELECT SUBSTRING(NAME,1,2)FROM student

-- instr(字符串,指定的字符) 返回指定字符首次出现的位置 找不到返回0
SELECT INSTR(NAME,'o')FROM student

-- trim(字符串) 默认是去掉字符串前后的空格
SELECT TRIM(NAME),NAME FROM student

-- trim(指定的字符串 from 字符串) 可以去掉前后指定的子串
SELECT TRIM('a' FROM NAME),NAME FROM student

-- 左填充 右填充到指定长度
SELECT LPAD(NAME,5,'a'),RPAD(NAME,5,'b')FROM student

-- replace(列,'old','new') 替换
SELECT REPLACE(NAME,'o','O')FROM student
逻辑处理

case when 条件 then 结果1 else 结果2 end; 可以有多个when

ifnull(被检测值,默认值)函数检测是否为null,如果为null,则返回指定的值,否则返回原本的值

if函数:if else的 效果 if(条件,结果1,结果2)

-- case when 条件 then 条件成立结果 else 不成立结果 end;
SELECT
  NAME,
  gender,
  (CASE WHEN height>=2 THEN '高个子'ELSE'正常身高'END)AS height
FROM
  student

SELECT
  NAME,
  gender,
  (CASE WHEN height>=2 THEN'A'
          WHEN height>=1.9 THEN'B'
          WHEN height>=1.8 THEN'C'
          ELSE 'D' END)AS height
FROM
  student
  
  -- ifnull(列名,'为空时的默认信息')
SELECT
  NAME,
  gender,
  IFNULL(height,'暂未录入身份信息')AS height
FROM
  student

-- if(条件,'结果1','结果2')  
SELECT
  NAME,
  gender,
  IF(height>=2,'高个子','正常')AS height
FROM
  student
 数学函数

round(数值):四舍五入

ceil(数值):向上取整,返回>=该参数的最小整数

floor(数值):向下取整,返回<=该参数的最大整数

truncate(数值,保留小数的位数):截断,小数点后截断到几位

mod(被除数,除数):取余,被除数为正,则为正;被除数为负,则为负

rand():获取随机数,返回0-1之间的小数

-- 数学函数
SELECT NAME,gender,ROUND(height),CEIL(1.1),FLOOR(1.9)FROM student

SELECT NAME,gender,TRUNCATE(height,1),height,RAND() FROM student
日期函数

now():返回当前系统日期+时间

curdate():返回当前系统日期,不包含时间

curtime():返回当前时间,不包含日期 可以获取指定的部分,年、月、日、小时、分钟、秒

YEAR(日期列),MONTH(日期列),DAY(日期列) ,HOUR(日期列) ,MINUTE(日期列) SECOND(日期列)

str_to_date(字符串格式日期,格式):将日期格式的字符转换成指定格式的日期

date_format(日期列,格式):将日期转换成字符串

datediff(big,small):返回两个日期相差的天数

-- 日期函数
-- NOW(),年月日 时分秒 系统当前时间
-- CURDATE(),年月日
-- CURTIME() 时分秒
SELECT NOW(),CURDATE(),CURTIME()FROM student

-- year(日期) 将日期格式化为年
SELECT YEAR(birthday),MONTH(birthday)FROM student

-- STR_TO_DATE('2004-3-3','%Y-%m-%d')将字符串日期 格式化为 日期类型
SELECT STR_TO_DATE('2004-3-3','%Y-%m-%d')FROM student

-- DATE FORMAT (birthday,'%Y-%m') 将日期格式化为指定的字符串
SELECT DATE_FORMAT(birthday,'%Y-%m')FROM student

-- DATEDIFE(CURDATE(),birthday) 计算两个日期之间的相差的天数
SELECT DATEDIFF(CURDATE(),birthday)FROM student

分组函数

功能:用作统计使用,又称为聚合函数或统计函数或组函数

分类:sum 求和、avg 平均值、max 最大值、min 最小值、count 计数 (非空)

1.sum,avg一般用于处理数值型max,min,count可以处理任何类型

2.以上分组函数都忽略null值

3.count函数的一般使用count(*)用作统计行数

4.和分组函数一同查询的字段要求是group by后的字

-- 分组函数 聚合函数(查询多行,返回一行) 统计函数

SELECT SUM(height) FROM student -- 求和
SELECT AVG(height) FROM student -- 平均值
SELECT MAX(height) FROM student -- 最大值
SELECT MIN(height) FROM student -- 最小值
SELECT COUNT(*) FROM student -- 统计个数

条件查询

使用WHERE 子句,将不满足条件的行过滤掉,WHERE 子句紧随 FROM 子句。

语法:select from where <条件>

比较 =, != 或<>, >, =, <=

逻辑运算

and 与 

or 或

not 非

模糊查询 LIKE :是否匹配于一个模式 一般和通配符搭配使用,可以判断字符型数值 或数值型.

通配符: % 任意多个字符

between and 两者之间,包含临界值;

in 判断某字段的值是否属于in列表中的某一项

IS NULL(为空的)或 IS NOT NULL(不为空的)

-- 条件查询
-- select * from 表名 where 条件

-- and 并且
SELECT * FROM student WHERE gender = '男'AND height>1.80

-- or 多个条件只需要满足一个即可
SELECT * FROM student WHERE gender = '男'OR height>1.80

SELECT * FROM student WHERE gender != '男'
SELECT * FROM student WHERE gender <> '女'

-- like'库%' 模糊匹配
SELECT * FROM student WHERE NAME LIKE '库%'

SELECT * FROM student WHERE height>=1.65 AND height<=1.98

-- BETWEEN 1.65 AND 1.98 两者之间
SELECT * FROM student WHERE height BETWEEN 1.65 AND 1.98

-- in(值1,值2,值n) 在给定的值中
SELECT * FROM student WHERE height IN(1.78,1.88,1.98)

SELECT * FROM student WHERE height NOT IN(1.78,1.88,1.98)

-- 查询身高为null值的数据
SELECT * FROM student WHERE height IS NULL
SELECT * FROM student WHERE height IS NOT NULL
1、UNION 的语法如下:

[SQL 语句 1] UNION [SQL 语句 2]

2、UNION ALL 的语法如下:

[SQL 语句 1] UNION ALL [SQL 语句 2]

当使用union 时,mysql 会把结果集中重复的记录删掉,而使用union all , mysql 会把所有的记录返回,且效率高于union

-- union 将多个查询结果合并,合并时,列数必须一致,去除重复数据
SELECT * FROM student WHERE gender='男'
UNION
SELECT * FROM student WHERE gender='女'

-- union all 只是将查询的多个结果合并,不会去除重复数据
SELECT * FROM student WHERE gender='男'
UNION ALL
SELECT * FROM student WHERE gender='女'
排序

查询结果排序,使用 ORDER BY 子句排序 order by 排序列 ASC/DESC

asc代表的是升序,desc代表的是降序,如果不写,默认是升序

order by子句中可以支持单个字段、多个字段

-- 排序 order by 列 asc(升序) desc(降序)
SELECT * FROM student WHERE number>0 ORDER BY number ASC

SELECT * FROM student WHERE number>0 ORDER BY number DESC

SELECT * FROM student WHERE number>0 ORDER BY height ASC

SELECT * FROM student WHERE number>0 ORDER BY reg_time DESC
数量限制

limit子句:对查询的显示结果限制数目 (sql语句最末尾位置)

SELECT * FROM table LIMIT offset rows;

SELECT * from table LIMIT 0,5

-- 数量限制 实现分页查询 limit 开始位置,每次查询数量
SELECT * FROM student WHERE number>0 ORDER BY number ASC LIMIT 0,3

SELECT * FROM student WHERE number>0 ORDER BY number ASC LIMIT 3,3

SELECT * FROM student WHERE number>0 ORDER BY number ASC LIMIT 6,3

分组查询

语法:

select 分组函数,列(要求出现在group by的后面)

from 表

[where 筛选条件]

group by 分组的列表

[having 分组后的筛选]

[order by 子句]

注意:查询列表比较特殊,要求是分组函数和group by后出现的字段

MySQL数据库_第2张图片

-- 分组查询
-- 分组--在一些统计场景中,按照某一个条件进行区分(分组)
-- 统计时,按照性别,班级,年级,部门,年份,月份
-- 把满足某个条件的数据,分到同一个组中,每个组单独进行处理

-- 查询 男生,女生各有多少人 每个年级各有多少人 每个部门各有多少人
-- 分组统计 男生组统计一次次,女生组统计一次
SELECT COUNT(*),gender FROM student GROUP BY gender

SELECT COUNT(*),DATE_FORMAT(reg_time,'%Y-%m')FROM student GROUP BY DATE_FORMAT(reg_time,'%Y-%m')

-- 统计男生女生各多少人
SELECT COUNT(*),gender FROM student GROUP BY gender

-- 男生和女生谁的人数大于2
-- HAVING COUNT(*)>2 having 条件 是对分组后的结果进行条件筛选
SELECT COUNT(*),gender FROM student GROUP BY gender HAVING COUNT(*)>2

-- 作业 请取出student表中日期(reg_time字段)为当天的所有记录
SELECT *
FROM student
WHERE DATE_FORMAT(reg_time,'%Y-%m-%d') = CURDATE();

-- 作业 使用sql查询出学生表哪些学生的姓名重复了
SELECT COUNT(*),NAME FROM student GROUP BY NAME HAVING COUNT(*)>1


四、多表设计_关联查询

数据库设计范式

1.第一范式(确保每列保持原子性)

        第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就 说明该数据库表满足了第一范式。

2. 第二范式就是要有主键,要求其他字段都依赖于主键。

        没有主键就没有唯一性,没有唯一性在集合中就定位不到这行记录,所以要主键。 • 其他字段为什么要依赖于主键?因为不依赖于主键,就找不到他们。更重要的是,

        其他字段组成的这行记录和主键表示的是同一个东西,而主键是唯一的,它们只需要依 赖于主键,也就成了唯一的

3.第三范式,确保每列都和主键列直接相关,而不是间接相关,要求一个数据库表中不包含 已在其它表中包含的非主关键字信息

外键:

引用另外一个数据表的某条记录。

外键列类型与主键列类型保持一致

数据表之间的关联/引用关系是依靠具体的主键(primary key)和外键

(foreign key)建立起来的。

create table student(

id int not null auto_increment primary key,

num int,

name varchar(10)

majorid int,

CONSTRAINT 约束名 foreign key(majorid ) references major(id) );

约束名规则:

例:FK_ForeignTable_PrimaryTable_On_ForeignColumn

1、当主表中没有对应的记录时,不能将记录添加到从表

2、不能更改主表中的值而导致从表中的记录孤立

3、从表存在与主表对应的记录,不能从主表中删除该行

4、删除主表前,先删从表

DROP TABLE stu

CREATE TABLE major(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20)
)

-- 修改表 为表添加一个列 一对多 多对一
ALTER TABLE student ADD majorid INT 

-- 外键 在一个表中外键是用来与另一个表的主键关联的
-- 主键 不能为空 唯一 检查 
-- 外键有两种情况:
-- 1.不加外键约束
--	可以任意的对表数据进行操作,即使两个表中的数据对应不上也没有关系
-- 2.添加外键约束
-- 添加外键约束后,两张表操作时,不能导致外键列和主键列对应关系不成立
ALTER TABLE student ADD CONSTRAINT fk_student_major_majorid FOREIGN KEY(majorid)REFERENCES major(id)

-- 删除外键约束
ALTER TABLE student DROP FOREIGN KEY fk_student_major_majorid

-- 学生选课 一个学生至少选择两个课程
-- 课程信息表 多对多关系

CREATE TABLE course(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20)
)


-- 添加一个学生选课表 学生和课程关系表 放一个学生学号外键,放一个课程外键
CREATE TABLE student_course(
	stunumber INT,
	courseid INT
)

ALTER TABLE student_course ADD CONSTRAINT fk_student_course_stunumber FOREIGN KEY(stunumber)REFERENCES student(number)
ALTER TABLE student_course ADD CONSTRAINT fk_student_course_courseid FOREIGN KEY(courseid)REFERENCES course(id)

关联查询

含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询

笛卡尔乘积现象:表1有m行,表2有n行,结果=m*n

发生原因:没有有效的连接条件

如何避免:添加有效的连接条件

按功能分类:

内连接

外连接

左外连接

右外连接

子查询

含义:出现在其他语句中的select语句,称为子查询或内查询;外部的查询语句,称为主查询或 外查询.

分类:

按子查询出现的位置:

from后面:支持表子查询

where:支持标量子查询,列子查询

按功能、结果集的行列数不同:

标量子查询(结果集只有一行一列)

列子查询(结果集只有一列多行)

表子查询(结果集一般为多行多列)

-- 关联查询 多表关联在一起查询
-- 学号,姓名,性别,电话,专业名称	-- 信息来自于两张表中

-- 关联时没有任何的限制,会产生笛卡尔乘积现象,这是我们不想要的结果
SELECT * FROM student,major

-- 关联查询 内关联 左外关联 右外关联

-- select number,name,gender,phone,name from inner join major on majorid=id

SELECT
  s.number,s.name,s.gender,s.phone,m.name mnane
FROM student s
  INNER JOIN major m ON s.majorid = m.id -- 把满足条件关联在一起
  
SELECT
   s.number,s.name,s.gender,s.phone,m.name mnane
FROM student s,major m
WHERE s.majorid=m.id -- 先产生一个笛卡尔乘积 然后再条件筛选

-- 左外连接 特点 即使不满足连接条件,也会把左边表中的所有数据查询出来
SELECT 
s.number,s.name,s.gender,s.phone,m.name mnane
FROM
student s LEFT JOIN major m ON s.majorid=m.id

-- 右外连接 即使不满足连接条件,也会把右边表中的所有数据查询出来
SELECT 
s.number,s.name,s.gender,s.phone,m.name mnane
FROM
student s RIGHT JOIN major m ON s.majorid=m.id

SELECT 
COUNT(number),
FROM
student s RIGHT JOIN major m ON s.majorid=m.id
GROUP BY m.name

-- 查询学生,以及学生选择了哪些课程(课程名称)
-- 多对多关联查询时,分组合并 GROUP_CONCAT(c.name) cname 在多对多情况下,可以将同一组中
SELECT 
s.number,
s.name,
m.name mname,
GROUP_CONCAT(c.name) cname
FROM
	student s LEFT JOIN student_course sc ON s.number=sc.stunumber
	LEFT JOIN course c ON sc.courseid=c.id
	LEFT JOIN major m ON s.majorid=m.id
GROUP BY s.number,s.name,m.name

-- 查询身高最高的学生 最高身高不知道,不知道可以通过sql进行查询
SELECT * FROM student WHERE height = (SELECT MAX(height) FROM student)

-- 男生和女生谁的人数大于2,首先统计出男生各自的人数
-- 在from后面 是用来表子查询(多行多列),把子查询的结果当做另一个表的数据来源
SELECT * FROM(SELECT COUNT(*) c,gender FROM student GROUP BY gender) t
	WHERE t.c>2

-- 在where后面使用标量子查询(一行一列)
SELECT * FROM student WHERE height = (SELECT MAX(height) FROM student)

-- 在where后面使用列子查询(一列多行)
SELECT * FROM student WHERE height IN(SELECT height FROM student WHERE height IN(1.80,1.90))

五、JDBC

一、概述

● JDBC(Java DataBase Connectivity)java数据库连接

● 是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问, 它由一组用Java语言编写的类和接口组成。

● 有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库

JDBC API: 供程序员调用的接口与类,集成在java.sql包中

DriverManager类作用:管理各种不同的jDBC驱动

Connection 接口 与特定数据库的连接

Statement 接口 执行sql

PreparedStatement接口 执行sql

ResultSet接口 接收查询结

java只有接口,里面的方法都是数据库进行重新的,所以要将数据库重写的方法调用在java中

例:在java中调用mysql数据库

在目标项目里新建一个Directory包,在里面添加java,mysql的连接方法

然后启用此方法即可

二、搭建

注册JDBC驱动程序:

●这需要初始化驱动程序,这样就可以打开与数据库的通信信道。 Class.forName(“com.mysql.cj.jdbc.Driver”); //反射实现

或者

DriverManager.registerDriver(new Driver())

package com.ffyc.jdbcpro;

import com.mysql.cj.jdbc.Driver;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Demo1 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //注册驱动
        //Class.forName("com.mysql.cj.jdbc.Driver");//反射方式加载驱动类
        DriverManager.registerDriver(new Driver());

        //建立数据库的连接
        String url="jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";
        String user="root";
        String password="root";//写自己的密码
        Connection connection= DriverManager.getConnection(url, user, password);
        System.out.println(connection);

        //发送sql
        Statement statement= connection.createStatement();
        statement.executeUpdate("insert into major(name)value('数学')");

        //关闭数据库的连接
        statement.close();
        connection.close();
    }
}

获得Satement执行sql语句

Statement st = connection.createStatement();

Satement中的方法:

Int executeUpdate(String sql) 用于执行ddl语句和dml(增,删,改)语句 返回 操作的行数

用于执行ddl语句返回0

用于执行dml语句返回操作的行数

ResultSet executeQuery(String sql); 用于执行查询语句 返回一个

ResultSet 集合

package com.ffyc.jdbcpro;

import com.mysql.cj.jdbc.Driver;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Demo2 {
    public static void main(String[] args) throws SQLException {
        Demo2.insert("李明", "女", "2004-5-5", "12563258965", 1.55);
        Demo2.update(4, "李宏杰", "女", "2004-5-5", "15532659852", 1.55);
        Demo2.delete(9);
    }

    public static void insert(String name, String gender, String birthday, String phone, double height) throws SQLException {
        //注册驱动
        DriverManager.registerDriver(new Driver());
        String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";
        String user = "root";
        String password = "root";//写自己的密码
        //建立与数据库的连接
        Connection connection = DriverManager.getConnection(url, user, password);
        //发送sql
        Statement statement = connection.createStatement();
        statement.executeUpdate("insert into student(name,gender,birthday,phone,height)value('" + name + "','" + gender + "','" + birthday + "','" + phone + "','" + height + "')");
        //关闭与数据库的连接
        statement.close();
        connection.close();
    }

    public static void update(int number, String name, String gender, String birthday, String phone, double height) throws SQLException {
        //注册驱动
        DriverManager.registerDriver(new Driver());
        String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";
        String user = "root";
        String password = "root";//写自己的密码
        //建立与数据库的连接
        Connection connection = DriverManager.getConnection(url, user, password);
        //发送sql
        Statement statement = connection.createStatement();
        statement.executeUpdate("update student set name= '" + name + "',gender='" + gender + "',birthday='" + birthday + "',phone='" + phone + "',height=" + height + "where number=" + number);
        //关闭与数据库的连接
        statement.close();
        connection.close();
    }

    public static void delete(int number) throws SQLException {
        //注册驱动
        DriverManager.registerDriver(new Driver());
        String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";
        String user = "root";
        String password = "root";//写自己的密码
        //建立与数据库的连接
        Connection connection = DriverManager.getConnection(url, user, password);
        //发送sql
        Statement statement = connection.createStatement();
        statement.executeUpdate("delete from student where number =" + number);//直接将number拼接到sql中
        //关闭与数据库的连接
        statement.close();
        connection.close();
    }
}

获得PrepareStatement执行sql语句

在sql语句中参数位置使用占位符,使用setXX方法向sql中设置参数

PrepareStatement ps = connection.prepareStatement(sql);

PrepareStatement中的方法:

Int executeUpdate() 用于执行ddl语句和dml(增,删,改)语句 返回操作的行数

用于执行ddl语句返回0

用于执行dml语句返回操作的行数

ResultSet executeQuery(); 用于执行查询语句 返回一个ResultSet 集合

package com.ffyc.jdbcpro;

import com.mysql.cj.jdbc.Driver;

import java.sql.*;

public class Demo3 {
    public static void main(String[] args) throws SQLException {
        //注册驱动
        //Class.forName("com.mysql.cj.jdbc.Driver");//反射方式加载驱动类
        DriverManager.registerDriver(new Driver());

        //建立数据库的连接
        String url="jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";
        String user="root";
        String password="root";//写自己的密码
        Connection connection= DriverManager.getConnection(url, user, password);
        System.out.println(connection);

        //发送sql
        PreparedStatement ps=connection.prepareStatement("insert into major(name)value(?)");//?占位符 表示要插入一个参数
        ps.setObject(1,"智能");//1向第一个占位符的位置插入数据
        ps.executeUpdate();

        //关闭数据库的连接
        connection.close();
    }
}

关闭与数据库的链接通道

每次操作完成后关闭所有与数据库交互的通道

st.close();

rs.close();

conn.close();

三、PreparedStatement和Statement

基于以下的原因:

1、代码的可读性和可维护性.

虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无 论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:

stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"' , '"+var2+"' , "+var3+" , '"+var4+"')");

perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");

perstmt.setString(1,var1);

perstmt.setString(2,var2);

perstmt.setString(3,var3);

perstmt.setString(4,var4);

perstmt.executeUpdate(); //prestmt是 PreparedStatement 对象实例

2、最重要的一点是极大地提高了安全性.

防止sql注入

Stringsql= “ delete from user where id = ”+num;

如果我们把[or 1=1]作为id传入进来?

delete from tb_name where id = 1 or 1 = 1;

因为‘1’ = ‘1’肯定成立

而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹 配的关系.

预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句

四、结果集处理

PreparedStatement和Statement中的executeQuery()方法中会返回一 个ResultSet对象,查询结果就封装在此对象中.

使用ResultSet中的next()方法获得下一行数据

使用getXXX(String name)方法获

package com.ffyc.jdbcpro;

import com.mysql.cj.jdbc.Driver;

import java.sql.*;

public class Demo4 {
    public static void main(String[] args) throws SQLException {
        Demo4.insert("李明", "女", "2004-5-5", "12563258965", 1.55);
        Demo4.update(4, "李宏杰", "女", "2004-5-5", "15532659852", 1.55);
        Demo4.delete(11);
    }

    public static void insert(String name, String gender, String birthday, String phone, double height) throws SQLException {
        //注册驱动
        DriverManager.registerDriver(new Driver());
        String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";
        String user = "root";
        String password = "root";//写自己的密码
        //建立与数据库的连接
        Connection connection = DriverManager.getConnection(url, user, password);
        //发送sql
        PreparedStatement ps=connection.prepareStatement("insert into student(name,gender,birthday,phone,height)value(?,?,?,?,?)");
        ps.setObject(1,name);
        ps.setObject(2,gender);
        ps.setObject(3,birthday);
        ps.setObject(4,phone);
        ps.setObject(5,height);
        ps.executeUpdate();
        //关闭与数据库的连接
        ps.close();
        connection.close();
    }

    public static void update(int number, String name, String gender, String birthday, String phone, double height) throws SQLException {
        //注册驱动
        DriverManager.registerDriver(new Driver());
        String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";
        String user = "root";
        String password = "root";//写自己的密码
        //建立与数据库的连接
        Connection connection = DriverManager.getConnection(url, user, password);
        //发送sql
        PreparedStatement ps=connection.prepareStatement("update student set name=?,gender?,birthday=?,phone=?,height=? where number=?");
        ps.setObject(1,name);
        ps.setObject(2,gender);
        ps.setObject(3,birthday);
        ps.setObject(4,phone);
        ps.setObject(5,height);
        ps.setObject(6,number);
        ps.executeUpdate();
        //关闭与数据库的连接
        ps.close();
        connection.close();
    }

    public static void delete(int number) throws SQLException {
        //注册驱动
        DriverManager.registerDriver(new Driver());
        String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";
        String user = "root";
        String password = "root";//写自己的密码
        //建立与数据库的连接
        Connection connection = DriverManager.getConnection(url, user, password);
        //发送sql
        PreparedStatement ps =connection.prepareStatement("delete from student where number=?");//封装sql
        ps.setObject(1,number);//向sql传参 向占位符传参时,进行验证,防止sql受攻击
        ps.executeUpdate();//执行sql
        //关闭与数据库的连接
        connection.close();
    }
}

你可能感兴趣的:(数据库,mysql,oracle)