初见MySQL

2021/3/2

数据库:

DateBase DB, 用于存储和管理数据的仓库。

特点:
1.持久化存储数据。是一个文件系统。
2.方便存储和管理数据
3.使用了统一的方式操作数据库 – SQL

配置安装: 点赞部分

  • user host password
  • net start mysql; 启动服务
  • net stop mysql; 关闭服务
  • mysql -uroot -p 密码 登录
  • mysql -hip -uroot -p密码 登录
  • 退出 exit quit

安装目录:

bin: 二进制可执行文件
data:数据目录
include: C语言信息
lib: jar包
share: mysql错误信息
my.ini: 配置文件

数据目录:

数据库:文件夹
表:文件
数据:

SQL:

1:什么是SQL?

Structured Query Language:结构化查询语言
其实就是定义了操作所有关系型数据库的规则。

2:SQL通用语法

(1)分号结尾
(2)空格缩进
(3)不区分大小写 关键字建议大写
(4)三种注释:-- 注释内容 # 注释内容(注意空格) /* 注释 */

3:SQL分类
(1)DDL (操作数据库、表)(Data Definition Language)
(2)DML(增删改表中的数据)(Data Manipulation Language)
(3)DQL(查询表中数据)(Data Query Language)
(4)DCL(授权) (Data Control Language)

DDL:(Data Definition Language)

1. 操作数据库:CRUD

  1. Create 创建
    * create database 数据库名称;
    * create database if not exists 数据库名称;
    * create database 数据库名称 character set 字符集名:
    * create database if not exists 数据库名称 character set 字符集名;

    1. Retrieve 查询
      • 查看所有数据库名称 show databases;
      • 查看某个数据库的字符集(创建语句) show create database 数据库名称;
    2. Update 修改
      • alter database 数据库名称 character set 字符集名;
    3. Delete 删除
      • drop database 数据库名称;
      • drop database if exists 数据库名称;
    4. 使用数据库
      • 查询当前正在使用的数据库名称 select database();
      • 使用数据库 use 数据库名称;

    2. 操作表:CRUD

    1. Create 创建
      • create table 表名(
        列名1 数据类型1,
        列名2 数据类型2,

        列名n 数据类型n
        ); 最后一列无逗号
      • 数据类型:
        • int:整数 age int,
        • double:小数 score double(5,2), 共五位,小数两位
        • data:日期,只包含年月日 yyyy-MM-dd
        • datatime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
        • timestamp;时间戳 包含年月日时分秒 yyyy-MM-dd HH:mm:ss 不赋值默认系统时间
        • 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. Retrieve 查询
      • 查询某个数据库中所有的表名称 show tables;
      • 查询表结构 desc 表名;
    3. Updata 修改
      • 修改表名 alter table 表名 rename to 新的表名;
      • 修改表的字符集 alter table 表名 character set 字符集名;
      • 添加一列 alter table 表名 add 列名 数据类型;
      • 修改列的名称 类型
        • alter table 表名 change 列名 新列名 新数据类型;
        • alter table 表名 modify 列名 新数据类型;
      • 删除列 alter table drop 列名;
    4. Delete 删除
      • drop table if exists 表名;
      • drop table;

2021/3/3

DDL:增删改表中数据

  1. 添加数据:
  • insert into 表名(列名1,列名2,…,列名n) values(值1,值2,…,值n);
  • 注意:
    1. 列名和值一一对应
    2. 如果表名后,不定义列名,则默认给所有列添加值
    3. 除了数字类型,其他类型需要使用引号(单双均可以)引起来
  1. 删除数据:
  • delete from 表名 where 条件;
  • 注意:不加条件,删除表中所有记录
  • truncate table 表名; – 先删除表,然后再创建一张一样的表
  1. 修改数据:
    • update 表名 set 列名1 = 值1, 列名2 = 值2,…,,where 条件;
    • 注意: 如果不加任何条件,则会将表中所有数据修改

