Skip to content

Junit测试

分类

  • 黑盒测试 不需要写代码,给输入值,看程序是否能输出期望的值
  • 白盒测试 需要写代码,关注程序具体的执行流程

Junit的使用

白盒测试

步骤

  1. 定义一个测试类,与junit同级

    test

  2. 定义测试方法:可以独立运行

    方法名:testAdd;

    返回值:void

    参数列表:空参

  3. 给方法加@Test

  4. 导入junit依赖环境

判定结果

红色->失败

绿色->成功

一般我们会使用断言操作来处理结果

  • Assert.assertEquals(期望的结果,运算的结果);

补充

  • @Before 修饰的方法会在测试方法之前被自动执行
  • @After 修饰的方法会在测试方法执行之后自动被执行

反射

框架设计的灵魂

image-20230719145817222

框架

半成品软件。可以在框架的基础上进行软件开发,简化编码

反射

将类的名个组成部分封装为其他对象,这就是反射机制

好处

  • 可以在程序运行过程中,操作这些对象
  • 可以解耦,提高程序的可扩展性。

获取Class对象的方式

  1. class.forName("全类名"): 将字节码文件加载进内存,返回class对象
  2. 类名.class: 通过类名的属性class获取\
  3. 对象.getclass(): getclass()方法在object类中定义着。

image-20230719161128093

注解

概念 :

说明程序的。给计算机看的

注释 :

用文字描述程序的。给程序员看的也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在定义:注解 (Annotation)包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行i明,注释。

概念描述:

  • JDK1.5之后的新特性
  • 头说明程序的
  • 使用注解 : @注解名称

作用分类

  • 编写文档: 通过代码里标识的注解生成文档【生成文档doc文档】
  • 代码分析: 通过代码里标识的注解对代码进行分析【使用反射】
  • 编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】

JDK中预定义的一些注解

@override : 检测被该注解标注的方法是否是继承自父类(接口)的

@Deprecated : 该注解标注的内容,表示已过时

@Suppresswarnings : 压制警告

一般传递参数all   @Suppresswarnings(“all”);

自定义注解

格式:

元注解

public @interface 注解名称{}

本质

注解本质上就是一个接口,该接口默认继承Annotation接口

public interface MyAnno extends java.lang.annotation,Annotation{}

属性

接口中的抽象方法

要求

  1. 属性的返回值类型

    • 基本数据类型

    • String

    • 枚举

    • 注解

    • 以及以上类型的数组

  2. 定义了属性,在使用时需要给属性赋值

    1. 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
    2. 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可
    3. 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}省略

元注解

  1. @Target:描述注解能够作用的位置

    1. ElementType取值 :

      • TYPE : 可以作用子类上

      • METHOD:可以作用于方法上

      • FIELD : 可以作用于成员变量上

  2. @Retention:描述注解被保留的阶段

    1. @Retention(RetentionPoliCV.RUNTIME )当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
  3. @Documented: 描述注解是否被抽取到api文档中

  4. @Inherited: 描述注解是否被子类继承

在程序使用(解析)注解

获取注解中定义的属性

  1. 获取注解定义的位置的对象(class,Method,Field)

  2. 获取指定的注解

    getAnnotation(Class)

    //其实就是在内存中生成了一个该注解接口的子类实现对象

    image-20230719211919381

3.调用注解中的抽象方法获取配置的属性值

小结

  1. 以后大多数时候,我们会使用注解,而不是自定义注解

  2. 注解给谁用 ?

    • 编译器

    • 给解析程序用

3.注解不是程序的一部分,可以理解为注解就是一个标签

JavaWeb

数据库的基本概念

  1. 数据库的英文单词 : Database 简称DB

  2. 什么数据库 ? 用于存储和管理数据的仓库。

  3. 数据库的特点

    1. 持久化存储数据的。其实数据库就是一个文件系统
    2. 方便存储和管理数据
    3. 使用了统一的方式操作数据库 -- SOL
  4. 常用数据库软件

    image-20230719220310095

MySQL服务启动

  1. 手动。

  2. cmd--> services.msc 打开服务的窗口使用管理员打开cmd

  • net start mysql : 启动mysql的服务

  • net stop mysql:关闭mysq服务

