Day01
##1.Junit单元测试
使用步骤:
1.定义一个测试类:测试用例
2.定义测试方法:可以独立运行
3.给方法加注解(@test)
4.导入junit依赖环境
5.判定结果:绿色成功,红色失败,一般我们会使用断言操作来处理结果:Assert.assertEquals(期望的结果,result)。
补充:
@Before:修饰的方法会在测试方法之前自动执行
@After:修饰的方法会在测试方法执行之后自动被执行
##2.反射
反射:框架设计的灵魂
框架:本成品软件,可以再框架的基础上进行软件开发,简化编码
反射:将类的各个组成部分封装为其他对象,这就是反射机制。
好处:
1.可以再程序的运行过程中,操作这些对象。
2.可以解耦,提高程序的可扩展性。
class对象
** 获取class对象方式
1.Class.forName("全类名"):将字节码文件加载进内存,返回Class对象。--》这种方式多用于配置文件。读取文件加载类
2.类名.class:通过类名的属性class获取 --》多用于参数的传递
3.对象.getClass()。--》多用于对象的获取字节码的方式
结论:同一个字节码文件再一次程序运行过程中,只会被加载一次,不论通过哪种方式获取的Class对象都是同一个。
Class personClass = Person.class
**1.Field:成员变量
1.personClass.getFields();获取所有的public修饰的成员变量。
2.personClass.getDeclareFields();获取所有的成员变量
操作:
1.设置值
2.获取值
3.忽略访问权限修饰符的安全检查 setAccessible(true):暴力反射
**2.constructor:构造方法
Constructor constructor1 = personClass.getConstructor();//也可以带参数
object person1 = constructor1.newInstance();
constructor1.setAccessible(true) //暴力反射
使用空参数构造方法创建对象,操作可以简化,Class对象的newInstance方法
**3.Mthod 获取方法
获取所有public修饰的方法 Method[] methods = personClass.getMethods();
获取指定方法的名称:Method eat_method personClass.getMethod(name:"eat");
带参数: Method eat_method2 = personClass.getMethod(name:"eat",String.class)
执行方法:
person p = new Person();
eat_method.invoke(p);
eat_method2.invoke(p,...args:“饭”)
##3.注解
*概念:1.JDK1.5之后的新特性。2.说明程序的3.使用注解:@注释名称
*作用分类:1.编写文档:通过代码里标识的注释生成文档(生成doc文档)2.代码分析:通过代码里面标识的注释对代码进行分析(使用反射)3.编译检查:通过代码里表示的注释让编译器能够实现基本的编译检查(override)
1.JDK中预定的一些注解
*@Override :检测被该注解标注的方法是否是继承自父类(接口)的
*@Deprecated: 被该注解标注的内容,表示已过时
*@SupperssWarnings:压制警告 --》一般传递参数all @SupperssWarnings("all")
2.自定义注解
格式:
元注解
public @interface 注解名称
*本质 :就是一个接口,该接口默认继承Annotation接口
*属性:接口中的抽象方法
*要求:
1.属性的返回值类型有下列取值
*基本数据类型
*String
*枚举
*注解
*以上类型的数组
2.定义了属性,在使用时需要给属性赋值
1).如果定义属性时,使用default关键字给属性默认初始值,则使用注解时,可以不进行属性赋值。
2).如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
3).数组赋值时,使用{}包裹,如果数组中只有一个值,则{}省略。
*元注解
*@Target:描述注解能够作用的位置
*TYPE:可以作用于类上
*METHOD
*FIELD:可以作用于成员变量上
*@Retention:描述注解被保留的阶段
*@Retention(RetentionPolicy,RUNTIME):当前被描述的注释,会保留到class字节码文件中,并被JVM读取到
*@Documented:描述注解是够被抽取到api文档中
*@Inherited:描述注解是否被子类集成
3.在程序中使用(解析)注解
小结:
1.以后大多数时候,我们会使用注解,而不是自定义注解
2.注解给谁用?
1.编译器
2.给解析程序用
3.注解不是程序的一部分
Day02
##1.数据库的基本概念:
1.数据库的英文单词:DataBase 简称:DB
2.什么是数据库?
用于存储和管理数据的仓库
3.数据库的特点:
1.持久化存储数据,其实数据库就是一个文件系统
2.方便存储和管理数据
3.使用了统一的方式操作数据库
#MySQL的安装与卸载
1.安装
2.卸载
1.去mysql的安装目录找到my.ini文件
*复制 datadir=“C:ProgramData/MySQL Server 5.5/Data/”
2.卸载MySQL
3.删除C:ProgramData目录下的MySQL文件夹。
3.配置
*MySQL服务启动
1.手动
2.cmd-->services.msc 启动mysql服务
3.使用管理员打开cmd
*net start mysql:启动mysql服务
*net stop mysql :关闭mysql服务
*MySQL登录和退出
1)登录
1)退出 1.exit 2.quit
*MySQL目录结构
1.MySQL安装目录
*配置文件 my.ini
2.MySQL 数据目录
*几个概念
*数据库
*表
*数据
#SQL
##2.什么是SQL?
structured Query Language:结构化的查询语言,其实就是定义了操作所有关系型数据库的规则,每一种数据库操作的方式存在不一样的地方,成为“方言”。
##3.SQL通用语法
1.SQL 语句可以单行或多行书写,以分号结尾。
2.可使用空格和缩进来增强语句的可读性。
3.MySQL 数据库的SQL语句不区分大小写,关键字建议使用大写。
4.3中注释
* 单行注释 ; -- 注释内容 或# 注释内容(mysql特有)
*多行注释; /*注释内容*/
##4.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,REOKE等。
##5.DDL:操作数据库、表
1.操作数据库:CRUD
1.C(Create):创建
*创建数据库:
*create database 数据库名称;
*创建数据库判断不存在再创建
*create database if not exists 数据库名称;
*创建数据库,并制定字符集
*create database 数据库名称 character set 字符集名;
*创建db4数据库,判断是否存在,并指定字符集为gbk
*create database if not exits db4 character set gbk;
2.R(Retrieve):查询
*查询所有数据库的名称: show databases;
*查询某个数据库的字符集:查询某个数据库的创建语句: show create database 数据库名称;
3.U (Update):修改
*修改数据库的字符集
*alter database 数据库名称 character set utf8;
4.D(Delete):删除
*删除数据库
*drop database 数据库名称;
*判断数据库是否存在,存在再删除
*drop database if exists 数据库名称;
5.使用数据库
*查询当前正在使用的数据库名称
*select database();
*使用数据库
*use 数据库名称;
2.操作表
1.C(Create):创建
1.语法:
create table 表名(列名1 数据类型1,
列名2 数据类型2,
...
列名n 数据类型n);
* 注意:最后一列,不需要加逗号
*数据库类型:
1.int:整数类型
*age int
2.double:小数类型
*score double(5,2)
3.date:日期,只包含年月日,yyyy-MM-dd
4.datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
5.timetamp: 时间戳类型 包含年月日时分秒 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 timetamp)
*复制表
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 表名;
*客户端图形化工具:SQLYog
##6.DML :增删改表中数据
1.添加数据
*语法
*insert into 表名(列名1,列名2,列名3,...列名n)values(值1,值2,...值n)
注意:1.列名要和value值一一对应。
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.如果不加任何条件,则会将表中所有的记录全部修改
## 7.DQL :查询表中的记录
* select *from 表名;
1.语法:
select
字段列表
from
表名类表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
2.基础查询
1.多个字段的查询
select 字段名1,字段名2,... from 表名
注意:
*如果查询所有字段,则可以使用*来替代字段列表。
2.去除重复
*distinct
3.计算列
*一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
*ifnull(表达式1,表达式2);
表达式1:哪个字段需要判断是否为null,表达式2表示如果该字段为null时的替换值
4.起别名
*as :as 也可以省略
select *from student;//查询student表所有值
select address form student; //查询stuent表中的address
select DISTINCT address form student; //查询student表中的address,并去除重复的地址
select distinct name,address from student; //查询表中的name和address,并去除重复的名字
select name,math, english,math +english From student; //查询name、math、english,并计算math和english的和
//如果有null值,则计算结果都为null
select name,math,english,math +IFNULL(english,0) From student;
//起别名
select name,math,english,math +IFNULL(english,0) AS 总分 From student;
select name,math 数学,english 英语,math +IFNULL(english,0) AS 总分 From student;
3.条件查询
1.where子句后跟条件
2.运算符
--//查询年龄大于20岁
select *from student where age >20;
--查询年龄不等于20岁
select *from student where age !=20
select *from student where age<>20;
-- 查询年龄大于等于20 小于等于30
select *from student where age >=20 && age <=30;
select *from student where age >=20 AND age <=30;
select *from student where age BETWEEN 20 AND 30;
--查询年龄22岁,18岁 25岁的信息
select *from student WHERE age = 22 OR age == 18 OR age ==25
select *from student WhERE age IN (22,18,25)
--查询英语成绩为null
SELECT * FROM student WHERE english = NULL; --这种写法是不对的,null值不能使用=(!=)判断
SELECT * FROM student WHERE english IS NULL;
--查询英语成绩不为null
SELECT * FROM student WHERE english IS NOT NULL;
模糊查询,
--例:查询姓马的有哪些?
select * from student WHERE NAME LIKE '马%';
--例:查询姓名中第二个字是化的人
select * from student WHERE NAME LIKE '_化%';
--例:查询姓名中是3个字的人(三个下划线)
select * from student WHERE NAME LIKE '___';
--例:查询姓名中包含马的人
select * from student WHERE NAME LIKE '%马%';
Day03
##1.DQL:查询语句
1.排序查询
*语法:order by 子句
*order by 排序字段1 排序方式1,排序字段2 排序方式2...
*排序方式:
*ASC :升序,默认的。
*DESC:降序
SELECT * FROM student ORDER BY math ASC,english DESC;
*注意:
*如果有多个排序条件,则当前条件值一样时,才会判断第二条件。
2.聚合函数:将一列数据作为一个整体,进行纵向计算。
1.count:计算个数
1.一般选择非空的列:主键
2.count(*)这种不推荐
2.max:计算最大值
select MAX(math) FROM student;
3.min:计算最小值
select MIN(math) FROM student;
4.sum:计算和
select SUM(math) FROM student;
5.avg:计算平均值
select AVG(math) FROM student;
*注意:聚合函数的计算,不包括空值。
解决方法:1. select count (ifnull(english,0))from student;
2. 选择不包含非空的列进行计算
3.分组查询
*语法: group by 分组字段;
--按照性别分组,分别查询男、女同学的平均分
select sex,AVG(math)from student GROUP BY sex;
注意:1.分组后查询后的字段,分组字段、聚合函数。2.where 和having的区别?(1.where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来。2.where后不可以跟聚合函数,having可以进行聚合函数的判断。)
--按照性别分组,分别查询男、女同学的平均分,要求:分数低于70分的人不参与分组
select sex,AVG(math)FROM student WHERE math > 70 GROUP BY sex;
--按照性别分组,分别查询男、女同学的平均分,要求:分数低于70分的人不参与分组,分组之后人数要大于2个人
select sex,AVG(math)FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id)> 2;
--按照性别分组,分别查询男、女同学的平均分,人数,要求:分数低于70分的人不参与分组,分组之后人数要大于2个人
select sex,AVG(math),COUNT(id)FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id)> 2;
起别名,然后后面用别名判断
select sex,AVG(math),COUNT(id)renshu FROM student WHERE math > 70 GROUP BY sex HAVING renshu> 2;
4.分页查询
*1.语法:limit 开始的索引,每页查询的条数;
--假如每页显示3条
SELECT *FROM student LIMIT 0,3;--第一页
SELECT *FROM student LIMIT 3,3;--第二页
*2公式:开始的索引=(当前的页码-1)*每页显示的条数
*3.limit是一个MySQLde “方言”
## 2.约束
*概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性。
*分类:
1.主键约束:primary key
2.非空约束: not null
3.唯一约束:unique
4.外键约束:foreign key
*非空约束 not null ,值不能为null
--1.创建表添加非空约束
create table stu(id INT,NAME VARCHAR(20) NOT NULL);
--2.创建表完后,添加非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
--3.删除NAME的非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
*唯一约束 unique,值不能重复
--对phone_number添加唯一约束 (unique)
CREATE TABLE stu(id INT,phone_number VARCHAR(20) NUIQUE)
*注意:MySQL中,唯一约束限定的列值可以有多个null
--删除唯一约束
ALTER TABLE stu DROP INDEX phone_number;
--在创建表之后添加唯一约束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
*主键约束:primary key
1.注意:
1.含义:非空且唯一。
2.一张表只能有一个字段为主键。
3.主键就是表中记录的唯一标识。
2.在创建表时,添加主键约束,给id添加主键约束
CREATE TABLE stu(id INT PRIMARY KEY,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,NAME VARCHAR(20));
--删除自动增长
ALTER TABLE stu MODIFY id INT;
--添加自动增长
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
*外键约束: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.添加级联的操作
语法:
--级联更新
alter table 表名 add constraint 外键名称 foreign key (外键字段名称) references 主表名称(主表列名称) ON UPDATE CASCADE;
--级联删除
alter table 表名 add constraint 外键名称 foreign key (外键字段名称) references 主表名称(主表列名称) ON DELETE CASCADE;
##数据库的设计
##3.多表之间的关系
1.一对一:
*如:人和身份证
*分析:一个人只有一个身份证,一个身份证只能对应一个人
2.一对多(多对一):
*如:部门和员工
*分析:一个部门有多个员工,一个员工只能对应一个部门
3.多对多:
*如:学生和课程
*分析:一个学生对应多门课程,一个课程也可以被很多学生选择
2.实现关系:
1.一对一(了解):
*如:人和身份证
*实现方式:一对一关系实现,可以再任意一方添加唯一外键指向另一方的主键。
2.一对多(多对一):
*如:部门和员工
*实现方式:再多的一方建立外键,指向一的一方的主键。
3.多对多:
*如:学生和课程
*实现方式:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外键,分表指向两张表的主键
##4.范式
*概念:设计数据库时,需要遵循的一些规范。要遵循后面的范式要求,必须先遵循其前边的所有范式要求。
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同规范要求成为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF,又称完美范式)。
*分类
1、第一范式(1NF):每一列都是不可分割的原子数据项
2、第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主流属性对主码的部分函数依赖)
*几个概念
1.函数依赖:A-->B,如果通过A的属性(属性组)的值,可以确定唯一B属性的值。则称B依赖A。
例如:学号-->姓名。 (学号,课程名称) -->分数
2.完全函数依赖: A-->B, 如果A是一个属性组,则B属性值的确定需要依赖A属性组中所有的属性值
例如:(学号,课程名称) -->分数
3.部分函数依赖:A-->B,如果A是一个属性组,则B属性值的确定只需要依赖于A属性组中的某一些值即可。
例如:(学号,课程名称) -->姓名
4.传递函数依赖:A-->B, B-->C,如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性的值可以确定唯一C属性的值,则称C传递函数依赖A
例如:学号 -->系名,系名-->系主任
5.码:如果在一张表中,一个属性或属性组,被其他所有属性完全依赖,则称这个属性(属性组)为该表的码.
例如:该表码为:(学号,课程名称)
*主属性:码属性组中的所属性。
*非主属性:除过码属性组的属性。
3、第三范式(3NF)
##5.数据库的备份和还原
1.命令行
*语法: mysqldump -u用户名 -p密码 数据库名称>保存的路径
*还原:
1.登录数据库
2.创建数据库
3.使用数据库
4.执行文件
2.图形化工具
#Day04
*多表查询
查询语法:
select
列名列表
from
表名列表
where....
*笛卡尔积:
*有两个集合A,B,取这两个集合的所有组成情况
*要完成多表查询,需要消除无用的数据
*多表查询分类
1.内连接查询:
1.隐式内连接
--查询员工表,部门表所有属性名
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'
2.显式内连接
*语法:select 字段列表 form 表名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'
3.内连接查询
1.查询哪些字段
2.从哪些表中查询数据
3.条件什么
2.外连接查询:
1.左外连接
*语法:select 字段列表 from 表1 left [outer] join 表2 on 条件
查询的是左表所有数据以及其交集部分
2.右外连接
*语法:select 字段列表 from 表1 right [outer] join 表2 on 条件
查询的是右表数据及其交集部分
3.子查询:
*概念:查询中嵌套查询,称嵌套
--查询工资最高的员工信息
--1.查询最高的工资是多少
SELECT MAX(salary)FROM emp;
--2.查询员工信息,并且工资等于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);
--查询财务部和市场部所有的员工信息
SELECT id FROM dept WHERE NAME =‘财务部’ OR NAME= ‘市场部’;
SELECT * FROM emp WHERE dept_id 3 OR dept_id =2;
或者用in SELECT *FROM emp WHERE dept_id IN (3,2)
2.子查询的结果是多行单列的:
3.子查询的结果是多行多列的:
#事务
1.事务的基本介绍
1.概念:
*如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
2.操作:
1.开启事务:start transaction;
2.回滚:rollback;
3.提交:commit;
3.使用Connection对象来管理事务
*开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为fasle,即开启事务
*在执行sql之前开启事务
*提交事务:commit()
*当所有sql都执行完提交事务
*回滚事务:rollback()
* 在catch中回滚事务
4.MySQL 数据库中事务默认自动提交
*一条DML(增删改)语句会自动提交一次事务
*事务提交的两种方式:
*自动提交:
*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;
*数据库设置隔离级别:
*set global transaction isolation level 级别字符串;
##DCL
*SQL分类
1.DDL :操作数据库和表
2.DML :增删改表中数据
3.DQL :查询表中数据
4.DCL : 管理用户,授权
*DBA:数据库管理员
*DCL:管理用户,授权
1.管理用户
1.添加用户
CREATE USER ‘用户名’ @‘主机名’ IDENTIFIED BY ‘密码’
CREATE USER ‘zhangsan’ @‘localhost’ IDENTIFIED BY ‘123’;
CREATE USER ‘lisi’ @‘%’ IDENTIFIED BY ‘123’;
2.删除用户
*语法:DROP USER ‘用户名’ @‘主机名’;
3.修改用户密码
UPDATE USER SET PASSWORD =PASSWORD('新密码') WHERE USER = ‘用户名’;
SET PASSWORD FOR ‘用户名’@‘主机名’ =PASSWORD(‘新密码’)
*mysql 中忘记了root用户名密码?
1. cmd -- > net stop mysql 停止mysql服务
*需要管理员运行该cmd
2.使用无验证方式启动mysql服务: mysql --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 ‘用户名’@‘主机名’;
SHOW GRANTS FOR ‘lisi’@‘%’;
2.授予权限
GRANT 权限列表 ON 数据库名.表名 TO ‘用户名’@‘主机名’
GRANT SELECT,DELETE,UPDATE ON db3.account TO ‘lisi’@‘%’;
--给张三用户授予所有权限,在任意数据库任意表上
GRANT ALL ON *.* TO 'zhangsan'@'localhost';
3.撤销权限:
--撤销权限:
revoke 权限列表 on 数据库名.表名 FROM '用户名'@'主机名'
RWVOKE UPDATE ON db3.'account' FROM 'lisi'@'%';
##D05
1.JDBC基本概念
2.快速入门
3.对JDBC中各个接口和类详解
##JDBC:
1.概念:Java DataBase Conectivity Java 数据库连接,Java语言操作数据库
*JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包,我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
2.快速入门
*步骤:
1.导入驱动jar包 mysql -connector -java-5.1.37-bin.jar
1.复制mysql -connector -java-5.1.37-bin.jar 到项目的libs目录下
2.右键 -->add as library
2.注册驱动
3.获取数据库的连接对象 connection
4.定义sql
5.获取执行sql语句的对象 statement
6.执行sql,接受返回结果
7.处理结果
8.释放资源
例子:
public class JdbcDemo1 {
public static void main(String[] args) throws Exception {
//1.导入驱动jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver'");
//3.获取数据库连接对象
Connection conn = DriverManager.getConnection(url:"jdbc:mysql://localhost:3306/db3",user:"root",password:"root");
//4.定义sql语句
String sql = "update account set balance = 500 where id =1";
//5.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//6.执行sql
int count stmt.executeUpdate(sql);
//7.处理结果
System.out.printIn(count);
//释放资源
stmt.close();
conn.close();
}
}
3.详解各个对象
1.DriverManager:驱动管理对象
*功能:
1.注册驱动(告诉程序该使用哪一个数据库驱动jar)
static void registerDriver(Driver driver) :注册与给定的驱动程序DriverManager。
写代码使用 :Class.forName("com.mysql.jdbc.Driver");
通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。
2.获取数据库连接
*方法: static Connection getconnection(String url,String user,String password)
*参数:
*url 指定连接的路径
*语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
*例子:jdbc:mysql://localhost:3306/db3
*细节:如果连接的是本机mysql服务器,并且mysql服务器默认端口是3306,则url可以简写为jdbc:mysql:///db3
2.Connection:数据库链接对象
1.功能:
1.获取执行sql 的对象
*Statement createStatement()
*preparedStatement prepareStatement(String sql)
2.管理事务:
*开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false。即开启事务
*提交事务:commit()
*回滚事务:rollback()
3.statement:执行sql的对象
1.执行sql
1.boolean 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)语句
练习1:account 表添加一条记录
public class JdbcDemo2 {
public static void main(String[] args) throws Exception {
try {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver'");
//2.定义sql
String sql = "insert into accont values(null,'王五',3000)";
//3.获取数据库连接对象
Connection conn = DriverManager.getConnection(url:"jdbc:mysql://localhost:3306/db3",user:"root",password:"root");
//4.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//5.执行sql
int count stmt.executeUpdate(sql);
//6.处理结果
System.out.printIn(count);
if(count >0){
System.out.printIn(添加成功);
}else {
System.out.printIn("添加失败!");
}
}catch(ClassNotFoundException e){
e.printSatckTrace();
}catch(SQLException e){
e.printSatckTrace();
}finally{
//7释放资源
//避免空指针异常
if(stmt != null){
try{
stmt.close();
}catch(SQLException e){
e.printSatckTrace();
}
}
if(conn != null){
try{
conn.close();
}catch(SQLException e){
e.printSatckTrace();
}
}
}
}
}
练习2:创建一张表
public class JdbcDemo3 {
public static void main(String[] args) throws Exception {
Connection conn = null;
Statement stmt = null;
try {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver'");
//2.定义sql
String sql = "create table student (id int, name varchar(20))";
//3.获取数据库连接对象
conn = DriverManager.getConnection(url:"jdbc:mysql://localhost:3306/db3",user:"root",password:"root");
//4.获取执行sql的对象 Statement
stmt = conn.createStatement();
//5.执行sql
int count stmt.executeUpdate(sql);
//6.处理结果
System.out.printIn(count);
}catch(ClassNotFoundException e){
e.printSatckTrace();
}catch(SQLException e){
e.printSatckTrace();
}finally{
//7释放资源
//避免空指针异常
if(stmt != null){
try{
stmt.close();
}catch(SQLException e){
e.printSatckTrace();
}
}
if(conn != null){
try{
conn.close();
}catch(SQLException e){
e.printSatckTrace();
}
}
}
}
}
4.ResultSet : 结果集对象,封装查询结果
1.next():游标向下移动一行
2.getXxx(参数):获取数据
*Xxx:代表数据类型 如:int getInt(), String getString()
*参数:
1.int:代表列的编号,从1开始 如:getString(1)
2.String:代表列名称。如: getDouble("balance")
*注意:
*使用步骤:
1.游标向下移动一行
2.判断是否有数据
3.获取数据
*练习:
*定义一个方法, 查询emp表的数据,并且封装为对象,然后装载集合,然后返回
1.定义一个Emp类
2.定义方法 public List<Emp> findAll(){}
5.PreparedStatement:执行sql的 对象。
1.SQL 注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
1.输入用户随便,输入密码:a' or 'a' = 'a'。
2.sql: select *from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a'。
2.解决sql注入问题:使用preparedStatement对象来解决。
3.预编译SQL :参数使用?作为占位符
4.定义sql
*注意:sql的参数使用?作为占位符。如:select *from user where username = '?' and password = '?'
5.获取执行sql语句的对象 preparedStatement Connection.prepareStatement(String sql)
6.给?赋值:
*方法: setXXX(参数1,参数2)
*参数1: ?的位置编号从1开始
*参数2: ?的值
7.执行sql,接受返回结果,不需要传递sql语句。
8.处理结果
9.释放资源
##JDBC工具类
*目的:简化书写
*分析:
1.注册驱动也抽取
2.抽取一个方法获取连接对象
*需求:不想传递参数(麻烦),还要保证工具类的通用性。
*解决:配置文件
jdbc.properties
url=
user=
password=
driver=com.mysql.jdbc.Driver
3.抽取一个方法释放资源
#Day06 JDBC连接池
1.JDBC连接池
2.Spring JDBC :JDBC Template
##数据库连接池
*1.概念:其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完后之后,会将连接对象归还给容器。
*2.好处:
1.节约资源
2.用户访问高效
*3.实现:
1.标准接口:DataSource javax.sql下载
1.方法:
*获取连接:getConnection()
*归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再管币连接了。而是归还连接。
2.我们一般不去实现它,有数据库厂商来实现
1.C3P0:数据库连接池技术。
2.Druid:数据库连接池实现技术,由阿里巴巴提供的。
*4.C3P0:数据库连接池技术
* 步骤:
1.导入jar包(两个)c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar
*不要忘记导入数据库驱动jar包
2.定义配置文件:
*名称:c3p0.properties 或者c3p0-config.xml
*路径:直接将文件放在src目录下即可。
3.创建核心对象 数据库连接池对象 CombopooledDataSource
4.获取连接:getConnection
*5Druid:数据库连接池实现技术,由阿里巴巴提供
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
*Spring框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC的开发
*步骤:
1.导入jar包
2.创建JDBCTemplate对象,依赖于数据源DataSource
*JdbcTemplate template = new JdbcTemplate(ds)
3.调用JdbcTemplate的方法来完成CRUD的操作
*update():执行DML语句。增、删、改语句
*queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
*注意:这个方法查询的结果集长度只能是1
*queryForList():查询结果将结果集封装为lsit结合
*query():查询结果,将结果封装为JavaBean对象
*query的参数:RowMapper
*一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
*new BeanPropertyRowMapper<类型>(类型.class)
*queryForObject:查询结果,将结果封装为对象
##07 web概述
*JavaWeb :
*使用Java语言开发基于互联网项目。
*软件架构:
*C/S:Client/Server 客服端/服务器端
*如:在用户本地有一个客户端程序,在远程有一个服务器端程序
*如:QQ,迅雷
*优点:用户体验好
*缺点:
1.安装,部署麻烦,维护麻烦。
*B/S: Browser/Server 浏览器/服务器端
*只需要一个浏览器,用户通过不同的网址(URL),客户访问不同的服务器端程序。
*优点:安装、部署、维护 简单。
*缺点:
1.如果应用过大,用户的体验可能会受到影响。
2.硬件要求过高。
*B/S架构详解
*资源分类
1.静态资源:
*使用静态网页开发技术发布的资源。
*特点:
*所有用户访问,得到的结果是一样的。 如:文本,图片,音频,视频,HTML,CSS,JavaScript。
*如果用户请求的是静态资源,那么服务器会直接将静态资源发送给浏览器。浏览器中你内置了静态资源的解析引擎,可以展示静态资源。
2.动态资源:
*使用动态网页及时发布的资源。
*特点:
*所有用户访问,得到的结果可能不一样。
*如:jsp/servlet ,php,asp...
*如果用户请求的是动态资源,那么服务器会执行动态资源,转换为静态资源,再发送给浏览器。
*我们要学习动态资源,必须先学习静态资源
*静态资源:
*HTML
*CSS
*JS
Day13
web服务器软件
在web服务器软件中,,可以部署web项目,让用户通过浏览器来访问这些项目
常见的java相关的web服务器软件:
*webLogic: oracle 公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
*websphere: IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
*JBOSS :JBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
*Tomcat: Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范。
*Tomcat:web服务器软件
1.下载:http://tomcat.apache.org/
2.安装:解压压缩包即可。
注意:安装目录建议不要有中文和空格
3.卸载:删除目录就行了
4.启动
*bin/startup.bat,双击运行该文件即可
*访问:浏览器输入:http://localhost:8080 回车访问
*可能出现的问题:
1.黑窗口一闪而过
原因:没有正确配置JAVA_HOME环境变量
解决方案:正确配置JAVA_HOME环境变量
2.启动报错:
1.暴力:找到占用的端口号,并且找到对应的进程,杀死该进程
2.温柔:修改自身的端口号
5.关闭
6.配置
*部署项目的方式:
1.直接将项目放到webapps目录下即可
2.配置conf/server.xml文件
3.在conf/Catalina/localhost创建任意名称的xml文件
servlet
*概念:运行在服务器端的小程序
*servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则
*将来我们自定义一个类,实现servlet接口,复写方法。
快速入门:
1.创建JavaEE项目
2.定义一个类,实现Servlet接口
3.实现接口中的抽象方法
4.配置Servlet
*执行原理:
1.当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的servlet的资源路径。
2.查找web.xml文件,是否有对应的<url-pattern>标签体内容。
3.如果有,则在找到对应的<servlet-class>全类名。
4.tomcat会将字节码文件加载进内存,并且创建其对象
5.调用其方法
servlet中的声明周期
1.被创建:执行init方法,只执行一次
*servlet 什么时候被创建?
默认情况下,第一次被访问时创建
可以配置执行servlet的创建时机
1.第一次访问时创建(在servlet标签下配置)
2.在服务器启动时创建(<load-on-startup>的值为0或正整数)
2.提供服务:执行service方法,执行多次
3.被销毁:执行destroy方法,只执行一次
登录案例
*用户登录案例需求:
1.编写login.html登录页面
2.使用Druid数据库连接池技术,操作mysql,day14数据库中user表
3.使用JDBCTemplate技术封装JDBC
4.登录成功跳转到successServlet展示:登录成功!
5.登录失败跳转到FailServlet展示:登录失败!
*开发步骤
1.创建项目,导入html页面,配置文件,jar包
2.创建数据库
3.创建包cn.itcast.domain,创建类User
4.创建包cn.itcast.util工具包,JDBC工具类,使用Durid连接池,创建JDBCUtil类
5.创建包cn.itcast.dao,创建类UserDao(操作数据库中User表的类),并提供login方法
6.编写cn.itcast.web.servlet.LoginServlet类,完成登录的具体逻辑
7.login.html中form表单的action路径的写法
8.Beanutiles工具类,简化数据封装
##ServletContext对象
1.概念:代表整个web应用,可以和程序的容器(服务器)来通信
2.功能:
1.获取MIME类型:
2.域对象:共享数据
3.获取文件的真实(服务器)路径
Day15
##JSP入门学习
1.概念:
*java server pages: java服务器端页面
*可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
*用于简化书写!!!
2.原理
*jsp本质上就是一个servlet
3.jsp的脚本:jsp定义java代码的方式
1.<% 代码 %> :定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
2.<% ! 代码 %> :定义的java代码,在jsp转换后的java类的成员位置。
3.<% = 代码 %> :定义的java代码,会输出到页面上,输出语句中定义什么,该脚本就可以定义什么。
4.jsp的内置对象
*在jsp页面中不需要获取和创建,就可以使用的对象。
*jsp一共有9个内置对象。
*今天学习三个:
*request
*response
*out:字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似
在tomcat服务器真正给客户端作出响应之前会先找response缓冲区数据,再找out缓冲区数据,也就是response.getwriter()数据输出永远在out.write()之前。