DQL: 查询表中数据

  1. select * from 表名;

  2. 语法:

    select
    	字段列表
    form
    表明列表
    	where
    条件列表
    	group by
    分组字段
    	having
    分组之后的条件
    	order by
    排序
    	limit
    分页限定
    
  3. 基础查询

    1. 多个字段的查询
      • select 字段名1, 字段名2,。。。, from 表名;
    2. 去除重复:
      • select distinct 字段名 from 表名;
    3. 计算列
      • 一般可以使用四则运算计算一些列的值(数值型)
      • ifnull(表达式1,表达式2): null参与的运算,计算结果都为null
        • 表达式1:哪个字段需要判断是否为null
        • 如果该字段为null后的替换值
    4. 起别名:
      • as: as也可以省略为 空格
  4. 条件查询

    1. where后跟条件
    2. 运算符
      • < <= >= <>
      • between and
      • or
      • in()
      • is is not is null
      • like 模糊查询
        • _ 单个任意字符
        • % 多个任意字符
DQL: 查询语句
	1. 排序查询
		* order by 排序语句1, 排序语句2;
			* ASC 升序
			* DESC 降序
	2. 聚合函数:将一列数据作为一个整体,进行纵向的计算。
		* count: 计算个数
		* max: 计算最大值
		* min: 计算最小值
		* sum
		* avg
		* 排除非空和null
		* ifnull函数
	3. 分组查询
		* group by 分组字段;
		* 分组之后查询的字段:分组字段、聚合函数  
		* where 和 having 区别?
				* where 再分组之前进行限定,如果不满足条件则不参与分组;
				* having在分组之后进行限定,如果不满足条件则不会被查询出来;
				* where 后不可以跟聚合函数, having后可以。
	4. 分页查询
		* limit 开始的索引,每页查询的条数;
		* select * from student limit 0,3; -- 第1页 
		* select * from student limit 3,3; -- 第2页 
		* select * from student limit 6,3; -- 第3页 
		* MySQL"方言"
  1. 约束:对表中的数据进行限定,保证数据的正确性、有效性和完整性。
    • 分类:
      • 主键约束: primary key
      • 非空约束: not null
      • 唯一约束: unique
      • 外键约束: foreign key
    • 非空约束:not null
      • 创建表时添加约束
        create table stu(
        id int,
        name varchar(20) not null – name为非空
        );
      • 创建表完后,添加非空约束
        alter table stu modify name varchar(20) not null;
      • 删除name的非空约束
        alter table stu modify name varchar(20);
    • 唯一约束:unique 不能重复
      • 创建表时添加约束
        create table stu(
        id int,
        phone_number varchar(20) unique – 添加了唯一约束
        );
        可以多个null
      • 删除唯一约束
        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,
        name varchar(20)
        );
      • 删除主键
        alter table stu drop primary key;
      • 在创建表后,添加主键
        alter table stu modify id int primary key;
    • 自动增长:
      • 如果某一列是数值类型的,使用 auto_increment 可以来完成值的自动增长
      • 在创建表时,添加主键约束
        create table stu(
        id int primary key auto_increment,
        name varchar(20)
        );
      • 删除自动增长
        alter table stu modify id int;
      • 添加自动增长
        alter table stu modify id int auto_increment;
    • 外键约束: foreign key 让表与表产生关系,从而保证数据的正确性。
      • 在创建表时,可以添加外键
        • 语法: create table 表名(

          外键列
          constraint 外键名称 foreign key (外键列名称) reference 主表名称(主表主键名称)
          );
      • 删除外键
        alter table employee drop foreign key (外键名称);
      • 创建表后添加外键
        alter table employee add constraint 外键名称 foreign key (外键列名称) reference 主表名称(主表列名称)
    • 级联操作
      • 添加级联操作
        alter table 表名 add constraint 外键名称
        foreign key (外键字段名称) references 主表名称(主表列名称) on update cascade on delete cascade;
      • 分类
        • 级联更新: on update cascade
        • 级联删除: on delete cascade 很危险