MySQL登录

  1. mysql -uroot -p密码
  2. mysql -hip -uroot -p连接目标的密码
  3. mysql --host=ip --user=root --password=连接目标的密码

MySQL退出

  1. exit
  2. quit

MySQL目录结构

  1. MySQL安装目录配置文件

    • my.ini
  2. MySQL数据目录几个概念

    • 数据库:文件夹

    • 表:文件

    • 数据 :

SQL

  1. 什么是sql

    structured Query Language:结构化查询语言

    其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”

  2. SQL通用语法

    1. SQL 语句可以单行或多行书写,以分号结尾。
    2. 可使用空格和缩进来增强语句的可读性。
    3. MySQL 数据库的 SOL 语句不区分大小写,关键字建议使用大写
    4. 3 种注释
      • 单行注释:-- 注释内容
      • 或 # 注释内容(mysql 特有)
      • 多行注释:/*注释 *
  3. SQL分类

    • DDL(Data Definition Language)数据定义语言用来定义数据库对象 : 数据库,表,列等。关键字 : create,drop,alter 等
    • DML(Data Manipulation Language)数据操作语言用来对数据库中表的数据进行增删改。关键字 :insert,delete,update 等
    • DQL(Data Query Language)数据查询语言用来查询数据库中表的记录(数据)。关键字 : select,where 等
    • DCL(Data Control Language)数据控制语言(了解)用来定义数据库的访问权限和安全级别,及创建用户。关键字: GRANTREVOKE 等

DDL:操作数据库、表

  1. 操作数据库 :CRUD

    1. C(Create):创建

      1. 创建数据库 :
        • create database 数据库名称;
      2. 创建数据库,判断不存在,再创建.
        • create database if not exists
      3. 数据库名称;创建数据库,并指定字符集
        • create database 数据库名称 character set 字符集名
      4. 练习 : 创建db4数据库,判断是否存在,并制定字符集为gbk
        • create database if not exists db4 character set gbk;
    2. R(Retrieve):查询

      1. 查询所有数据库的名称:
        • show databases;
      2. 查询某个数据库的字符集:查询某个数据库的创建语句
        • show create database 数据库名称;
    3. U(Update):修改

      1. alter database 数据库名称 character set 字符集名称;
    4. D(Delete):删除

      1. 删除数据库
      • drop database 数据库名称;
      1. 判断数据库存在,存在再删除
      • drop database if exists 数据库名称;
    5. 使用数据库

      1. 查询当前正在使用的数据库名称
        • select database();
      2. 使用数据库
        • use 数据库名称;
  2. 操作表

    1. C(Create):创建

      1. 语法

        • create table 表名( 列名1 数据类型1, 列名2 数据类型2, ……

          列名n 数据类型n

          );

          • 注意 : 最后一列,不需要加逗号 (,)

          • 数据库类型

            image-20230720111531827

      2. 创建表

        image-20230720113311152

      3. 复制表

        • create table 表名 like 被复制的表名;
    2. R(Retrieve):查询

      1. 查询某个数据库中所有的表名称

        • show tables;
      2. 查询表结构

        • 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 表名 ;

DML:增删改表中数据

  1. 添加数据

    1. 语法 :

      • insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
    2. 注意:

      1. 列名和值要一一对应。

      2. 如果表名后,不定义列名,则默认给所有列添加值

        • insert into 表名 values(值1,值2,...值n);
      3. 除了数字类型,其他类型需要使用引号(单双都可以)引起来

  2. 删除数据

    1. 语法:

      • delete from 表名 [where 条件]
    2. 注意 :

      • 如果不加条件,则删除表中所有记录。
      • 如果要删除所有记录
        • delete from 表名;-- 不推荐使用。有多少条记录就会执行多少次删除操作
        • TRUNCATE TABLE 表名;--推荐使用,效率更高 先删除表,然后再创建一张样的表。
  3. 修改数据

    1. 语法 :

      • update 表名 set 列名1 = 值1,列名2 = 值2,... [where条件];
    2. 注意:

      • 如果不加任何条件,则会将表中所有记录全部修改

DQL查询表中的记录

select from 表名;

  1. 语法 :

    1. select
      • 字段列表
    2. from
      • 表名列表
    3. where
      • 条件列表
    4. group by
      • 分组字段
    5. having
      • 分组之后的条件
    6. order by
      • 排序
    7. limit
      • 分页限定
  2. 基础查询

    1. 多个字段的查询

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

      1. distinct
    3. 计算列

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

      1. as :也可以省略
  3. 条件查询

    1. where子句后跟条件
    2. 运算符
      • BETWEEN...AND

      • IN( 集合) or ...or...or...

      • LIKE 模糊查询

        • 占位符
          • _单个任意字符
          • %多个任意字符
      • IS NULL

      • and.或 &&

      • or 或ll

      • not 或!

DQL的查询语句

排序查询

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

聚合函数

将一列数据作为一个整体,进行纵向的计算

  1. count :计算个数

    • 一般选择非空的列:主键
    • count(*)
  2. max: 计算最大值

  3. min : 计算最小值

  4. sum : 计算和

  5. avg : 计算平均值

  • 注意: 聚合函数的计算,排除null值。
    • 解决方案:
      1. 选择不包含非空的列进行计算
      2. IFNULL函数

分组查询

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

分页查询

  1. 语法:limit 开始的索引,每页查询的条数;
  2. 公式:开始的索引当前的页码-每页显示的条数每页显示3条记录
    • SELECT * FROM student LIMIT 0,3; -- 第1页
    • SELECT * FROM student LIMIT 3,3; -- 第2页
    • SELECT * FROM student LIMIT 6,3; -- 第3页

约束

  1. 概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性。

  2. 分类:

    1. 主键约束:primary key
    2. 非空约束 : not null
    3. 唯一约束:unique
    4. 外键约束 : foreign key
  3. 非空约束:某一列的值不能为nu11

    1. 创建表时添加约束

      • CREATE TABLE stu( id INT, NAME VARCHAR(20) NOT NULL -- name为非空

        );

    2. 创建表完后,添加非空约束

      • ALTER TABLE StU MODIFY NAME VARCHAR(20) NOT NULL;
    3. 删除name的非空约束

      • ALTER TABLE STU MODIFY NAME VARCHAR(20);
  4. 唯一约束:

    1. 注意 :

      • 唯一约束可以有NULL值但是只能有一条记录为null
    2. 在创建表时,条件唯一约束

      • CREATE TABLE Stu( id INT,phone number VARCHAR(20) UNIQUE -- 手机号 );
    3. 删除唯一约束

      • ALTER TABLE stu DROP INDEX phone number;
    4. 在表创建完后,添加唯一约束

      • ALTER TABLE stu MODIFY phone number VARCHAR(20) UNIQUE;
  5. 主键约束:primary key。

    1. 注意 :

      1. 含义 : 非空且唯一
      2. 一张表只能有一个字段为主键
      3. 主键就是表中记录的唯一标识
    2. 在创建表时添加主键约束

      • create table stu( id int primary key,-- :给id添加主键约束 name varchar(20) );
    3. 删除主键

      • -- 错误 alter table stu modify id int ;
      • ALTER TABLE Stu DROP PRIMARY KEY;
    4. 创建完表后,添加主键

      • ALTER TABLE Stu MODIFY id INT PRIMARY KEY;
    5. 自动增长

      1. 概念:如果某一列是数值类型的,使用 auto increment 可以来完成值得自动增长

      2. 在创建表时,添加主键约束,并且完成主键自增长

        1. 在创建表时,添加主键约束,并且完成主键自增长

          • 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;
    6. 外键约束: foreign key 让表于表产生关系,从而保证数据的正确性。

      1. 在创建表时,可以添加外键

        • 语法 : create table 表名( …… 外键列 constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)

          );

      2. 删除外键

        • ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
      3. 创建表之后,添加外键

        • ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称)
      4. 级联操作

        1. 添加级联操作
          1. 语法 :ALTER TABLE 表名 ADD CONSTRAINT 外键名称
            • FOREIGN KEY (外键字段称) REFERENCES 表名称(表列名称) ON UPDATE CASCADE ON DELETE CASCADE
          2. 分类 :
            1. 级联更新:ON UPDATE CASCADE
            2. 级联删除:ON DELETE CASCADE

多表之间的关系

  1. 分类

    1. 一对一

      • 如 :人和身份证
      • 分析 : 一个人只有一个身份证,一个身份证只能对应一个人
    2. 一对多(多对一)

      • 如: 部门和员工水
      • 分析 : 一个部门有多个员工,一个员工只能对应一个部门
    3. 多对多

      • 如 : 学生和课程
      • 分析 : 一个学生可以选择很多门课程,一个课程也可以被很多学生选择
  2. 实现关系

    1. 一对多(多对一) :

      1. 如:部门和员工
      2. 实现方式: 在的一方建立外键,指向的一方的主键
    2. 多对多:

      1. 如 : 学生和课程
      2. 实现方式:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外键分别指向两张表的主键
    3. 一对一(了解):

      1. 如:人和身份证
      2. 实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键。一般直接添加到同一张表里

范式

  1. 概念 : 设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求

    1. 设计关系数据库时,蹲从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
    2. 目前关采数据库有六种范式:第一范式(1NF)、第二范式2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
  2. 分类

    image-20230721213048319

    1. 第一范式:每一列都是不可分割的原子数据项

      image-20230721213030019

    2. 第二范式:在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖)

      1. 几个概念

        1. 函数依赖:A-->B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A

          • 例如 : 学号-->姓名。(学号,课程名称) --> 分数
        2. 完全函数依赖: A--B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。

          • 例如 : (学号,课程名称) --> 分数
        3. 部分函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。

          • 例如 : (学号,课程名称) -- >姓名
        4. 传函数依赖:A-->B,B如果通过A(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性)的值可以确定唯一C属性的值,则称 C 传递函数依赖于A

          • 例如 : 学号-->系名,系名-->系主任
        5. 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码

          • 例如 该表中码为 : (学号,课程名称)
          • 主属性:码属性组中的所有属性
          • 非主属性:除过码属性组的属性

          image-20230721213110596

  3. 第三范式:在2NF基础上,任何非主属性不依赖于其它非主属性 (在2NF基础上消除传递依赖

数据库的备份和还原

  1. 命令行
    • 语法
      • 备份 mysqldump - uroot -root 数据库名称 >保存的路径
    • 还原
      1. 登录数据库
      2. 创建数据库 create database db1;
      3. 使用数据库 use db1;
      4. 执行文件 source 备份的文件路径
  2. 图形化工具

多表查询

  1. 查询语法

    • selcet
      列名列表

      form 表名列表 where ……

  2. 准备sql

    image-20230721215110640

  3. 笛卡尔积

    • 有两个集合A,B.取这两个集合的所有组成情况
    • 要完成多表查询,需要消除无用的数据
  4. 多表查询的分类

    1. 内连接查询 :

      1. 隐式内连接:使用where条件消除无用数据

        1. image-20230721220736276
      2. 显示内连接

        1. 语法: select 字段列表 form 表名1 inner join 表名2 on 条件;

          image-20230722072134254

      3. 内连接查询

        1. 从哪些表中查询数据
        2. 条件是什么
        3. 查询那些字段
    2. 外链接查询:

      1. 左外连接:
        • 语法:select 字段列表 form 表1 left [outer] join 表2 on 条件;
        • 查询的是左表所有数据以及其交集部分
      2. 右外连接:
        • select 字段列表 form 表1 right [outer] join 表2 on 条件;
        • 查询的是右表所有数据以及其交集部分
    3. 子查询 :

      1. 概念:查询中嵌套查询,嵌套的那个查询被称为子查询

        image-20230722074220132

      2. 子查询的不同情况

        1. 子查询的结果是单行单列的

          • 子查询可以作为条件,使用运算符去判断
        2. 子查询的结果是多行单列的

          • 子查询的结果可以作为条件,使用in来判断
        3. 子查询的结果是多行多列的

          • 子查询的结果是多行单列的

事务

  1. 事务的基本介绍

    1. 概念

      • 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
    2. 操作

      • 开启事务 : start transaction;
      • 回滚:rollback;
      • 提交:commit;
    3. 例子

      image-20230722111259409

    4. MySQL数据库中事务默认自动提交

      1. 事务提交的两种方式
        1. 自动提交
          • mysql就是自动提交的
          • 每条DML(增删改)语句会自动提交一次事务
        2. 手动提交
          • oracle 数据库默认是手动提交事务
          • 需要先开启事务,再提交
      2. 修改事务的默认方式:
        1. 查看事务的默认提交方式 SELECT @@autocommit;-- 1 代表自动提交 0 代表手动提交
        2. 修改默认提交方式: 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:串行化
        • 可以解决所有的问题
    4. 注意:隔离级别从小到大安全性越来越高,但是效率越来越低;
    5. 数据库查询隔离级别 :
      • select @@tx_isolation; 老版本叫tx isolation,现在新版本叫transaction_isolation
    6. 数据库设置隔离级别 :
      • set global transaction isolation level 级别字符串;

DCL:管理用户,授权

  1. 管理用户

    1. 添加用户

      1. 语法:
        • CREATE USER '用户名'@'主机名'IDENTIFIED BY '密码';
    2. 删除用户

      1. 语法:
        • DROP USER ‘用户名’@‘主机名;
    3. 修改用户密码

      1. 语法:

        • UPDATE USER SET PASSWORD = PASSWORD(‘新密码’) WHERE USER = ’用户名‘;

          UPDATE USER SET PASSWORD = PASSWORD('lihuibear') WHERE USER ='bear'; flush privileges;//不加此句需要重启服务器;

        • SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123');

        • mysql中忘记了root用户的密码 ?

          1. cmd -- > net stop mysql 停止mysq1服务
            • 需要管理员运行该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;
      3. 通配符:% 表示可以在任意主机使用用户登录数据库
  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'@'%';

JDBC

概念

  1. 概念

    • Java DataBase Connectivity Java数据库连接,Java语言操作数据库

    • JDBC本质

      • 其实是官网(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商可以去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

      image-20230722151414973

快速入门

  1. 快速入门:

    1. 步骤

      1. 导入驱动jar包 mysql-connnector-java-x.x.x-bin.jar

        1. 复制mysql-connnector-java-x.x.x-bin.jar包到项目libs目录下
        2. 右键 Add as library
      2. 注册驱动

      3. 取数据库的连接对象 Connection

      4. 定义sql

      5. 取执行sql语句的对象 Statement

      6. 执行sql,接收返回结果

      7. 处理结果

      8. 释放资源

        java
        //注册驱动	
        Class.forName("com.mysql.jdbc.Driver");
        
        //取数据库的连接对象 Connection
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");
        //定义sql
        String sql = "update account set balance = 500 where id =1";
        //取执行sql语句的对象 Statement    
        Statement stmt = conn.createStatement();
        //执行sql,接收返回结果  
        int count = stmt.executeUpdate(sql);
        System.out.println(count);
        //释放资源  
        stmt.close();      
        conn.close();

详解各个部分

  1. 详解各个部分

    1. DriverManager: 驱动管理对象

      * 功能:
          1. 注册驱动:告诉程序该使用哪一个数据库驱动jar包
              static void registerDriver(Driver driver): 注册给定的驱动程序 DriverManager
              写代码使用: Class.forName("com.mysql.jdbc.Driver");
              通过查看源码发现: 在com.mysql.jdbc.Driver类中存在静态代码块
              `static {`
                  `try {`
                      `DriverManager.registerDriver(new Driver());`
                  `} catch (SQLException var1) {`
                      `throw new RuntimeException("Can't register driver!");`
                  `}`
              `}`
       
              注意:**mysql5之后的驱动jar包可以省略注册驱动的步骤**
          2. 获取数据库连接:
              * 方法: static Connerction getConnection(String url, String user, String password)
              * 参数:
                  * url:指定连接的路径
                      * 语法: jdbc:mysql://ip地址(域名):端口号/数据库名称
                      * 例子: jdbc:mysql://localhost:3306/db1
                      * 细节: 如果连接的是本机mysql服务器,并且mysql服务默认端口为3306,则url可以简写为jdbc:mysql:///数据库名称
                  * user:用户名
                  * password:密码
      
    2. Connection: 数据库连接对象 1. 功能: 1. 获取执行sql的对象 * Statement createStatement() * PreparedStatement prepareStatement(String sql) 2. 管理事务: - 开启事务: void setAutoCommit(boolean autoCommit) : 调用该方法设置参数为false,即开启事务 - 提交事务: void commit() - 回滚事务: void rollback()

    3. Statement: 执行sql的对象 1. 执行sql 1. booleann execute(String sql) : 可以执行任意的sql (了解)
      2. int executeUpdate(String sql) : 执行DML(insert、update、delete)语句、DDL(create、alter、drop)语句 * 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0执行成功 反之失败 3. ResultSet executeQuery(String sql) : 执行DQL(select)语句 返回的结果与 executeUpdate 不一样 2. 练习 1. account表 添加一条记录
      2. account表 修改记录 3. account表 删除一条记录

    4. ResultSet: 结果集对象,封装查询结果

      1. next():游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),返回boolean值
         
      2. getXxx(参数):获取数据
         
           * Xxx代表数据类型	如: int getInt()
         
           * 参数:
             1. int: 代表列的编号,从1开始
             2. String: 代表列名称
         
      3. 注意:
         
           * 使用步骤:
               1. 游标向下移动一行
               2. 判断是否有数据
               3. 获取数据
               while(rs.next()){...}
      
      markdown
      练习:
         * 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。
             1. 定义Emp类
             2. 定义方法 public List<Emp> findAll(){}
             3. 实现方法 select * from emp;
    5. PreparedStatement: 执行sql的对象

      1. SQL注入问题: 在拼接SQL时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题

        1. 输入用户随便,输入密码:a' or 'a' = 'a
        2. sql : select * from USER where username = 'xxx' and password = 'a' or 'a' = 'a';
      2. 解决sql注入问题:使用PreparedStatement来解决

      3. 预编译的SQL:参数使用?作为占位符

      4. 步骤:

        1. 导入驱动jar包 mysql-connnector-java-x.x.x-bin.jar
        2. 注册驱动
        3. 获取数据库的连接对象 Connection
        4. 定义sql
          • 注意:sql的参数使用?作为占位符。如: select * from user where username = ? and password = ?
        5. 获取执行sql语句的对象 PreparedStatement Connection.preparedStatement(String sql)
        6. 给?赋值:
          1. 方法:setXxx(参数1, 参数2)
            • 参数1: ?的位置编号 从1 开始
            • 参数2: ?的值
        7. 执行sql,接收返回结果,不需要传递sql语句
        8. 处理结果
        9. 释放资源
      5. 注意:后期都会使用PreparedStatement来完成增删改查的所有操作

        1. 可以防止sql注入
        2. 效率更高

JDBC工具类

  1. JDBC工具类

    1. 目的:简化书写
    • 分析:
      1. 注册驱动也抽取
      2. 抽取一个方法获取连接对象
        • 需求:不想传递参数(麻烦),还得保证工具类的通用性。
        • 解决:配置文件 jdbc.properties url= user= password=
      3. 抽取一个方法释放资源
    1. 练习: * 需求: 1. 通过键盘录入用户名和密码 2. 判断用户是否登录成功 * select * from USER where username = '' and password = ''; * 如果这个sql有查询结果,则成功,反之失败

    JDBC管理事务

  2. JDBC管理事务

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

数据库连接池

  1. 概述

    1. 其实就是一个容器(集合),存放数据库连接的容器
    2. 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
  2. 好处:

    1. 节约资源
    2. 用户访问高效
  3. 实现:

    1. 标准接口:DataSource javax.sql包下的
      1. 方法:
      • 获取连接:getConnection()
        • 归还连接:Connection.close() 如果连接对象Connection是从连接池中获取的,那么调用Connection.close(),则不会再关闭连接,而是归还连接。
      1. 一般我们不去实现它,有数据库厂商来实现
        1. C3P0:数据库连接池技术
        2. Druid:数据库连接池实现技术,由阿里巴巴提供的
  4. C3P0数据库连接池技术

    1. 步骤:
      1. 导入jar包 (两个)
        • 不要忘记导入数据库的驱动jar包
      2. 定义配置文件
        1. 名称:c3p0.properties或者c3p0-config.xml
        2. 路径:直接将文件放在src目录下即可
      3. 创建核心对象 :数据库连接池对象 ComboPooledDataSource
      4. 获取连接:getConnection()
  5. Druid:数据库连接池实现技术,由阿里巴巴提供的

    1. 步骤:
      1. 导入jar包 druid-1.0.9.jar
      2. 定义配置文件: - 是properties形式的 - 可以叫任意名称,可以放在任意目录下
      3. 加载配置文件 Properties
      4. 获取数据库连接池对象:通过工厂类来获取 DruidDataSourceFactory
      5. 获取连接:getConnection()
    2. 定义工具类
      1. 定义一个类 JDBCUtils
      2. 提供静态代码块加载配置文件,初始化连接池对象
      3. 提供方法
        1. 获取连接方法:通过数据库连接池获取连接
        2. 释放资源
        3. 获取连接池的方法

Spring JDBC

  1. S pring框架对JDBC的简单封装。提供了JDBC Template对象简化JDBC的开发
  2. 步骤:
  3. 导入jar包
  4. 创建JdbcTemplate对象。依赖于数据源DataSource
* JdbcTemplate template = new JdbcTemplate(ds);

3. 调用JdbcTemplate的方法来完成CRUD的操作
 4. update(): 执行DML语句。增、删、改语句
 5. queryForMap(): 查询结果,将结果集封装为Map集合,将列名作为key,将值作为value,将这条记录封装为value

  * 注意:这个方法查询的结果集长度只能是1
3. queryForList(): 查询结果,将结果集封装为list集合
  * 注意:将每一条记录封装为Map集合,再将Map集合装载在List集合中
4. query(): 查询结果,将结果封装为JavaBean对象
  * query方法的参数:RowMapper
  	* 一般使用BeanPropertiyRowMapper实现类。可以完成数据到JavaBean的自动封装。
  	* new BeanPropertyRowMapper<类型>(类型.class)
5. queryForObject(): 查询结果,将结果封装为对象
  * 一般用于聚合函数的查询  

4. 练习:

* 需求:
	1. 修改1号数据的 salary 为 10000
	2. 添加一条记录
	3. 删除刚才添加的记录
	4. 查询id为1的记录,将其封装为Map集合
	5. 查询所有的记录,将其封装为List集合
	6. 查询所有记录,将其封装为Emp对象的List集合
	7. 查询总的记录数

web概念

  1. JavaWeb:

    1. 使用Java语言开发基于互联网的项目
  2. 软件的架构:

    1. C/S:Client/Server 客户端/服务器端

      • 在用户本地有一个客户端程序,在远程有一个服务器端程序
      • 如:QQ,迅雷...
      • 优点:
        1. 用户体验好
      • 缺点:
        1. 开发、安装、部署、维护麻烦
    2. B/S:Browser/Server 浏览器/服务器端

    • 只需要一个浏览器,用户通过不同的网址(URL),可以访问远程不同的服务器端程序

    • 优点:

      1. 开发、安装、部署、维护简单
    • 缺点:

      1. 如果应用过大,用户的体验可能会受到影响
      2. 对硬件要求过高
    1. B/S架构详解
    • 资源分类:

      1. 静态资源:
      • 使用静态网页开发技术发布的资源
      • 特点:
        • 所有用户访问,得到的结果是一样的
        • 如:文本、图片、音频、视频,HTML,CSS,JavaScript
        • 如果用户请求的是静态资源,那么服务器会直接将静态资源发送给浏览器,浏览器中内置了静态资源的解析引擎
      1. 动态资源:
      • 使用动态网页技术发布的资源
      • 特点:
        • 所有用户访问,得到的结果可能不一样
        • 如:jsp/servlet,php,asp...
        • 如果用户请求的是动态资源,那么服务器将会执行动态资源,转换为静态资源,再发送给浏览器

      我们要学习动态资源,必须先学习静态资源!

      1. 静态资源:

      2. HTML:用于搭建基础网页,展示页面的内容

      3. CSS:用于美化页面,布局页面

      4. JavaScript:控制页面的元素,让页面有一些动态的效果

Released under the MIT License.