博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVAWEB学习概要一
阅读量:4145 次
发布时间:2019-05-25

本文共 22589 字,大约阅读时间需要 75 分钟。

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

                

 

 

 

转载地址:http://yzcti.baihongyu.com/

你可能感兴趣的文章
日志框架学习
查看>>
日志框架学习2
查看>>
SVN-无法查看log,提示Want to go offline,时间显示1970问题,error主要是 url中 有一层的中文进行了2次encode
查看>>
NGINX
查看>>
Qt文件夹选择对话框
查看>>
1062 Talent and Virtue (25 分)
查看>>
1061 Dating (20 分)
查看>>
1060 Are They Equal (25 分)
查看>>
83. Remove Duplicates from Sorted List(easy)
查看>>
88. Merge Sorted Array(easy)
查看>>
leetcode刷题191 位1的个数 Number of 1 Bits(简单) Python Java
查看>>
leetcode刷题198 打家劫舍 House Robber(简单) Python Java
查看>>
NG深度学习第一门课作业2 通过一个隐藏层的神经网络来做平面数据的分类
查看>>
leetcode刷题234 回文链表 Palindrome Linked List(简单) Python Java
查看>>
NG深度学习第二门课作业1-1 深度学习的实践
查看>>
Ubuntu下安装Qt
查看>>
Qt札记
查看>>
我的vimrc和gvimrc配置
查看>>
hdu 4280
查看>>
禁止使用类的copy构造函数和赋值操作符
查看>>