数据库的设计

  1. 多表之间的关系

    1. 一对一:
      如: 人和身份证
      分析: 一个人只有一个身份证,一个身份证只能对应一个人
    2. 一对多(多对一)
      如: 部分和员工
      分析: 一个部门有多个员工,一个员工只能对应一个部门
    3. 多对多
      如: 学生和课程
      分析: 一个学生可以选择很多们课程,一个课程也可以被很多学生选择
      实现关系
    • 一对多(多对一):在多的一方建立外键,指向一的一方的主键
    • 多对多:中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键
    • 一对一:可以在任意一方添加唯一外键指向另一方的主键
      案例P510
  2. 数据库设计的范式

    • 设计数据库时,需要遵循的一些规范
    • 第一范式:具有原子性
    • 第二范式:主键列与非主键列遵循完全函数依赖关系
    • 第三范式:非主键列之间没有传递函数依赖关系
  3. 数据库的备份和还原

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

2021/3/5

多表查询

  1. 笛卡尔积: 有两个集合A,B 取这两个集合的所有组成情况。要完成多表查询,需要消除无用的数据,
  2. 多表查询的分类:
    1. 内连接查询:

       1.从哪些表中查询数据
       2.条件是什么
       3.查询哪些字段
      
      1. 隐式内连接:使用where条件消除无用数据

         -- 查询所有员工信息和对应的部门信息
         select * from emp, dept where emp.dept_id = dept.id;
         -- 查询员工表的名称,性别。部门表的名称
         select emp.name, emp.gender, dept.name from emp, dept where emp.dept_id = dept.id;
         
         select
         	t1.name, 
         	t1.gender,
         	t1.name
         from
         	emp t1,
         	dept t2
         where 
         	t1.dept_id = t2.id;
        
      2. 显式内连接

         	语法:select 字段列表 from 表名1 【inner】 join 表名2 on 条件
         	select * from emp inner join dept on emp.dept_id = dept.id;
         	select * from emp join dept on emp.dept_id = dept.id;
        
    2. 外连接查询:

      1. 左外连接:查询的是左表所有数据以及其交集部分

         语法: select 字段列表 from 表1 left [outer] join 表2 on 条件;
         select t1.*, t2.name from emp t1 left join dept t2 on t1.dept_id = t2.id;
        
      2. 右外连接:查询的是有表所有数据以及其交集部分

         语法: select 字段列表 from 表1 right [outer] join 表2 on 条件;
         select t1.*, t2.name from emp t1 right join dept t2 on t1.dept_id = t2.id;
        
    3. 子查询:查询中嵌套查询,称嵌套查询为子查询

       -- 查询最高的工资是多少
       select max(salary) from emp;
       -- 查询员工信息,并且工资等于9000
       select * from emp where emp.salary = 9000;
       一条sql完成
        select * from emp where emp.salary = (select max(salary) from emp);
        * 子查询不同情况:
        	 1.结果是单行单列的:
        	 	子查询可以作为条件,使用运算符去判断。 > >= < <= =
       		-- 查询员工工资小于平均工资的人
       		select * from emp where emp.salary < (select avg(salary) from emp);
       	2. 查询结果是多行单列的:
       		子查询可以作为条件,使用运算符[in]判断。集合判断
       		-- 查询'财务部'和'市场部'所以的员工信息
       		select * from emp where dept_id in (select id from dept where name = '财务部' or name = '市场部');
       	3.查询结果是多行多列的:
       		-- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息 
       		select * from dept t1, (select * from emp where emp.join_date > '2011-11-11') t2 where t1.id = t2.dept_id;
       		select * from emp where emp.join_date > '2011-11-11';
       		-- 普通内连接
       		select * from emp t1, dept t2 where t1.dept_id = t2.id and t1.join_date > '2011-11-11';
      
    4. 多表查询练习:
      P521
      – 1.查询所有员工信息。查询员工编号,员工姓名,工资,职务名称,植物描述
      分析:
      1.员工编号,员工姓名,工资 emp表,职务名称,职务描述,job表
      2.
      代码:
      select
      t1.id,
      t1.ename,
      t1.salary,
      t2.jname,
      t2.description,
      from
      emp t1, job t2
      where
      t1.job_id = t2.id
      – 2.查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
      分析:
      1.员工编号,员工姓名,工资 emp表,职务名称,职务描述,job表,部门名称,部门位置 dept 表
      2.
      代码:
      select
      t1.id,
      t1.ename,
      t1.salary,
      t2.jname,
      t2.description,
      t3.dname,
      t3.loc
      from
      emp t1, job t2, dept t3
      where
      t1.job_id = t2.id and t1.dept_id = t3.id;
      – 3.查询员工姓名,工资,工资等级
      分析:
      1.员工姓名,工资 emp表, 工资等级 salary表
      2.条件 emp.salary >= salarygrade.losalary and emp.salary <= salarygrade.hisalary
      emp.salary between salarygrade.losalary and salarygrade.hisalary
      代码:
      select
      t1.ename,
      t1.salary,
      t2.grade
      from
      emp t1, salarygrade t2
      where
      t1.salary between t2.losalary and t2.hisalary;
      – 4.查询员工姓名,工资,职务描述,部门描述,部门位置,工资等级
      分析:
      1.员工姓名,工资 emp表, 职务描述,部门描述 job表,部门位置 dept,工资等级 salarygrade
      2.条件
      代码:
      select
      t1.ename,
      t1.salary,
      t2.jname,
      t2.description,
      t3.dname,
      t3.loc,
      t4.grade
      from
      emp t1,job t2, dept t3, salarygrade t4
      where
      t1.job_id = t2.id
      and t1.dept_id = t3.id
      and t1.salary between t4.losalary and t4.hisalary;

       -- 5.查询出部门编号、部门名称、部门位置、部门人数
       分析:
       		1.部门编号、部门名称、部门位置 dept表, 部门人数 emp表
       		2.使用分组查询,按照emp.dept_id 完成分组,查询 count(id)
       		3.使用子查询将第2步的查询结果和dept表进行关联查询
       代码:
       		select
       				t1.id, t1.dname, t1.loc, t2.total
       		from
       				dept t1,
       				(select
       							dept_id, count(id) total
       				 from
       				 			emp
       				 group by dept_id) t2
       		where
       				t1.id = t2.dept_id;
       	
       -- 6.查询所有员工的姓名以及其直接上级的姓名,没有领导的员工也需要查询
       分析:
       		1.姓名 emp, 直接上级的姓名 emp
       					* emp表的 id 和 mgr 是自关联
       		2.条件 emp.id = emp.mgr
       		3.查询左表的所有数据 和 交集数据
       					* 使用左外连接查询
       代码:
       		select
       			t1.ename,
       			t1.mgr,
       			t2.id,
       			t2.ename
       		from emp t1
       		left join emp t2
       		on t1.mgr = t2.id;
      

