数据库基础

1.为甚么要用数据库:

数据库可以实现持久化查询

2。数据库相关概述:

DB:数据库(Database)

即存储数据的“仓库”。它保存了一系列有组织的数据。

DBMS:数据库管理系统(Database Management System)

是一种操纵和管理数据库的大型软件,例如建立、使用和维护数据库。

SQL:结构化查询语言(Structure Query Language)

专门用来与数据库通信的语言。

3.关系型数据库和非关系型数据库区别

实质

关系型数据库,采用关系模型来组织数据。简单来说,关系模型指的就是二维表格模型。类似于Excel工作表。 非关系型数据库,可看成传统关系型数据库的功能阉割版本,基于键值对存储数据,通过减少很少用的功能,来提高性能

价格

目前基本上大部分主流的非关系型数据库都是免费的。而比较有名气的关系型数据库,比如Oracle、DB2、SQL Server是收费的。虽然MySQL免费,但它需要做很多工作才能正式用于生产。

应用场景

实际开发中,有很多业务需求,其实并不需要完整的关系型数据库功能,非关系型数据库的功 能就足够使用了。这种情况下,使用性能更高、成本更低的非关系型数据库当然是更明智的选择。比如:日志收集、排行榜、定时器等。 各自优势

关系型数据库的优势:

复杂查询

可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。

事务支持

使得对于安全性能很高的数据访问要求得以实现。

非关系型数据库的优势:

性能

NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。

可扩展性

同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。

MySQL数据库客户端的登录

方式一:MySQL自带客户端

开始菜单==》所有程序==》MySQL==》MySQL Server 5.7==》MySQL 5.7 Command Line Client 说明:仅限于root用户

方式二:命令行

mysql -h 主机名 -P 端口号 -u 用户名 -p密码 注意: (1)-p与密码之间不能有空格,其他参数名与参数值之间可以有空格也可以没有空格 启动 MySQL 服务命令: net start MySQL57 停止 MySQL 服务命令: net stop MySQL57 例如:mysql -h localhost -P 3306 -u root -proot

方式三:c可视化工具

例如:Navicat Preminum,SQLyog 等工具 还有其他工具:mysqlfront,phpMyAdminc

SQL语句概述

1.什么是SQL?
Structured Query Language:结构化查询语言
其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方
言”。
2.SQL通用语法
1. SQL 语句可以单行或多行书写,以分号结尾。
2. 可使用空格和缩进来增强语句的可读性。
3. MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。
4. 3 种注释
* 单行注释: -- 注释内容 或 # 注释内容(mysql 特有)
* 多行注释: /* 注释 */
3. SQL分类
1) DDL(Data Definition Language)数据定义语言
用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter 等
2) DML(Data Manipulation Language)数据操作语言
用来对数据库中表的数据进行增删改。关键字:insert, delete, update 等
3) DQL(Data Query Language)数据查询语言
用来查询数据库中表的记录(数据)。关键字:select, where 等
4) DCL(Data Control Language)数据控制语言(了解)
用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE 等

DDL语句

1.操作库


查询:
查询所有的数据库的名称
show databases;
查询某个数据库字符集:查询某个数据库的创建语句
show create database 数据库名称;
新增:
创建数据库:
create database 数据库名称
创建数据库:判断数据库是否存在,不存在在创建
create database if not exists 数据库名称
创建数据库,指定字符集
create database 数据库名称 character set 字符集名
练习:创建db4数据库,判断是否存在,并制定字符集为gbk
create database if not exists db4 character set gbk;
删除:(delete)
删除数据库:
drop database 数据库名称;
判断数据库存在,存在在删除
drop database if exists 数据库名称;
修改:
修改数据库的字符集
alter database 数据库名称 character set 字符集名称
使用:
查询当前正在使用数据库名称:
select database();
使用数据库:
use 数据库名称;

2.操作表

1. C(Create):创建
   1. 语法:
   create table 表名(
  列名1 数据类型1,
  列名2 数据类型2,
  ....
  列名n 数据类型n
  );
* 注意:最后一列,不需要加逗号(,)
      * 数据库类型:
       1. int:整数类型
      * age int,
       2. double:小数类型
      * score double(7,2)
       3. date:日期,只包含年月日,yyyy-MM-dd
       4. datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
       5. timestamp:时间错类型 包含年月日时分秒 yyyy-MM-dd HH:mm:ss
