likes
comments
collection
share

数据库和jdbc

作者站长头像
站长
· 阅读数 18

 MYSQl

数据库三层结构

  1. 所谓安装Mysql数据库,就是在主机安装一个数据库管理系统(DBMS),这个管理程序可以管理多个数据库。DBMS(database manage system)
  2. 一个数据库中可以创建多个表,以保存数据(信息)。
  3. 数据库管理系统(DBMS)、数据库和表的关系如图所示:示意图

数据库和jdbc

数据在数据库中的存储方式

数据库和jdbc

SQL 语句分类

  • DDL:数据定义语句[create表,库…]
  • DML:数据操作语句[增加insert,修改update,删除delete]DQL:数据查询语句[select]
  • DCL:数据控制语句[管理数据库:比如用户权限grant revoke]

创建数据库

数据库和jdbc

  1. CHARACTER SET:指定数据库采用的字符集,如果不指定字符集,默认utf8utf8 general ci[不区分大小写]注意默认是utf8_general_ci)
  2. COLLATE:指定数据库字符集的校对规则(常用的utf8_bin[区分大小写]

查看、删除数据库

数据库和jdbc

备份恢复数据库

数据库和jdbc

备份恢复数据库的表

数据库和jdbc

创建表

数据库和jdbc

Mysql 常用数据类型(列类型)

数据库和jdbc

数值型(整数)的基本使用

使用范围:在能够满足需求的情况下,尽量选择空间小的

数据库和jdbc

如何定义一个无符号的整数

create table t10(id tinyint);//默认是有符号的

create table t11 (id tinyint unsigned);无符号的

数值型(bit)的使用

1.基本使用

mysql>create table t05(id int,num bit(8)); 

mysql>insert into t05 (1,3); 

mysql>insert into t05 values(2,65);

2.细节说明

bit字段显示时,按照位的方式显示.

查询的时候仍然可以用使用添加的数值如果一个值只有0,1可以考虑使用bit(1),可以节约空间位类型。

M指定位数,默认值1,范围1-64使用不多.

数值型(小数)的基本使用

数据库和jdbc

字符串的基本使用

数据库和jdbc

字符串使用细节

细节1

char(4)//这个4表示字符数(最大255),不是字节数,不管是中文还是字母都是放四个,按字符计算.

varchar(4)//这个4表示字符数,不管是字母还是中文都以定义好的表的编码来存放数据

不管是中文还是英文字母,都是最多存放4个,是按照字符来存放的.

细节2

char(4)是定长(固定的大小),就是说,即使你插入’aa’也会占用分配的4个字符的空间.

varchar(4)是变长(变化的大小),就是说,如果你插入了'aa’,实际占用空间大小并不是4个字符,而是按照实际占用空间来分配

(说明:varchar本身还需要占用1-3个字节来记录存放内容长度) L(实际数据大小)+(1-3)字节

细节3

什么时候使用char,什么时候使用varchar

1.如果数据是定长,推荐使用char,比如md5的密码,邮编,手机号,身份证号码等. char(32)

2.如果一个字段的长度是不确定,我们使用varchar,比如留言,文章查询速度char>varchar

细节4

数据库和jdbc

日期类型的基本使用

数据库和jdbc

数据库和jdbc  修改表

数据库和jdbc

数据库 C[create]R[read]U[update]D[delete]

Insert 语句

数据库和jdbc

 细节说明

  1. 插入的数据应与字段的数据类型相同。
  2. 数据的长度应在列的规定范围内,例如:不能将一个长度为 80 的字符串加入
  3. 在 values 中列出的数据位置必须与被加入的列的排列位置相对应
  4. 字符和日期型数据应包含在单引号中。
  5. 列可以插入空值[前提是该字段允许为空],insert into table value(null)
  6. insert into tab_name (列名..) values (),(),() 形式添加多条记录
  7. 如果是给表中的所有字段添加数据,可以不写前面的字段名称
  8. 默认值的使用,当不给某个字段值时,如果有默认值就会添加默认值,否则报错

update 语句

数据库和jdbc

使用细节:

1. UPDATE语法可以用新值更新原有表行中的各列。

2. SET子句指示要修改哪些列和要给予哪些值。

3. WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行(记录),因此提醒一定小心。

4.如果需要修改多个字段,可以通过set字段1=值1,字段2=值2....

delete 语句

数据库和jdbc

使用细节

  1. 如果不使用where子句,将删除表中所有数据。
  2. Delete语句不能删除某一列的值(可使用update设为null或者")
  3. 使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。drop table 表名;

select 语句

数据库和jdbc

注意事项

  1. Select指定查询哪些列的数据。
  2. column指定列名。
  3. *号代表查询所有列。
  4. From指定查询哪张表。
  5. DISTINCT可选,指显示结果时,是否去掉重复数据

使用表达式对查询的列进行运算

数据库和jdbc

在 select 语句中可使用 as 语句

数据库和jdbc

在 where 子句中经常使用的运算符

数据库和jdbc

使用 order by 子句排序查询结果

数据库和jdbc

SQL语言:DDL、DML、DQL、DCL详解

DDL数据定义语言全称是Data Definition Language

定义语言就是定义关系模式、删除关系、修改关系模式以及创建数据库中的各种对象,

比如表、聚簇、索引、视图、函数、存储过程和触发器等等。

数据定义语言是由SQL语言集中负责数据结构定义与数据库对象定义的语言,

并且由CREATE、ALTER、DROP和TRUNCATE(截断)四个语法组成

DML数据操纵语言全称是Data Manipulation Language,

主要是进行插入元组、删除元组、修改元组的操作。

主要有insert、update、delete语法组成。

DQL数据查询语言全称是Data Query Language,

所以是用来进行数据库中数据的查询的,即最常用的select语句

DCL数据控制语言全称:Data Control Language。

用来授权或回收访问数据库的某种特权,

并控制数据库操纵事务发生的时间及效果,能够对数据库进行监视。

比如常见的授权、取消授权、回滚、提交等等操作

MySQL

合计/统计函数

count

数据库和jdbc

-- count(*) 和 count(列) 的区别 -- 解释 :coun

t(*) 返回满足条件的记录的行数

-- count(列): 统计满足条件的某列有多少个,但是会排除 为 null 的情况

sum

数据库和jdbc

avg

数据库和jdbc

max/min

数据库和jdbc

使用 group by 子句对列进行分组

数据库和jdbc

使用 having 子句对分组后的结果进行过滤

数据库和jdbc

字符串相关函数

数据库和jdbc

TRIM(string) -- 去除前端空格和后端空格

数学相关函数

数据库和jdbc

时间日期相关函数

数据库和jdbc

上面函数的细节说明

  1. DATE ADD()中的 interval后面可以是 year minute second day 等
  2. DATE SUB()中的 interval 后面可以是 year minute second hour day 等
  3. DATEDIFF(date1,date2)得到的是天数,而且是date1-date2的天数,因此可以取负数
  4. 这四个函数的日期类型可以是date,datetime或者 timestamp

加密和系统函数

数据库和jdbc

流程控制函数

数据库和jdbc

mysql 表查询--加强

如何使用 like 操作符(模糊) -- %: 表示 0 到多个任意字符 _: 表示单个任意

--? 如何显示首字符为 S 的员工姓名和工资

SELECT ename, sal FROM emp

WHERE ename LIKE 'S%'

--? 如何显示第三个字符为大写 O 的所有员工的姓名和工资

SELECT ename, sal FROM emp

WHERE ename LIKE '__O%

 -- 如何显示没有上级的雇员的情况

SELECT * FROM emp

WHERE mgr IS NULL;

-- 查询表结构

DESC emp

-- 使用 order by 子句

-- ?如何按照工资的从低到高的顺序[升序],显示雇员的信息

SELECT * FROM emp

ORDER BY sal

 --? 按照部门号升序而雇员的工资降序排列 , 显示雇员信息

SELECT * FROM emp

ORDER BY deptno ASC sal DES

分页查询

基本语法: select .. limit start, rows

表示从start+1行开始取,取出rows行,start从0开始计算

数据库和jdbc

数据分组的总结

如果select语句同时包含有group by ,having,limit  order by 

那么他们的顺序是group by, having, orderby, limit

mysql 多表查询

多表查询的条件不能小于 表的个数-1 否则就会出现笛卡尔积

自连接

自连接的特点

  1. 把同一张表当做两张表使用
  2. 需要给表取别名 表名 表别名
  3. 列名不明确,可以指定列的别名 列名 as 列的别

mysql 表子查询

  1. 子查询是指嵌入在其它 sql 语句中的 select 语句,也叫嵌套查询
  2. 单行子查询是指只返回一行数据的子查询语句

多行子查询

  1. 多行子查询指返回多行数据的子查询in 使用关键字
  2. 子查询当做临时表使用
  3. 在多行子查询中使用 all 操作符    所有的都要满足
  4. 在多行子查询中使用 any 操作符  任意一个满足

多列子查询

多列子查序则是指查询返回多个列数据的子查询语句

在 from 子句中使用子查询

SELECT ename, sal, temp.max_sal, emp.deptno

FROM emp, (SELECT deptno, MAX (sal) AS mescal

FROM emp GROUP BY deptno ) temp

WHERE emp. deptno = temp. deptno AND emp.sal = temp.max

还有一种写法 表.* 表示将该表所有列都显示出来, 可以简化 sql 语句 -- 在多表查询中,当多个表的列不重复时,才可以直接写列名

SELECT tmp. *, dname, loc

FROM dept, (   

SELECT COUNT (*) AS per_num, deptno FROM emp GROUP BY deptno

 ) tmp

WHERE tmp. deptno = dept. deptno

表复制

自我复制数据(蠕虫复制)

有时,为了对某个sql语句进行效率测试,我们需要海量数据时,可以使用此法为表创建海量数据。

- 演示如何自我复制

1. 先把 emp 表的记录复制到 my_tab01

INSERT INTO my_tab01

(Id, `name`, sal, job, deptno)

SELECT empno, ename, sal, job, deptno FROM emp;

-- 2. 自我复制

INSERT INTO my_tab01

SELECT * FROM my_tab01;

SELECT COUNT(*) FROM my_tab01;

合并查询

union all

该操作符用于取得两个结果集的并集。当使用该操作符时,不会取消重复行。

select ename,sal,job

from emp where sal>2500

union all

select ename,sal,job

from emp where job='MANAGER';

union

该操作赋与union all相似,但是会自动去掉结果集中重复行

select ename, sal,job

from emp where   sal>2500

union

select ename, sal, job

from emp where  job='manager';

mysql 表外连接

外连接

1.左外连接(如果左侧的表完全显示我们就说是左外连接)

2.右外连接(如果右侧的表完全显示我们就说是右外连接)

3.使用左连接(显示所有人的成绩,如果没有成绩,也要显示该人的姓名和id号,成绩显示为空)

select.from表1 left  join表2 on条件   [表1:就是左表表2:就是右表]

4.使用右外连接(显示所有成绩,如果没有名字匹配,显示空)

select . from 表1 right  join 表2 on条件[表1:就是左表表2:就是右表]

mysql 约束

基本介绍

约束用于确保数据库的数据满足特定的商业规则。在mysql中,约束包括:

not null、 unique,primary key,foreign key,和check 五种.

primary key(主键)-基本使用

数据库和jdbc

primary key(主键)-细节说明

1.  primary key能重复而且能null。

2. 一张表最多只能有一个主键,但可以是复合主键

3. 主键的指定方式有两种

  1. 直接在字段名后指定:字段名primakry key
  2. 在表定义最后写 primary key(列名);

4. 使desc表,可以看到primary key的情况.

5. 提醒:在实际开发中,每个表往往都会设计一个主键

not null(非空)

数据库和jdbc

unique(唯一)

数据库和jdbc

 unique 细节(注意):

  1. 如果没有指定 not null,则 unique 字段可以有多个null
  2. 一张表可以有多个unique字段

foreign key(外键)

用于定义主表和从表之间的关系:

外键约束要定义在从表上,主表则必须具有主键约束或是unique约束.,

当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为null

数据库和jdbc

foreign key(外键)一细节说明

  1. 外键指向的表的字段,要求是primary key或者是unique
  2. 表的类型是innodb,这样的表才支持外键
  3. 外键字段的类型要和主键字段的类型一致(长度可以不同)
  4. 外键字段的值,必须在主键字段中出现过,或者为null[前提是外键字段允许为null]
  5. 一旦建立主外键的关系,数据不能随意删除了

check

用于强制行数据必须满足的条件,假定在sal列上定义了check约束,并要求sal列值在1000~2000之间如果不再1000~2000之间就会提示出错。

提示: oracle 和 sql server均支持check,但是mysql5.7目前还不支持check,只做语法校验,但不会生效。check.sql在mysql中

实现check的功能,一般是在程序中控制或者通过触发器完成。

数据库和jdbc

自增长

数据库和jdbc

数据库和jdbc

1. 一般来说自增长是和primary key配合使用的

2. 自增长也可以单独使用[但是需要配合一个unique]

3. 自增长修饰的字段为整数型的(虽然小数也可以但是非常非常少这样使用)

4. 自增长默认从1开始,你也可以通过如下命令修改alter  table表名 auto_increment =新的始值;

5. 如果你添加数据时,给自增长字段(列)指定的有值,则以指定的值为准,如果指定了自增长,一般来说,就按照自增长的规则来添加数据

mysql 索引

索引的原理

没有索引为什么会慢?因为全表扫描

使用索引为什么会快?形成一个索引的数据结构,比如二叉树索

引的代价

  1. 磁盘占用
  2. 对dml(update delete insert)语句的效率影响

在我们项目一般是中,select多 (update,delete,insert)少

索引的类型

  1. 主键索引,主键自动的为主索引用(类型Primary key)
  2. 唯一索引(UNIQUE)
  3. 普通索引(INDEX)
  4. 文索引(FULLTEXT)[适用于MyISAM]

一般开发,不使用mysql自带的全文索引,而是使用:全文搜索Solr和 ElasticSearch(ES)

数据库和jdbc

索引使用

添加索引

  1. create [UNIQUE] index  index_name  on  tbl_name (col_name [(length)][ASC | DESC],...);
  2. alter table  table_name  ADD  INDEX  [index name] (index col name,.)
  3. 添加主键(索引)

ALTER TABLE表名ADD PRIMARY KEY(列名,.);

删除索引

  1. DROP INDEX  index_name  ON  tbl_name;
  2. alter table  table_name  drop index  index_name;
  3. 删除主索引比较特别:

 alter table  t_b  drop  primary key;

  1. 查询索引(三种方式)
  2. show  index(es)  from  table_name;
  3. show  keys  from  table_name;
  4. desc  table_Name;

小结

较频繁的作为查询条件字段应该创建索引

select * from emp where empno = 1

唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件

select * from emp where sex = '男

更新非常频繁的字段不适合创建索引

select * from emp where logincount = 1

不会出现在WHERE子句中字段不该创建索引

mysql 事务

什么是事务

数据库和jdbc

事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。如:转账就要用事务来处理,用以保证数据的一致性。

事务和锁

当执行事务操作时(dml语句),mysql会在表上加锁,防止其它用户改表的数据.这对用户来讲是非常重要的

mysql 数据库控制台事务的几个重要操作

  1. start transaction -开始一个事务
  2. savepoint保存点名-设置存点
  3. rollback to保存点名-回退事务
  4. rollback-回退全部事务
  5. commit-提交事务,所有的操作生效,不能回退

回退事务

在介绍回退事务前,先介绍一下保存点(savepoint).

保存点是事务中的点.用于取消部分事务,当结束事务时(commit),

会自动的删除该事务所定义的所有保存点当执行回退事务时,通过指定保存点可以回退到指定的点

提交事务

使用commit语句可以提交事务.当执行了commit语句子后,会确认事务的变化、结束事务、删除保存点、释放锁,数据生效。

当使用commit语句结束事务子后,其它会话[其他连接]将可以查看到事务变化后的新数据[所有数据就正式生效.]

事务细节讨论

  1. 如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚
  2. 如果开始一个事务,你没有创建保存点.你可以执行rollback,默认就是回退到你事务开始的状态
  3. 你也可以在这个事务中(还没有提交时),创建多个保存点.比如:savepoint aaa;执行 dml, savepoint bbb;
  4. 你可以在事务没有提交前,选择回退到哪个保存点
  5. mysql的事务机制需要innodb的存储引擎才可以使用,myisam不好使.
  6. 开始一个事务 start transaction, set autocommit=off;

mysql 事务隔离级别

事务隔离级别介绍

多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性。(通俗解释)

如果不考虑隔离性,可能会引发如下问题:

  • 脏读
  • 不可重复读
  • 幻读

查看事务隔离级别

  1. 脏读(dirty read):当一个事务读取另一个事务尚未提交的改变(update,insert,delete)时,产生脏读
  2. 不可重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读
  3. 幻读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读

事务隔离级别

数据库和jdbc

设置事务隔离级别

查看当前会话隔离级别

select @@tx isolation;

查看系统当前隔离级别

select @@global.tx isolation;

设置当前会话隔离级别

set  session  transaction  isolation  level  repeatable  read;

设置系统当前隔离级别

set  global  transaction  isolation  level  repeatable  read;

mysql 默认的事务隔离级别是 repeatable read,

一般情况下,没有特殊要求,没有必要修改(因为该级别可以满足绝大部分项目需求)

数据库和jdbc

mysql事务 ACID

事务的 acid 特性

原子性(Atomicity)

原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

一致性(Consistency)

事务必须使数据库从一个一致性状态变换到另外一个一致性状态

隔离性(Isolation)

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

持久性(Durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

mysql 表类型和存储引擎

基本介绍

         MySQL的表类型由存储引擎(Storage Engines)决定

主要包括MyISAM、innoDB、Memory等

  1. MySQL数据表主要支持六种类型,分别是:CSV、Memory、ARCHIVE,  MRG_MYISAM、 MYISAM、 InnoBDB。
  2. 这六种又分为两类,一类是”事务安全型”(transaction-safe),比如:InnoDB;

其余都属于第二类,称为”非事务安全型”(non-transaction-safe)[mysiam 和 memory]

数据库和jdbc

主要的存储引擎/表类型特点

数据库和jdbc

细节说明

  1. MylSAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求
  2. InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。

但是比起MylSAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

MEMORY存储引擎使用存在内存中的内容来创建表。

每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常得快,

因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦MySQL服务关闭,表中的数据就会丢失掉,表的结构还在。

如何选择表的存储引擎

如果你的应用不需要事务,处理的只是基本的CRUD操作,

那么MylSAM是不二选择,速度快

  1. 如果需要支持事务,选择InnoDB。
  2. Memory存储引擎就是将数据存储在内存中,由于没有磁盘I./O的等待,速度极快。

但由于是内存存储引擎,所做的任何修改在服务器重启后都将消失。

(经典用法用户的在线状态().)

修改存储引擎

数据库和jdbc

视图(view)

基本概念

        视图是一个虚拟表,其内容由查询定义。同真实的表一样,

视图包含列,其数据来自对应的真实表(基表)

视图和基表关系的示意图

数据库和jdbc

视图的基本使用

  1. create view 视图名 as  select语句
  2. alter view 视图名 as  select语句 -更新成新的视图
  3. SHOW CREATE VIEW
  4. drop view视图名1,视图名2

视图的细节

1. 创建视图后,到数据库去看,对应视图只有一个视图结构文件(形式: 视图名.frm)

2. 视图的数据变化会影响到基表,基表的数据变化也会影响到视图[insert update delete ]

3. 视图中可以再使用视图 , 比如从 view01 视图中,选出 字段 做出新视图

视图最佳实践

                安全。一些数据表有着重要的信息。有些字段是保密的,不能让用户直接看到。

这时就可以创建一个视图,在这张视图中只保留一部分字段。

这样,用户就可以查询自己需要的字段,不能查看保密的字段。

              性能。关系数据库的数据常常会分表存储,使用外键建立这些表的之间关系。

这时,数据库查询通常会用到连接(JOIN)。这样做不但麻烦,效率相对也比较低。

如果建立一个视图,将相关的表和字段组合在一起,就可以避免使用JOIN查询数据。

             灵活。如果系统中有一张旧的表,这张表由于设计的问题,即将被废弃。

然而,很多应用都是基于这张表,不易修改。这时就可以建立一张视图,

视图中的数据直接映射到新建的表。这样,就可以少做很多改动,也达到了升级数据表的目的。

Mysql 管理

mysql中的用户,都存储在系统数据库mysql中 user 表中

数据库和jdbc

其中user表的重要字段说明:

1.host: 允许登录的“位置”,

localhost表示该用户只允许本机登录,也可以指定ip地址,比如:192.168.1.100

2. user:  用户名;

3. authentication_string:

密码,是通过mysql的password()函数加密之后的密码。

创建用户

create user  ‘用户名’  ‘@’  ‘允许登录位置’  identified by  ’密码’

说明:创建用户,同时指定密码

删除用户 

drop user  '用名'  '@'  '允许登录位置';

用户修改密码

修改自己的密码:

set password = password('密码');

修改他人的密码(需要有修改用户密码权限):

set password for '用户名'@'登录位置' = password('密码');

mysql 中的权限

数据库和jdbc

给用户授权

基本语法:

grant权限列表on库.对象名 to  '用户名'  '@' '登录位置' 【identified by'密码'】

说明:

  1. 权限列表,多个权限用逗号分开
  1. grant select on ...
  2. grant select, delete, create on ...
  3. grant all 【privileges】 on..   //表示赋予该用户在该对象上的所有权限

特别说明

 *.*:代表本系统中的所有数据库的所有对象(表,视图,存储过程)

库.*:表示某个数据库中的所有数据对象(表,视图,存储过程等)

identified by可以省略,也可以写出

如果用户存在,就是修改该用户的密码。

如果该用户不存在,就是创建该用户!

回收用户授权

基本语法:

        revoke  权限列表 on  库 . 对象名 from '用户名’   ‘@‘   ‘登录位置';

权限生效指令

如果权限没有生效,可以执行下面命令

        基本语法:

        FLUSH PRIVILEGES;

细节说明

在创建用户的时候,如果不指定Host,则为%,

%表示表示所有IP都有连接权限create user xxx;

你也可以这样指定create user  ‘xxx’  ‘@’  ’19168.1.%’

表示 xxx用户在192.168.1.*的ip可以登录mysql

在删除用户的时候,如果host不是%,需要明确指定  ’用户’  ’@’  host值'

JDBC 和数据库连接

基本介绍

  1. JDBC为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题。
  2. Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。
  3. JDBC的基本原理图[重要!]

数据库和jdbc

JDBC 带来的好处

如果Java直接访问数据库(示意图)

数据库和jdbc

JDBC带来的好处(示意图)

数据库和jdbc

说明:JDBC是Java提供一套用于数据库操作的接口API,Java程序员只需要

面向这套接口编程即可。不同的数据库厂商,需要针对这套接口,提供不同实现。

JDBC API

数据库和jdbc

JDBC 程序编写步骤

  1. 注册驱动-加载Driver类
  2. 获取连接-得到Connection
  3. 执行增删改查-发送SQL给mysql执行4.释放资源-关闭相关连接

获取数据库连接 5 种方事

方式 1

数据库和jdbc

方式 2

数据库和jdbc

方式 3

数据库和jdbc

方式 4

数据库和jdbc

提示

数据库和jdbc

方式 5

数据库和jdbc

数据库和jdbc

ResultSet[结果集]

  1. 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成
  2. ResultSet对象保持一个光标指向其当前的数据行。最初,光标位于第一行之前
  3. next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false,因此可以在while循环中使用循环来遍历结果集

 数据库和jdbc

 数据库和jdbc

Statement

  1. Statement对象用于执行静态SQL语句并返回其生成的结果的对象
  2. 在连接建立后,需要对数据库进行访问,执行命名或是SQL语句,可以通过
  1. Statement [存在SQL注入]
  2. PreparedStatement[预处理]
  3. CallableStatement[存储过程]

 

  1. Statement对象执行SQL语句,存在SQL注入风险
  2. SQL注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或命令,恶意攻击数据库。
  3. 要防范 SQL注入,只要用 PreparedStatement(从Statement扩展而来)取代Statement就可以了,

PreparedStatement

数据库和jdbc

1.  PreparedStatement执行的SQL语句中的参数用问号(?)来表示,调用

PreparedStatement 对象的 setXxx()方法来设置这些参数. setXxx()方法有两个参数

第一个参数是要设置的SQL语句中的参数的索引(从1开始),

第二个是设置的SQL语句中的参数的值

2. 调用 executeQuery(),返回 ResultSet 对象

3. 调用executeUpdate():执行更新,包括增、删、修改

预处理好处

  1. 不再使用+拼接sql语句,减少语法错误
  2. 有效的解决了sql注入问题!
  3. 大大减少了编译次数,效率较高

JDBC 的相关 API 小结

数据库和jdbc

事务

基本介绍

  1. JDBC程序中当一个Connection对象创建时,默认情况下是自动提交事务:每次执行一个SQL语句时,如果执行成功,就会向数据库自动提交,而不能回滚。
  2. JDBC程序中为了让多个SQL语句作为一个整体执行,需要使用事务
  3. 调用 Connection的 setAutoCommit(false)可以取消自动提交事务
  4. 在所有的SQL语句都成功执行后,调用Connection的commit();方法提交事务
  5. 在其中某个操作失败或出现异常时,调用Connection的 rollback();方法回滚事务

批处理

  1. 当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率。
  2. JDBC的批量处理语句包括下面方法:
  • addBatch():添加需要批量处理的SQL语句或参数
  • executeBatch():执行批量处理语句;
  • clearBatch():清空批处理包的语句

 

JDBC连接MySQL时,如果要使用批处理功能,

请再url中加参数 rewriteBatchedStatements=true

批处理往往和PreparedStatement一起搭配使用,可以既减少编译次数,又减少运行次数,效率大大提高

传统获取 Connection 问题分析

  1. 传统的JDBC数据库连接使用 DriverManager来获取,每次向数据库建立连接的时候都要将Connection加载到内存中,再验证IP地址,用户名和密码(0.05s~1s时间)。需要数据库连接的时候,就向数据库要求一个,频繁的进行数据库连接操作将占用很多的系统资源,容易造成服务器崩溃。
  2. 每一次数据库连接,使用完后都得断开,如果程序出现异常而未能关闭,将导致数据库内存泄漏,最终将导致重启数据库。
  3. 传统获取连接的方式,不能控制创建的连接数量,如连接过多,也可能导致内存泄漏,MySQL崩溃。
  4. 解决传统开发中的数据库连接问题,可以采用数据库连接池技术(connection pool)

数据库连接池种类

JDBC的数据库连接池使用 javax.sql.DataSource来表示, DataSource只是一个接口,

该接口通常由第三方提供实现[提供.jar]

  1.  C3P0 数据库连接池,速度相对较慢,稳定性不错(hibernate,spring)
  2.  DBCP数据库连接池,速度相对c3p0较快,但不稳定
  3.  Proxool数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点
  4.  BoneCP数据库连接池,速度快
  5.  Druid(德鲁伊)是阿里提供的数据库连接池,集DBCP、C3P0、Proxool

优点于一身的数据库连接池

Apache—DBUtils

1.关闭connection后,resultSet结果集无法使用

2.resultSet数据管理

3.示意图

数据库和jdbc

基本介绍

commons-dbutils 是 Apache组织提供的一个开源JDBC工具类库,它是对JDBC的封装,使用dbutils能极大简化jdbc编码的工作量[真的]。

DbUtils

  1. QueryRunner类:该类封装了SQL的执行, 是线程安全的。可以实现增、删、改、查、批处理
  2. 使用QueryRunner类实现查询
  3. ResultSetHandler接口:

该接口用于处理java.sql.ResultSet,将数据按要求转换为另一种形式

数据库和jdbc

表和 JavaBean 的类型映射关系

数据库和jdbc

DAO 和增增删改查通用方法-BasicDao

数据库和jdbc

基本说明

  1. DAO: data access object
  2. 这样的通用类,称为BasicDao,

是专门和数据库交互的,即完成对数据库(表)的crud操作。

在BaiscDao的基础上,实现一张表对应一个Dao,

更好的完成功能,比如Customer表Customer.java类(javabean)-CustomerDao.java

本章笔记是观看韩顺平的JAVA的视频和在网上找的资料 以及自己的理解总结出来的笔记希望可以帮助大家,感谢大家的耐心观看 如有错误请即使联系我 我会及时修正

转载自:https://juejin.cn/post/7236593298751029307
评论
请登录