事务

  1. 事物的基本介绍
    1. 概念:
      • 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
    2. 操作:
      1. 开启事务: start transaction;
      2. 回滚: roll back;
      3. 提交:commit;
    3. 实例: 张三给李四转账500元
      1. 查询张三账户余额是否大于500
      2. start transaction;
      3. 张三账户 余额-500 – 出现异常 回滚
      4. 李四账户 余额+500
      5. – 执行没有问题
      6. commin;
      7. – 出现问题
      8. rollback;
    4. MySQL数据库中事务默认自动提交
      • 事务提交的两种方式:
        • 自动提交:
          • MySQL数据库中事务默认自动提交
          • 一条DML(增删改)语句会自动提交一次事务。
        • 手动提交:
          • Oracle 数据库默认手动提交
          • 需要先开启事务,再提交
      • 修改事务的提交方式
        • 查看事务的默认提交方式: select @@autocommit; – 1 自动 0 手动
        • 修改默认提交方式: set @@autocommit = 0;
  2. 事物的四大特征
    1. 原子性: 是不可分割的最小操作单位,要么同时成功,要么同时失败。
    2. 持久性:当事务提交或回滚后,数据库会持久化的保存数据。
    3. 隔离性:多个事物之间,相互独立。
    4. 一致性:事务操作前后,数据总量不变;
  3. 事物的隔离级别(了解)
    1. 概念:多个事物之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别,就可以解决这些问题。
    2. 存在问题:
      1. 脏读:一个事务,读取到另一个事务中没有提交的数据
      2. 不可重复读:在同一个事务中,两次读取到的数据不一样。
      3. 幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
    3. 隔离级别:
      1. read uncommitted: 读未提交
        • 产生的问题: 脏读、不可重复读、幻读
      2. read committed: 读已提交 (Oracle)
        • 产生的问题: 不可重复读、幻读
      3. repeatable read: 可重复读 (MySQL默认)
        • 产生的问题: 幻读
      4. serializable: 串行化
        • 可以解决所有问题
      • 注意:隔离级别从小到大安全性越来越高,但是效率越来越低
      • 数据库查询隔离级别:
        • select @@tx_isolation;
      • 数据库设置隔离级别:
        • set global transaction isolation level 级别字符串;