* 如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来
自动赋值
       6. varchar:字符串
      * name varchar(20):姓名最大20个字符
      * zhangsan 8个字符 张三 2个字符
       
* 创建表
   create table student(
  id int,
  name varchar(32),
  age int ,
  score double(4,1),
  birthday date,
  insert_time timestamp
  );
  * 复制表:
  * create table 表名 like 被复制的表名;
2. R(Retrieve):查询
查询某个数据库中所有的表名称
show tables;
查询表结构
desc 表名;
3. U(Update):修改
1. 修改表名
alter table 表名 rename to 新的表名;
2. 修改表的字符集
alter table 表名 character set 字符集名称;
3. 添加一列
alter table 表名 add 列名 数据类型;
4. 修改列名称 类型
       alter table 表名 change 列名 新列名 新数据类型;
       alter table 表名 modify 列名 新数据类型;
5. 删除列
  alter table 表名 drop 列名;
4. D(Delete):删除
drop table 表名;
drop table if exists 表名 ;

1600765862768

MySQL数据类型

整型系列:xxxInt
int(M),必须和unsigned zerofill一起使用才有意义
浮点型系列:float,double
double(M,D):表示最长为M位,其中小数点后D位
例如:double(5,2)表示的数据范围[-999.99,9999.999],如果超过这个范围会报错。
定点型系列:decimal
decimal(M,D):表示最长为M位,其中小数点后D位
字符串类型:char,varchar(M),text
char如果没有指定宽度,默认为1个字符
varchar(M),必须指定宽度
日期时间类型:year, date, datetime, timestamp
注意一下每一种日期时间的表示范围
其他类型:bit, xxBlob, 枚举,集合等

增删改表中数据

1. 添加数据:
语法:
insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
* 注意:
   1. 列名和值要一一对应。
   2. 如果表名后,不定义列名,则默认给所有列添加值
insert into 表名 values(值1,值2,...值n);
3. 除了数字类型,其他类型需要使用引号(单双都可以)引起来
2. 删除数据:
语法:
delete from 表名 [where 条件]
注意:
   1. 如果不加条件,则删除表中所有记录。
   2. 如果要删除所有记录
   1. delete from 表名; -- 不推荐使用。有多少条记录就会执行多少次删除操作
   2. truncate table 表名; -- 推荐使用,效率更高 先删除表,然后再创建一张一样的表。
3. 修改数据:
语法:
update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 条件];
注意:
1. 如果不加任何条件,则会将表中所有记录全部修改。

查询表中的记录

查询某张表中所有内容的时候:
select * from 表名;
     1. 语法:
       select 字段列表  from 表名列表 where 条件列表 group by
分组字段 having 分组之后的条件 order by 排序 limit 分页限定

基础查询

1. 多个字段的查询
select 字段名1,字段名2... from 表名;
注意:
如果查询所有字段,则可以使用*来替代字段列表。
2. 去除重复: distinct
select distinct 字段名1,字段名2... from 表名;

3. 计算列
一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
表达式1:哪个字段需要判断是否为null
表达式2: 如果该字段为null后的替换值。
4. 起别名:
as:as也可以省略

条件查询

1. where子句后跟条件
2. 运算符
> 、< 、<= 、>= 、= 、<>
BETWEEN...AND
IN( 集合)
LIKE:模糊查询
占位符:
_:单个任意字符
%:多个任意字符
IS NULL
        and 或 &&
        or 或 ||
        not 或 !

排序查询

语法:order by 子句
order by 排序字段1 排序方式1 , 排序字段2 排序方式2...
排序方式:
ASC:升序,默认的。
DESC:降序。
注意:
如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。

分组查询

1. 语法:group by 分组字段;
2. 注意:
   1. 分组之后查询的字段:分组字段、聚合函数
   2. where 和 having 的区别?
       1. where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
       2. where 后不可以跟聚合函数,having可以进行聚合函数的判断。

分页查询

语法:limit 开始的索引,每页查询的条数;
公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数

练习

--查询表中所有数据
select * from student2;
select name ,age ,address from student2;
select  DISTINCT age from student2;
select name 姓名 ,math 数学,english 英语,math+ifnull(english,0) 总分 from student2;

select * from student2 limit 0,4;