DCL:

  • SQL分类:
    1. DDL:操作数据库和表
    2. DML:增删改表中数据
    3. DQL:查询表中数据
    4. DCL:管理用户,授权
  • DBA: 数据库管理员
  • DCL:
    1. 管理用户
      1. 添加用户:

         	-- 创建用户
         	create user 'username'@'hostname' identified by 'password';
        
      2. 删除用户:

         	-- 
         	drop user 'username'@'hostname';
        
      3. 修改用户密码:

         	-- 修改lisi用户密码为abc
         	update user set password = password('abc') where user = 'lisi';
         	set password for 'root'@'localhost' = password('abc');
         	
         	*mysql中忘记root密码
         		1. cmd -- > net stop 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. 使用新密码登录
        
      4. 查询用户:

         	-- 1. 切换到mysql数据库
         	use mysql;
         	-- 2. 查询user表;
         	select * from user;
         	
         	* 通配符: % 表实可以在任意主机使用用户登录数据库
        
    2. 权限管理:
      1. 查询权限:

         	-- 查询权限
         	show grants for '用户名'@'主机名';
        
      2. 授予权限

         	-- 授予权限
         	grant  权限列表 on 数据库.表名 to '用户名'@'主机名';
         	grant select,delete on db3.account to 'lisi'@'%';
         	-- 全部
         	grant all on *.* to 'zhangsan'@'localhost';
        
      3. 撤销权限

         	-- 
         	revoke 权限列表 on 数据库.表名 from '用户名'@'主机名';
        