select * from student2  ORDER BY sex;

select * from student2 where math>70 order by sex;
--查询年龄大于20岁
select * from student2 where age>=20;
--查询年龄不等于20岁
select * from student2 where age<>20;
--查询年龄大于20小于30
select * from student2 where age>=20&& age<=30;
select * from student2 where age>=20 and age<=30;
select * from student2 where age between 20 and 30 ;

--查询一个18,22,25岁
select * from student2 where age=22 or age =25 or age=18;
select * from student2 where age in (18,22,25);

--查询成绩为null的人
select * from student2 where english is null;

--查询名带马的人
select * from student2 where name like '马%';

select * from student2 where name like '_化%';

select * from student2 where name like '%德%';
select * from student2 where name like '___';

select * from student2 order by age desc , id desc;

select count(id) from student2;

select  max(math) from student2;

select  min(math) from student2;

select sum(ifnull(english,0)) from student2 ;
-- select name from student2 where name=( select * from max(math) from student2);

select avg(ifnull(english,0)) from student2 ;
-- 按照性别分组。分别查询男、女同学的平均分
selecT sex ,avg(math) from student2 group by sex;
-- 按照性别分组。分别查询男、女同学的平均分,人数
select sex ,avg(math),count(id) from student2 group by sex
-- 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组
selecT sex ,avg(math),count(id) from student2 where math>=70 group by sex
-- 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组,分 组之后。人数要大于2个人
SELECT sex , avg(math), count(id) from student2 where math >=70 group by sex having count(id) >=2;
--添加非空约束
alter table student modify name varchar(20) not null;
--删除非空约束
alter table student modify name varchar(20) ;

--添加唯一约束
alter table student modify age int unique;
--删除唯一约束
alter table student modify age int;

--主键约束
alter table student modify id int primary key ,
alter table student modify id int auto_increment ;
--删除主键约束(如果主键设置了自动增长,先删除自动增长,然后在删除主键)
 alter table student drop  primary key;
alter table student modify id int ;

约束

约束:对表中的数据进行限定,保证数据的正确性、有效性和完整性。
分类:
  主键约束:primary key
  非空约束:not null
  唯一约束:unique
  外键约束:foreign key
非空约束:not null,某一列的值不能为null
创建表时添加约束
CREATE TABLE stu(
      id INT,
      NAME VARCHAR(20) NOT NULL -- name为非空
    );
    创建表完后,添加非空约束
    alter table stu modify name varchar(20) not null;
    删除表的非空约束
    alter table stu modify name varchar(20);
唯一约束:unique,某一列的值不能重复
注意:唯一约束可以有NULL值,但是只能有一条记录为null
在创建表时,添加唯一约束
CREATE TABLE stu(
      id INT,
      phone_number VARCHAR(20) UNIQUE -- 手机号
  );
  删除唯一约束
  alter table stu drop index phone_number;
  在创建表完成之后,添加唯一约束
  alter table stu modify phone_number varchar(20) unique;
主键约束:primary key
注意事项:
含义:非空且唯一
一张表只能有一个字段为主键
主键就是表中记录的唯一标识
在创建表时,添加主键约束
   create table stu(
      id int primary key,-- 给id添加主键约束
      name varchar(20)
  );
删除主键
ALTER TABLE stu DROP PRIMARY KEY;
创建完表,添加主键
alter table stu modify id int PRIMARY key;
自动增长:
1. 概念:如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长
       2. 在创建表时,添加主键约束,并且完成主键自增长
       create table stu(
          id int primary key auto_increment,-- 给id添加主键约束
          name varchar(20)
      );
       3. 删除自动增长
       ALTER TABLE stu MODIFY id INT;
       4. 添加自动增长
       ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
外键约束:
外键约束:
foreign key,让表于表产生关系,从而保证数据的正确性。
在创建表时,可以添加外键
删除外键:
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
创建表之后,添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES主表名称(主表列名称);

多表间的关系

1. 多表之间的关系
 1. 分类:
   1. 一对一(了解):
      如:人和身份证
      分析:一个人只有一个身份证,一个身份证只能对应一个人
   2. 一对多(多对一):
      如:部门和员工
      分析:一个部门有多个员工,一个员工只能对应一个部门
   3. 多对多:
      如:学生和课程
  分析:一个学生可以选择很多门课程,一个课程也可以被很多学生选择
2. 实现关系:
1. 一对多(多对一):
    如:部门和员工
    实现方式:在多的一方建立外键,指向一的一方的主键。
   2. 多对多:
  如:学生和课程
  实现方式:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键
  3. 一对一(了解):
  如:人和身份证
  实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键。

多表查询

select 列名列表 from 表名列表

笛卡尔积:
  有两个集合A,B .取这两个集合的所有组成情况。
  要完成多表查询,需要消除无用的数据
分类
内连接查询
隐式内连接:使用where条件消除无用数据
显式内连接:语法: select 字段列表 from 表名1 [inner] join 表名2 on 条件
外链接查询
1. 左外连接:
语法:select 字段列表 from 表1 left [outer] join 表2 on 条件;查询的是左表所有数据以及其交集部分。
2. 右外连接:
  语法:select 字段列表 from 表1 right [outer] join 表2 on 条件;
子查询:查询中嵌套查询,称嵌套查询为子查询。
子查询不同情况
 1. 子查询的结果是单行单列的:
      子查询可以作为条件,使用运算符去判断。 运算符: > >= < <= =
     2. 子查询的结果是多行单列的:
  子查询可以作为条件,使用运算符in来判断
 3. 子查询的结果是多行多列的:
子查询可以作为一张虚拟表参与查询

事务

1. 事务的基本介绍
1. 概念:
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
2. 操作:
  1. 开启事务: start transaction;
  2. 回滚:rollback;
  3. 提交:commit;
3. 例子:
  CREATE TABLE account (
      id INT PRIMARY KEY AUTO_INCREMENT,
      NAME VARCHAR(10),
      balance DOUBLE
  );
-- 添加数据
  INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000),('lisi',
  1000);
  SELECT * FROM account;
  UPDATE account SET balance = 1000;
  -- 张三给李四转账 500 元
  -- 0. 开启事务
  START TRANSACTION;
  -- 1. 张三账户 -500
  UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan';
  -- 2. 李四账户 +500
  -- 出错了...
  UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi';
-- 发现执行没有问题,提交事务
COMMIT;
-- 发现出问题了,回滚事务
ROLLBACK;
4. MySQL数据库中事务默认自动提交
事务提交的两种方式:
  自动提交:
  mysql就是自动提交的
  一条DML(增删改)语句会自动提交一次事务。
手动提交:
Oracle 数据库默认是手动提交事务
需要先开启事务,再提交
修改事务的默认提交方式:
查看事务的默认提交方式:SELECT @@autocommit; -- 1 代表自动提交 0 代表手动提交
修改默认提交方式: set @@autocommit = 0;
2. 事务的四大特征:
   1. 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
   2. 持久性:当事务提交或回滚后,数据库会持久化的保存数据。
   3. 隔离性:多个事务之间。相互独立。
   4. 一致性:事务操作前后,数据总量不变
3. 事务的隔离级别(了解)
概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
* 存在问题:
   1. 脏读:一个事务,读取到另一个事务中没有提交的数据
   2. 不可重复读(虚读):在同一个事务中,两次读取到的数据不一样。
   3. 幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
    隔离级别:
      1. read uncommitted:读未提交
        产生的问题:脏读、不可重复读、幻读
      2. read committed:读已提交 (Oracle默认)
        产生的问题:不可重复读、幻读
      3. repeatable read:可重复读 (MySQL默认)
      产生的问题:幻读
     4. serializable:串行化
      可以解决所有的问题
    注意:隔离级别从小到大安全性越来越高,但是效率越来越低
    数据库查询隔离级别:
     select @@tx_isolation;
    mysql默认的事务隔离级别为repeatable-read
    数据库设置隔离级别:
     set session transaction isolation level 级别字符串

DCL

 SQL分类:
   1. DDL:操作数据库和表
   2. DML:增删改表中数据
   3. DQL:查询表中数据
   4. DCL:管理用户,授权
* DBA:数据库管理员
* DCL:管理用户,授权
1. 管理用户
   1. 添加用户:
  * 语法:CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
   2. 删除用户:
  * 语法:DROP USER '用户名'@'主机名';
   3. 修改用户密码:
   UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名';
   UPDATE USER SET PASSWORD = PASSWORD('abc') WHERE USER = 'lisi';
   SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
   SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123');
  4. 查询用户:
   -- 1. 切换到mysql数据库
   USE mysql;
   -- 2. 查询user表
   SELECT * FROM USER;
  * 通配符: % 表示可以在任意主机使用用户登录数据库