JDBC:

  1. 基本概念:

    • Java Database Connectivity Java 数据库连接, Java语言操作数据库
    • 本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
  2. 快速入门:

    1. 步骤:

      1. 导入驱动jar包
        1. 复制jar到项目的libs目录下
        2. libs 右键 --> Add as Library
      2. 注册驱动
      3. 获取数据库的连接对象 Connection
      4. 定义sql
      5. 获取执行sql语句的对象 statement
      6. 执行sql,接收返回结果
      7. 处理结果
      8. 释放资源
    2. 代码:

       //1. 导入驱动jar包
       //2. 注册驱动
       Class.forName("com.mysql.jdbc.Driver");
       //3. 获取数据库连接对象
       Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3","root", "123456");
       //4. 定义sql语句
       String sql = "update account set balance = 500 where id = 1";
       //5. 获取执行sql的对象 Statement
       Statement stmt =conn.createStatement();
       //6. 执行sql
       int count;
       count = stmt.executeUpdate(sql);
       //7. 处理结果
       System.out.println(count);
       //8. 释放资源
       stmt.close();
       conn.close();
      
    3. 详解各个对象

      1. DriverManger: 驱动管理对象

        • 功能:
          1. 注册驱动

             static void registerDriver(Driver driver): 注册与给定的驱动程序 DriverManager
              写代码使用: Class.forName("com.mysql.jdbc.Driver");
              通过查看源码发现:再在com.mysql.jdbc.Driver类中存在静态代码块
              static{
              		try{
              				java.sql.DriverManager.registerDriver(new Driver());  // DriverManager.registerDriver
              			} catch(SQLException E){
              					throw new RuntimeException("Can't register driver!");
              				}
              	}
            
          2. 获取数据库连接

             static Connection getConnection(String url, String user, String password);
             url: 指定连接的路径
             语法: 
             		jdbc:mysql://ip地址(域名):端口号/数据库名称
             		jdbc:mysql://localhost:3306/db3
             		本机可以简写 jdbc: mysql:///数据库名称
            
      2. Connection:数据库连接对象

        1. 功能 获取执行sql的对象
          1. Statement createStatement()
          2. PreparedStatement prepareStatement(String sql)
        2. 管理事务:
          * 开启事务:void setAutoCommit(boolean aotuCommit): 调用该方法设置参数为 false ,即开启事务
          * 提交事务:void commit();
          * 回滚事务:void rollback();
      3. Statement:执行sql的对象

        1. 执行sql
          • boolean execute(String SQL) 了解
          • int executeUpdate(String sql): 执行DML(insert update delete)、DDL(create alter drop)
            • 返回值为影响行数,从而判断语句是否执行成功 >0
          • ResultSet executeQuery(String sql): 执行DQL(select)
        2. 练习:
          1. account表 添加一条记录
          2. account表 修改记录
          3. account表 删除一条记录
      4. ResultSet:结果集对象,封装查询对象

        • next() 游标向下移动一行
        • getXxx(参数) 获取数据
          • Xxx 代表数据类型 如 int getInt() , String getString()
          • 参数:
            • Int: 代表列的编号,从1开始 如: getString(1)

            • String: 代表列的名称 如: getDouble(“banlance”);

                while(rs.next()) {
                // 6.2 获取
                	int id = rs.getInt(1);
                	String name = rs.getString(2);
                	int banlance = rs.getInt("balance");
                	System.out.println(id + "---" + name + "---" + banlance);
                }
              
      5. 联系:

        • 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。
          • 定义emp类

          • 定义方法

              public List<Emp> findAll(){}
            
          • 实现方法: select * from emp;

      6. PreparedStatement :执行sql的对象

        1. SQL 注入问题:在拼接sql时没有一些sql的特殊关键字与字符串的拼接,会造成安全性问题
          1. 输入用户随便,输入密码: a’ or ‘a’ = 'a
        2. 解决sql注入问题: 使用PreparedStatement 对象来解决
        3. 预编译的SQL: 参数使用 ? 作为占位符
        4. 步骤:
          1. 导入驱动jar包
          2. 复制jar到项目的libs目录下
          3. libs 右键 --> Add as Library
          4. 注册驱动
          5. 获取数据库的连接对象 Connection
          6. 定义sql
            • 注意:sql的参数使用 ? 作为占位符
            • 如 select * from user where username = ? and password = ?;
          7. 获取执行sql语句的对象 PreparedStatement
            • 调用 Connection.preparedStatement(String sql)
          8. 给 ? 赋值:
            • 方法: setXxx(参数1,参数2)
            • 参数1: ?位置 从1开始
            • 参数2: ? 值
          9. 执行sql,接收返回结果,不需要传递sql参数
          10. 处理结果
          11. 释放资源
        5. 后期都会使用PrepareStatement来完成增删改查所有操作
          1. 可以防止SQL注入
          2. 效率更高
  3. 对JDBC中各个接口和类详解

抽取JDBC工具类: JDBCUtils

  1. 目的: 简化书写
  2. 分析:
    1. 注册驱动也抽取
    2. 抽取一个方法获取连接对象
      • 需求:不想传递参数(麻烦),保证工具类的通用性。

      • 解决:配置文件

          jdbc.properties 
          	url = 
          	user = 
          	password =
        
    3. 抽取一个方法释放资源
  • 练习
    • 需求:
      1. 通过键盘录入用户名和密码
      2. 判断用户是否登陆成功
    • 步骤:
      1. 创建数据库表

JDBC控制事务:

  1. 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
  2. 操作:
    1. 开启事务
    2. 提交事务
    3. 回滚事务
  3. 使用Connection对象来管理事务
    • 开启事务:void setAutoCommit(boolean aotuCommit): 调用该方法设置参数为 false ,即开启事务
      • 在执行sql前开启
    • 提交事务:void commit();
      • 当所有sql都执行完提交事务
    • 回滚事务:void rollback();
      • 在catch中回滚事务

  1. 数据库连接池

  2. 简化 Spring JDBC: JDBC Template

数据库连接池

  1. 概念: 其实就是一个容器(集合),存放数据库连接的容器。
  2. 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象 ,用户访问完后,会将连接对象归还给容器。
    • 好处
    • 节约资源
    • 用户访问高效
  3. 实现:
    1. 标准接口:DataSource javax.sql 包下的
      1. 方法:
        1. 获取连接接 getConnection()
        2. 归还连接 Connection.close()
    2. 数据库厂商实现
      1. C3P0:数据库连接池技术
      2. Druid :数据库连接池实现技术,阿里巴巴提供的
  4. C3P0:数据库连接池技术
    步骤:
    1. 导入jar包
    2. 定义配置文件:
    1. 名称
    2. 路径:将文件放在src目录下即可
    3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
    4. 获取连接 : getConnection()
  5. Druid :数据库连接池实现技术,阿里巴巴提供的
    1. 步骤:
      1. 导入jar包
      2. 定义配置文件
        • 是 properties 形式
        • 可以叫任意名称,可以放在任意目录下
      3. 加载配置文件
      4. 获取数据库连接池对象:通过工厂来获取 DruidDataSourceFactory
      5. 获取连接池对象
      6. 获取链接
    2. 定义工具类
      1. 定义一个类 JDBCUtils
      2. 提供静态代码块加载配置文件,初始化连接池对象
      3. 提供方法:
        1. 获取连接方法
        2. 释放资源
        3. 获取连接池方法

Spring JDBC

  1. Spring 框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
  2. 步骤:
    1. 导入jar包

    2. 创建JDBCTemplate对象。依赖于数据源DataSource

      • JdbcTemplate template = new JdbcTemplate(ds);
    3. 调用 JdbcTemplate 方法来完成CRUD操作

      • update(): DML 增删改
      • queryForMap() 查询结果将结果封装为map集合,将列名作为key,值为value 将这条记录封装为map集合
        • 结果集长度只能是1
      • queryForList() 查询结果将结果封装为list集合
        • 将每一条记录封装为一个map集合,再将map集合装载到list集合中
      • query() 查询结果,将结果封装为JavaBean对象
        • query参数 : RowMapper
          • 一般我们使用 BeanPropertyRowMapper 实现类。可以完成数据到JavaBean的自动封装
          • new BeanPropertyRowMapper<类型>(类型.class)
      • queryForObject() 查询结果,将结果封装为对象
        • 一般用于聚合函数的查询

            String sql = "select count(id) from emp";
            Long total template.queryFroObject(sql, Long.class);
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值