mysql中忘记了root用户的密码?
1. cmd -- > net stop mysql 停止mysql服务
* 需要管理员运行该cmd
2. 使用无验证方式启动mysql服务: mysqld --skip-grant-tables
3. 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功
4. use mysql;
5. update user set password = password('你的新密码') where user ='root';
6. 关闭两个窗口
7. 打开任务管理器,手动结束mysqld.exe 的进程
8. 启动mysql服务
9. 使用新密码登录。
2. 权限管理:
   1. 查询权限:
    -- 查询权限
       SHOW GRANTS FOR '用户名'@'主机名';
       SHOW GRANTS FOR 'lisi'@'%';
   2. 授予权限:
    -- 授予权限
  grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
   -- 给张三用户授予所有权限,在任意数据库任意表上
  GRANT ALL ON *.* TO 'zhangsan'@'localhost';
   3. 撤销权限:
    -- 撤销权限:
       revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
       REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';

数据库的备份和还原

1. 命令行:
语法:备份: mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
  还原:
      1. 登录数据库
      2. 创建数据库
      3. 使用数据库
      4. 执行文件。source 文件路径

JDBC准备工作:

1.Java语言开发环境(JDK)和数据库环境(MySQL)
2.准备JDBC连接MySQL数据库规范
mysql-connector-java-5.1.49-bin.jar
3.建立连接需要数据:
协议: TCP/IP JDBC:mysql://IP地址:端口号/数据库名字
IP:127.0.0.1 或者 localhost
端口号:3306
数据库帐号:root
      数据库密码:888888

DriverManager类:

类的解释:
管理一组 JDBC 驱动程序的基本服务工具类。
类的位置
java.sql.DriverManager
类的构造器
构造器私有化,不能实例化对象
类的方法
public static Connection getConnection(String url,String user,String password)
    试图建立到给定数据库 URL 的连接

Connection类:

类的解释
SQL语句的发送对象.用于执行静态 SQL 语句并返回它所生成结果的对象。
静态 SQL 语句:给定好的SQL语句
类的位置
java.sql.Statement
类的构造器
因为是接口,没有构造器
类的方法
void close()
立即释放此 Statement 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。
ResultSet executeQuery(String sql)
        向数据库发送查询的方法
  int executeUpdate(String sql)
        向数据库发送增删改的方法

用JDBC操作增删改SQL语句的步骤:


用JDBC操作增删改SQL语句的步骤:
  1.将mysql-connector-java-5.1.49-bin.jar复制粘贴项目中,右键add as lib
2.注册驱动类
Class.forName("com.mysql.jdbc.Driver");
3.通过DriverManager工具类获取数据库连接对象,使用里面静态方法getConnection
4.通过Connection对象获取SQL语句发送对象Statement,实例方法createStatement()
5.定义并初始化SQL语句
6.通过SQL语句发送对象Statement的实例方法executeUpdate()向数据库发送SQL语句
7.关闭资源

ResultSet类

类的解释
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
类的位置
java.sql.ResultSet
类的构造器
因为是接口,没有构造器,通过 executeQuery进行获取对象
类的方法
boolean next()将光标从当前位置向前移一行。
void close()
立即释放此 ResultSet 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。
Object getObject(int columnIndex)
  编程语言中 Object 的形式获取此 ResultSet 对象的当前行中指定列的值
1.不确定当前列的数据类型
2.确定后的该列的数据类型是Java中的引用数据类型
3.里面参数就是数据库表的第几列(从1开始)

PreparedStatement接口:

类的解释
表示预编译的 SQL 语句的对象。
预编译:
准备操作的SQL语句,但是SQL里面的数据未确定
类的位置
java.sql.PreparedStatement
类的构造器
因为是结果,通过连接对象获取实现类对象
PreparedStatement prepareStatement(String sql)
    创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
类的方法
int executeUpdate()
    删改的方法
      ResultSet executeQuery()
        造作SQL查询的方法
    void setObject(int parameterIndex,Object x)
      使用给定对象设置指定参数的值。
      第一个参数:将后面的参数添加到第几个?问号处
      第二个参数:存入SQL语句中的值
      关于批处理方法

用PreparedStatement实现类对象操作增删改SQL语句的步骤:

1.将mysql-connector-java-5.1.49-bin.jar复制粘贴项目中,右键add as lib
2.注册驱动类
Class.forName("com.mysql.jdbc.Driver");
3.通过DriverManager工具类获取数据库连接对象,使用里面静态方法getConnection
4.定义并初始化SQL语句
5.通过Connection对象获取SQL语句发送对象PreparedStatement,实例方法prepareStatement(String sql)
6.完成SQL语句的预编译信息
7.发送预编译SQL语句,调用executeUpdate()
8.关闭资源

用PreparedStatement实现类对象操作查询SQL语句的步骤:
1.将mysql-connector-java-5.1.49-bin.jar复制粘贴项目中,右键add as lib
  2.注册驱动类
  Class.forName("com.mysql.jdbc.Driver");
3.通过DriverManager工具类获取数据库连接对象,使用里面静态方法getConnection
4.定义并初始化SQL语句
5.通过Connection对象获取SQL语句发送对象PreparedStatement,实例方法prepareStatement(String sql)
  6.完成SQL语句的预编译信息
  7.发送预编译SQL语句,调用executeQuery()
  8.解析executeQuery()返回的结果集对象
9.关闭资源

批处理:

  • 批量处理sql

  • void addBatch()

  • 将一组参数添加到此 PreparedStatement 对象的批处理命令中。

  • int[] executeBatch()

  • 将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组

  • 完成批处理的步骤:

  • 1.在url中要加一个参数

    • JDBC:mysql://IP地址:端口号/数据库名字?rewriteBatchedStatements=true

  • 2.在执行过程中调用addBatch()和executeBatch()

在JDBC处理事务

在JDBC处理事务
1.在MySQL数据库中默认自动提交事务,将自动提交事务修改手动提交
void setAutoCommit(boolean autoCommit)
将此连接的自动提交模式设置为给定状态。
true 表示启用自动提交模式;为 false 表示禁用自动提交模式
连接对象.setAutoCommit(false);

2.针对数据库操作的相关代码进行事务的提交,相关异常信息不需要在进行抛,需要自己捕获处理
try {
针对数据操作的相关的代码
提交事务;
连接对象.commit();
} catch (Exception e) {
事务的回滚
连接对象.rollback();
}

连接池的好处

连接池的好处:
1.设置固定数量的连接对象,可以保证服务器的稳定
2.可以把配置信息,独立到文本文件中,如果进行修改不用重启服务器

德鲁伊连接池使用步骤:
1.导入jar包
2.创建数据库连接池对象
new DruidDataSource();
3.建立数据库连接池
四个基本数据
a.JDBC驱动
ds.setDriverClassName("com.mysql.jdbc.Driver");
b.协议
ds.setUrl("jdbc:mysql://localhost:3306/test");
c.数据库的账户
ds.setUsername("root");
d.数据库的密码
ds.setPassword("123456");
设置连接池的容量
a.设置连接池最大的容器:
ds.setMaxActive(连接池连接对象最大的量);
b.设置最大的等待时间
ds.setMaxWait(毫秒值);
在这个时间内,如果有连接对象正常连接,如果没有连接对象,报异常
4.获取连接对象getConnection()
5.当使用连接对象完毕之后,归还给连接池
close()

DButils插件

DButils插件
QueryRunner类
类的解释
针对JDBC实现了增、删、改、查的封装工具类
类的位置
org.apache.commons.dbutils.QueryRunner
类的构造器
public QueryRunner()
类的方法
public int update(Connection conn,String sql,Object... params)
            针对增删改进行操作的方法
          public <T> T query(Connection conn,String sql,ResultSetHandler<T> rsh,
                    Object... params)
              针对查询进行操作的方法

  DBUtils插件使用步骤:
  1.导包
  2.创建QueryRunner()对象
  3.准备调用增删改查所需要的数据
  4.调用增删改update()或者查询的方法query()
  5.关闭资源



相信自己,坚信自己的目标,去承受常人承受不了的磨难与挫折,不断的努力去奋斗,最终的成功就会是你
原文地址:https://www.cnblogs.com/Valuez/p/13743324.html