A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© q916276769 初级黑马   /  2019-7-14 15:00  /  815 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一 lambda表达式
  • lambda表达式概念
    • 概念:匿名的方法块
    • 格式:
      • ():形式参数,多个参数通过,分开
      • ->:固定语法格式
      • {}:重写的方法体


  • lambda简写方式
    • 方法的参数类型,但是不能部分省略
    • 当方法有且仅有一个参数的时候,()也可以省略掉
    • 当语句体有且仅有一句代码的时候,{};可以省略掉,如果包含return语句,return也可以省略

  • lambda与匿名内部类的区别
    • 匿名内部类可以是基于接口/类/抽象类,lambda只能基于接口
    • 匿名内部类接口中可以有多个抽象方法,lambda中只能有一个
    • 编译完匿名内部类会生成一个class文件,lambda不会

  • 接口新特性
    • java8  默认方法
    • java8  静态方法
    • java9  私有方法

  • 方法引用

    • 类名::静态方法
    • 对象::非静态方法
    • 类名::非静态方法
    • 类名:new

二 函数式接口和Stream流

1.函数式接口
        特点:有且只有一个抽象方法,有一个注解可以帮助我们检测是否正确书写函数式接口@FunctionalInterface
2.常见的函数式接口
        1.Supplier<T> --->抽象方法 T get(); 能够生成指定类型的数据,
                好处:能够提高程序的灵活性?因为这是一个抽象方法, 方法体由调用者来决定!!!!

        2.Consumer<T> --->抽象方法 void accept(T t); 能够处理一个数据
                好处:能够提高程序的灵活性?因为这是一个抽象方法,方法体由调用者来决定!!!!,说白了, 处理方式调用者来决定
                了解: andThen 可以将两个Consumer结合成一个
        3.Predicate<T> ---->抽象方法 boolean test(T t); 能够判断一个数据
                好处:能够提高程序的灵活性?因为这是一个抽象方法,判断的逻辑由调用者决定
                了解: and,or,negite()和&&,||,!的用法和意义基本一样, 建议使用&&,!,||
        4.Function<R,T>----> 抽象方法 T apply(R r); 能够把一种数据类型变成另外一种,转化的逻辑由调用者决定
3.Stream流
        作用:简化集合和数组的操作
        掌握:
                1.能够将集合变成Stream流
                        集合对象调用stream()的方法
                2.能够将数组变成Stream流
                        调用Stream流中的静态方法of来进行转换
        常见的方法
                注意:流只能使用一次!!!!!!
                中间方法:
                        filter按照我们的条件过滤
                        skip跳过前几个
                        limit取前几个
                        distinct去重
                        map可以将一种数据变成另外一种
                        mapToInt可以将其他类型变成int类型
                终结方法
                        forEach --->遍历操作, 传入一个处理的逻辑,这个处理逻辑由调用者来决定,因为这哥们是一个Consumer接口
                        count ---->得到流中的元素的个数
                其他方法---->只有当进行添加或者单个修改的操作的时候
                        collect(Collectors.toList()) //将流变成List集合---->需要对流中的元素进行添加,获取单个修改
                        collect(Collectors.toSet()) //将流变成Set集合---->需要对流中的元素进行添加,获取单个修改
                        collect(Collectors.toMap(fun1,fun2)) //将流变成Map集合---->需要对流中的元素进行添加,获取单个修改
三  反射
1.加载器        类的加载的过程---->将.class文件从硬盘上加载到内存中(方法区,)以一个Class对象来体现        类加载的时机---->1.创建对象2.调用类中方法....(只要你要用这个类, 这个类首先从硬盘上移动内存中(类加载))        类加载分为三种                Bootstrap --->不是java语言写的,负责加载Platform这个加载器                Platform ---->专门加载jdk里面的                System--->AppClassLoader --->负责加载我们自己写的代码        规则:                全盘委托 ----> AppClassLoader加载的时候会先去问自己的父类, 有没有加载过, 如果有的话不加载, 如果没有的时候加载!!!,这样保证我们的类只会被加载一次                Student stu = new Student();                Person per = new Person();2.反射(重点!!!!!)        作用:操作字节码文件中的内容(成员变量,成员方法,构造函数)        前提条件: 想要反射,需要获取要操作类的字节码对象                如何获取一个类的字节码:(一个类的字节码对象只有一份)                        1.类名.class ---->已知类名                        2.对象.getClass();---->已知对象                        3.Class.forName("全类名")---->已知全类名的字符串表现形式        掌握:                操作Constructor对象(构造函数对象)                        获取: 通过字节码对象中的方法                                Construtor getConstrutor(Class ... clazz); ---->只能获取public修饰的构造                                Construtor[] getConstrutors(); ---->只能获取public修饰的所有的构造                                Construtor getDeclearedConstrutor(Class ... clazz); ---->能够获取指定的构造                                Construtor[] getDeclearedConstrutors(); ---->只能获取所有的构造                                注意:如果操作的私有构造,需要暴力反射, setAccessable("true");                        方法:                                newInstanse(Object...args);                操作Field对象(字段对象)                        获取:                                Filed getFiled(String name);--->获取public的成员变量的对象                                Filed[] getFileds();                                Filed getDeclearedField(String name); --->获取指定成员变量的对象,包括私有的                                Filed[] getDeclearedFileds(); ---->获取所有的成员变量对象                                注意:如果操作的私有字段,需要暴力反射, setAccessable("true");                操作Method对象(方法对象)                                常见的使用场景                1.和配置文件结合, 动态创建对象,达到解耦的目的                2.暴力反射,可以使用类中私有的东西                3.越过泛型检测(了解)                4.批量属性赋值                ...3.多模块        1.以后可以通过模块管理我们项目        2.模块和模块之间可以相互调用                1.暴力方式,将整个模块导入,使用起来很爽                2.编写module-info.java这样的文件,来去指定导入                        exports --->导出                        requires ---> 导入                        provider --->提供服务                        uses --->使用服务                        四  MySQL基础
-- mysql有一个配置文件很重要my.ini,mysql是一种关系型数据库,所以支持sql语句的规范-- 一条语句以分号结尾, 关键词建议大写, sql不区分大小写, 注释三种(单行注释:--空格,#,多行注释/*注释内容*/)/*        DDL:数据库定义语言,专门操作数据库和表的增删改查                create(增加),drop(删除),alter(修改),show(查询)        DML:数据库操作语言,专门针对表中的数据的增删改                update delete insert        DQL:数据库查询语言,专门针对表中数据的查询                select        DCL:数据库控制语言,专门用来创建用户,删除用户, 授权, 撤权                grant*//*************************DDL语句*********************************//*-------数据库的操作---------*/-- 创建数据库(!!!!!!!!!!!!!!!!!!)CREATE DATABASE db1;-- 了解内容-- 查询数据库SHOW DATABASES;-- 指定字符串创建数据库---有些数据库的编码指定是utf-8有些是utf8CREATE DATABASE db2 CHARACTER SET utf8;-- 查询数据库的创建语句SHOW CREATE DATABASE db2;-- 判断是否存在CREATE DATABASE IF NOT EXISTS db3;-- 删除数据库DROP DATABASE db2;-- 修改数据库,编码ALTER DATABASE db2 CHARACTER SET gbk;SHOW CREATE DATABASE db2;-- 使用数据库(!!!!!!!!!!!!!!!!!!)USE db3;/*-------表的操作---------*/-- 查询所有的表SHOW TABLES;-- 查询表的结构DESC HOST;/*        int 整数        double小数        date年月日        datatime年月日时分秒        timestamp时间蹉        varchar字符串        注意 char和varchar的区别: varchar是可以变的,char是固定的, varchar更省空间        创建表的格式:                create table 表明(                        字段名 字段类型 约束,                        字段名 字段类型 约束,                        ....                        字段名 字段类型 约束 (最后一个字段不加逗号)                                        );*/-- 创建学生成绩表(!!!!!!!!!!!!!!!!!!)CREATE TABLE student_score(        id INT,        NAME VARCHAR(32), -- varchar必须指定长度        chinese DOUBLE(4,1),  -- double(总位数,小数的个数),也可以不填        math DOUBLE(4,1),        english DOUBLE);-- 删除表(建议少用或者不用)DROP TABLE student_score;-- 修改表名ALTER TABLE student_score RENAME TO stu_score;-- 修改name的长度为10 ---->MODIFY只能修改类型(!!!!!!!!!!!!!!!!!!)ALTER TABLE stu_score MODIFY NAME VARCHAR(10);-- 将name这个字段名字改成sname--->CHANGE可以改名字还可以改类型(!!!!!!!!!!!!!!!!!!)ALTER TABLE stu_score CHANGE NAME sname VARCHAR(10);-- 添加一列"所属班级"--->ADD(!!!!!!!!!!!!!!!!!!)ALTER TABLE stu_score ADD class VARCHAR(20);ALTER TABLE stu_score ADD aaa VARCHAR(20);-- 删除表中的aaa这一列--->DROP(!!!!!!!!!!!!!!!!!!)ALTER TABLE stu_score DROP aaa;/*************************DML语句*********************************//*-------表的数据的添加INSERT---------*//*格式: insert into 表名(列名的列表) values(列值的列表)简化格式: insert into 表名 values(所有列的列值列表)批量插入格式: insert into 表名 values(所有列的列值列表),(所有列的列值列表),(所有列的列值列表)....注意: 列名和列值要一一对应(不仅个数一样,类型也要一样)*/-- 采用标准格式插入INSERT INTO stu_score (id,sname,chinese,math,english,class) VALUES(1,'aaa',100,100,100,'一班');-- 采用省略格式插入INSERT INTO stu_score VALUES(2,'林青霞',100,100,100,'一班');INSERT INTO stu_score VALUES(2,'李青霞',100,100,100,'一班');INSERT INTO stu_score VALUES(2,'梅青霞',100,100,100,'一班');-- 采用批量插入INSERT INTO stu_score (id,sname,chinese,math,english,class) VALUES(3,'黎姿',99,99,99,'二班'),(4,'豆腐妹',88,88,88,'一班'),(5,'小明',10,9,0,'一班');/*-------表的数据的删除DELETE---------*//*        delete from 表名 where 条件        注意:一定要挂条件,不然出现全部删除的情况!!!!!        如果真的想要删除所有的数据,我们建议truncate table 表名这种语句,因为效率高        */DELETE FROM stu_score WHERE id >= 3;/*-------表的数据的修改UPDATE---------*//*        update  表名 set 列名=列值 , 列名=列值.... where 条件        注意:一定要挂条件,不然出现全部修改的情况!!!!!*/--/*************************DQL语句*********************************//*   注意:        null和任何数据计算都为null,可以使用ifnull(字段, 默认值)来解决问题           条件相关的知识        >,<,=,!=(<>),>=,<=        &&(and) , ||(or), !(not)        between and: 和>= and <=一样的效果        in(集合) 简化 多个or的书写        null不可以使用=和!=,应该用is或者is not来判断        like--->模糊查询                _:匹配一个                %:匹配多个        */-- 查询一张表中所有的字段!!!SELECT * FROM stu_score;-- 查询sname和class这两列SELECT sname,class FROM stu_score;-- 去重查询(一般去重查询只针对一个字段)SELECT DISTINCT class FROM stu_score;-- 计算列(一般针对数字列(int或者double类型的列))SELECT *,chinese+math+english AS 总分 FROM stu_score;SELECT *,chinese+math+english  总分 FROM stu_score;SELECT *,stu_score.`chinese`+ stu_score.`english`+ stu_score.`math` 总分 FROM stu_score;-- 多个OR的语句很麻烦,可以使用in这个简化书写SELECT * FROM stu_score WHERE id = 1 OR id = 3 OR id = 5;-- 使用in简化or的书写SELECT * FROM stu_score WHERE id IN(1,3,5);-- 查所有的"青霞"SELECT * FROM stu_score WHERE sname LIKE '%青霞%';-- 查第二个字是"青"的人SELECT * FROM stu_score WHERE sname LIKE '_青_';五 mysql约束
/**** 排序 order by 排序的字段 排序的方式(asc(升序),desc(降序)) */SELECT * FROM stu_score ORDER BY stu_score.`chinese` DESC ,stu_score.`math` ,stu_score.`english`;/*聚合函数 count(计算某列的个数),max,min,avg,sum 注意:聚合函数都是排除null的值,进行运算的!!!!,聚合函数后面也可以加条件的*/-- 查询表中的数据的个数SELECT COUNT(*) FROM stu_score;-- 查数学的平均值SELECT AVG(math) FROM stu_score;SELECT AVG(math) FROM stu_score WHERE math > 80;-- 我想知道考试数学成绩100的人有多少个SELECT COUNT(*) FROM stu_score WHERE math = 100;SELECT * FROM stu_score;-- GROUP BY分组的注意 1. 分组要查找的字段必须, 分组字段以及聚合函数(不要查找私有数据) 2. where和having-- where是分组之前过滤, having是分组之后过滤, where不能跟聚合函数, having可以跟聚合函数SELECT         class,SUM(math)FROM         stu_scoreGROUP BY        class;-- 数学成绩<60的过滤掉然后进行分组SELECT        class,SUM(math)FROM        stu_scoreWHERE        math > 60GROUP BY        class;-- 数学成绩<60的过滤掉然后进行分组,分组后过滤出总分>200的 --->havingSELECT        class,SUM(math) total -- 查询"班级",和"总分"这两列, 其中"班级"是分组字段, "总分"是聚合函数FROM        stu_scoreWHERE        math > 60 -- 分组前过滤出60分以上的, 分组前过滤有whereGROUP BY        class        -- 按照班级分组HAVING        total > 200; -- 分组后过滤出 总分大于200的,分组后过滤用having-- 按照班级分组查总人数-- select count(*) from stu_score;SELECT        class,COUNT(*)FROM        stu_scoreGROUP BY        class;-- 查询第三页,每页3条-- select * from stu_score limit 3,3;SELECT * FROM stu_score ORDER BY math DESC;-- 其实每页一个,要第三页 开始索引 = (3 - 1) * 1SELECT * FROM stu_score ORDER BY math DESC LIMIT 0,1;/*select        要查询的列from        要查询的表where        分组前的过滤条件group by        按照什么来分组having        分组后的过滤条件order by        排序规则limit        分页限定*//*************************约束*********************************//*        非空约束 ---> not null        1.创建表时添加                create table 表名(                        字段的名称 字段类型 not null                );        2.创建表后添加                alter table 表名 modify 字段名称 字段类型 not null; -- 要求这一列里面不能有null的数据        3.移除非空约束                alter table 表名 modify 字段名称 字段类型;*/-- 修改表将sname和class添加非空约束ALTER TABLE stu_score MODIFY sname VARCHAR(10) NOT NULL;ALTER TABLE stu_score MODIFY class VARCHAR(10) NOT NULL;-- 修改表将class的非空约束去掉ALTER TABLE stu_score MODIFY sname VARCHAR(10);/*        唯一约束UNIQUE ----> 注意:唯一对null是没有效果的        1.创建表时添加                create table 表名(                        字段的名称 字段类型 UNIQUE                );        2.创建表后添加                alter table 表名 modify 字段名称 字段类型 UNIQUE; -- 要求这一列里面不能有重复的数据        3.移除唯一约束                alter table 表名 drop index 字段名                */-- 修改id类,添加唯一约束ALTER TABLE stu_score MODIFY id INT UNIQUE;-- 移除id的唯一约束ALTER TABLE stu_score DROP INDEX id;/*        主键:PRIMARY KEY 非空且唯一,注意: 一张只能有一个主键        1.创建表时添加                create table 表名(                        id int primary key,                        name varchar(20)                );        2.创建表后添加                alter table 表名 modify 列名 类型 primary key;        3.移除主键约束                alter table 表名 drop primary key;        注意:因为主键非空且唯一, 在插入数据时候,不能重复, 在书写起来很不方便,我们必须在检查主键        需要一个东西管理我们的主键        1.主键是整数类型---->一般和auto_increment结合,让自动增长管理主键        2.字符串类型---> 会通过随机生成一个永远不会重复的字符串来作为主键*/SELECT * FROM stu_score;-- 添加主键ALTER TABLE stu_score MODIFY id INT PRIMARY KEY;-- 移除主键ALTER TABLE stu_score DROP PRIMARY KEY;-- 给主键列添加自动增长ALTER TABLE stu_score MODIFY id INT AUTO_INCREMENT;-- 将主键的自动增长去掉ALTER TABLE stu_score MODIFY id INT;/*        外键约束:FOREIGN KEY 作用---->用来约束"表"和"表"之间的数据,能够保证数据的完整性,安全性        1.创建表时添加                create table 表名(                        id int primary key auto_increment,                        name varchar(20),                        tid int, -- 希望tid作为外键关联另外一张表                        [contraint 外键的名字] foreign key(tid) references 另外一张表(字段名字)                                        );        2.创建表后添加                alter table 表名 add [contraint 外键的名字] foreign key(tid) references 另外一张表(字段名字);        3.移除外键约束                alter table 表名 drop  foreign key 外键名;                        4. 级联操作                级联更新 on update cascade                级联删除 on delete cascade                例如:                alter table 表名 add [contraint 外键的名字] foreign key(tid) references 另外一张表(字段名字) on update cascade        */CREATE TABLE classroom(        cid INT PRIMARY KEY AUTO_INCREMENT,        cname VARCHAR(20));CREATE TABLE student(        sid INT PRIMARY KEY AUTO_INCREMENT,        sname VARCHAR(20),        cid INT, -- 希望cid作为外键关联classroom的cid,用到外键约束        CONSTRAINT stu_class_fk FOREIGN KEY(cid) REFERENCES classroom(cid))SELECT * FROM classroom;SELECT * FROM student;-- 删除外键约束, 需要外键的名字才可以删除ALTER TABLE student DROP FOREIGN KEY student_ibfk_1;-- 添加外键约束时给名字ALTER TABLE student ADD CONSTRAINT stu_class_fk  FOREIGN KEY(cid) REFERENCES classroom(cid);-- 添加外键约束时不给名字ALTER TABLE student ADD  FOREIGN KEY(cid) REFERENCES classroom(cid);-- 查找表的创建语句,其实为了找到外键名!!!!!如果在创建外键的时候没有给外键起名字,系统会自动生成一个,需要这个语句查询SHOW CREATE TABLE student;/*        一对多的关系: 建表原则,在多的一方建立外键,关联一的一方的主键        例如: 客户和订单*/CREATE TABLE USER( -- 一的一方        uid INT PRIMARY KEY AUTO_INCREMENT,        uname VARCHAR(20),        nickname VARCHAR(20));CREATE TABLE orders( -- 多的一方,建立外键和一的一方进行关联        oid INT PRIMARY KEY AUTO_INCREMENT,        odate TIMESTAMP,        price DOUBLE,        uid INT,        CONSTRAINT orders_user_fk FOREIGN KEY(uid) REFERENCES USER(uid));/* 多对多 : 建表原则 ---> 需要借助第三张中间表, 这个中间表至少有两个字段, 分别作为外键指向主表的主键*/CREATE TABLE restrant( -- 多的一方        rid INT PRIMARY KEY AUTO_INCREMENT,        rname VARCHAR(20),        address VARCHAR(20));CREATE TABLE dish( -- 多的一方        did INT PRIMARY KEY AUTO_INCREMENT,        dname VARCHAR(20),        price DOUBLE);-- 需要借助第三张中间表,描述restrant和dish的关系, 至少包含二个字段, 分别作为外键指向主表的主键CREATE TABLE rest_dish_mid(        rid INT,        did INT,        PRIMARY KEY(rid,did), -- 联合主键只出现在中间表中!!!!!!        CONSTRAINT mid_rest_fk FOREIGN KEY (rid) REFERENCES restrant(rid),        CONSTRAINT mid_dish_fk FOREIGN KEY (did) REFERENCES dish(did)        );INSERT INTO restrant VALUES(NULL,'沙县小吃','广安大街302号');INSERT INTO restrant VALUES(NULL,'铁锅焖面','广安大街303号');INSERT INTO restrant VALUES(NULL,'幸福大锅菜','广安大街304号');INSERT INTO dish VALUES(NULL,'酸辣土豆丝',8);INSERT INTO dish VALUES(NULL,'红烧排骨饭',12);INSERT INTO dish VALUES(NULL,'红烧鲤鱼',20);INSERT INTO dish VALUES(NULL,'焖面',20);INSERT INTO dish VALUES(NULL,'大锅菜',10);INSERT INTO dish VALUES(NULL,'飘香拌面',5);INSERT INTO rest_dish_mid VALUES(1,6);INSERT INTO rest_dish_mid VALUES(1,1);INSERT INTO rest_dish_mid VALUES(1,1);INSERT INTO rest_dish_mid VALUES(2,4);INSERT INTO rest_dish_mid VALUES(2,1);INSERT INTO rest_dish_mid VALUES(2,2);INSERT INTO rest_dish_mid VALUES(3,5);INSERT INTO rest_dish_mid VALUES(3,1);INSERT INTO rest_dish_mid VALUES(3,2);INSERT INTO rest_dish_mid VALUES(3,3);/*        一对一: 在任何一方建议唯一外键方式来去关联(很少见!!!!!)*//*数据库的备份        命令:                 保存: mysqldump -uroot -p密码 数据库的名字 > 路径                还原: source 路径        图形化界面:                保存:右键-->导出-->备份数据库                还原:右键-->导入-->执行sql脚本


六  多表查询
/****************************多表查询********************************/-- 我们在消除无用的数据, 其实就是让两张表的外键关系写好SELECT        *FROM        members,accountWHERE        members.`memid` = account.`memid`;-- 查询(nickname) member,(price ,address) --->accountSELECT        t1.`nickname`,        t2.`price`,        t2.`address`FROM        members t1,account t2WHERE        t1.`memid` = t2.`memid`;SELECT * FROM account;/*        内连接有两种书写方式                显示:(将来100%不用)---->用on来挂条件, 而且可以显示看到[inner join]的关键字                        select                                列名列表                        from                                表名(只能写一个)                        [inner] join                                表名                        on                                主表的主键和从表的外键关联关系(其实为了消除无用的数据)                                        隐式:(将来100%用) --->用where挂条件,看不到[inner join]的关键字                        select                                列名列表                        from                                表名列表                        where                                主表的主键和从表的外键关联关系(其实为了消除无用的数据)        外连接                左外:(100%都用这个) ---->查左表的所有数据和两张表的交集                        select                                列名列表                        from                                某张表                        left [outer] join                                另外一张表                        on                                主表的主键和从表的外键关联关系(其实为了消除无用的数据)                                                        右外:100%不用这个)---->查右表的所有数据和两张表的交集                        select                                列名列表                        from                                某张表                        right [outer] join                                另外一张表                        on                                主表的主键和从表的外键关联关系(其实为了消除无用的数据)        */-- 查 member表中的所有, 和两张表交集SELECT        *FROM        members t1LEFT JOIN        account t2ON        t1.`memid` = t2.`memid`;-- -- 查询(nickname) members,(price ,address) --->account ,要求金额大于100SELECT        t1.`nickname`,        t2.`price`,        t2.`address`FROM        members t1, account t2WHERE        t1.`memid` = t2.`memid` AND        t2.`price` > 100;                        -- 数学成绩大于平均分那些人-- 1.先查数据平均分SELECT AVG(math) FROM stu_score;-- 2.查数据成绩大约85.14286的人SELECT * FROM stu_score WHERE math > (SELECT AVG(math) FROM stu_score);/*        子查询(查询语句中嵌套查询)                单行单列: --->配 >,>=,<=,<,!=,=                多行单列:--->配 in                多行多列:---->一般将结果看成一张虚拟表和另外一张表继续查询*/-- 查询所有"男"的消费的账务(子查询方式)-- 1.查询"男"的那些memid是多少SELECT         memidFROM        membersWHERE         sex='男'; -- 2.通过上一步得到memid来去查询账务SELECT        *FROM        accountWHERE        memid IN(SELECT memid FROM members WHERE sex='男');        -- 正常写法, 因为要查性别是'男'的这一列, 这一列不在account中出现, 所以需要查询members这张表和account表, SELECT        t2.*FROM        members t1, account t2WHERE        t1.`memid` = t2.`memid` AND -- 千万不要忘记添加主外键的关系,不然会出现无用的数据        t1.`sex` = '男';-- '2019-7-11' '2019-7-12'之间数据SELECT         *FROM        accountWHERE        adate BETWEEN '2019-7-11' AND '2019-7-12';-- 查询 '2019-7-11' '2019-7-12'之间数据,并且消费的人员信息查询出来SELECT        *FROM        members t1, (SELECT * FROM account WHERE adate BETWEEN '2019-7-11' AND '2019-7-12') t2WHERE        t1.`memid` = t2.memid-- 正常的方式SELECT        *FROM        members t1, account t2WHERE        t1.`memid` = t2.memid AND        adate >= '2019-7-11' AND         adate <= '2019-7-12';        /*        事务的作用: 能够保证一组操作要不同时成功,要不同时失败        三句:                start trasaction 开始事务 ---->保证一些操作成功一起失败时,需要开启事务                rollback 回滚 ----->发生异常的时候,在catch语句中来回滚                commit 提交 ----> 没有发生问题时,提交        事务的特征                原子性: 代表事务不可分割要不一起成功,要不一起失败                持久性: 事务一旦提交或者回滚,就会持久化更新数据库                隔离性: 多个事务之间不应该相互影响                一致性: 代表事务的前后,数据总量不变        隔离级别                出现问题                        脏读 ---> 一个事务读到了另外一个事务未提交的数据                        虚读(不可重复读) ----> 读到update语句导致一个事务多次查询的结果不一致                        幻读 ---> 在一个事务中,读到了另外一个事务insert的语句                隔离级别                        read uncommitted: 读未提交读  --->出现最恶心的脏读问题                        read committed: 读已提交 (一次事务多次读到结果不一样) ---> Oracle                        repeatable read:可重复读 ----> mysql                        serielizable:串行化 --->效率低下                        *//*********************DCL***********************//*        1.管理用户                c: create user '账号'@'电脑ip地址' identified  by '密码'                r: 需要切换到mysql这个数据库去查user这张表                u:                   update user set password=password('新密码') where user = '用户名';                   set password for '用户名'@'IP地址' = password('新密码');                   特殊操作--->把root用户名给忘了                   1.停止mysql的服务                   2.打开命令行,执行 mysqld --skip-grant-tables                   3.在打开一个新的窗口 执行 mysql                   4.user mysql                   5.改root的密码                   6.将mysqld的进程杀死                   7.启动mysql服务                   8.登录                d:drop user '账号'@'IP地址';        2.授权和撤权                查看: show grants  for '用户名'@'ip地址';                授权: grant 权限列表 on 数据库.表名 to '用户名'@'ip地址';                撤权: revoke 权限列表 on 数据库.表名 from '用户名'@'ip地址';                 */-- 添加一个用户CREATE USER 'meijunjian'@'%' IDENTIFIED BY '123';-- 删除掉DROP USER 'meijunjian'@'%';
七 JDBC
0.JDBC        是一套sun公司提供的接口, 这个接口由数据库厂商编写实现类, 这个厂商编写实现类称为数据库的驱动        jdbc作用:平复数据库数据的差异1.操作的步骤        1.导入驱动jar包        2.注册驱动        3.获取连接        4.通过连接得到执行者对象        5.使用执行者对象执行sql语句        6.得到结果,并处理        7.释放资源2.jdbc相关的api        DriverManager                1.注册驱动                        registerDriver的方法,但是我们不用,我们使用Class.forName("com.mysql.jdbc.Driver");                        原因是因为在Driver这个类中有静态方法,这个方法随之类的字节码加载而加载,只加载一次,                        静态代码块中里面帮我们注册了驱动                2.获取连接                        Connection        getConnection(url,用户名,密码);                        url的编写: "jdbc:mysql://ip地址:端口/数据库的名字"                        注意: 如果我们连接本机, 可以省略: "jdbc:mysql:///数据库的名字"        Connection                1.获取执行者对象                        Statement createStatement();                        PreparedStatement preparedStatement(String sql);//100%都是用的这个!!!!!!!!                2.管理事务                        1.开始事务:  setAutoCommitted("false"); --->将自动提交关闭                                注意:这里关闭自动提供, 只针对这一次操作                        2.回滚: rollback()                        3.提交: commit()        Statement(以后不会用!!!!会出现sql注入的问题)                        1.执行DML                                int excuteUpdate(String sql);淘汰了!!!!!                                返回值: int 代表影响的行数, 我们通过这个行数判断是否执行成功                        2.执行DQL                                ResultSet excuteQuery(String sql);淘汰了!!!!!                                返回值:ResultSet这个对象封装了所有的结果!!!!                        3.可以执行任何sql                                boolean excute(); ----> 如果 true代表是"查询语句", 如果false代表是"增删改"         PreparedStatement(以后都用这个, 不仅效率高,还可以解决sql注入问题)                        1.执行DML                                int excuteUpdate();//这里不能传入sql语句了                        2.执行DQL                                ResultSet excuteQuery();//这里不能传入sql语句了                        注意事项: 所有的需要拼接的参数都用"?"来占位, 千万不要对?进行赋值, ?从1开始编号        ResultSet                        1.next(); 可以是指针向下移动一行                        2.getXxx(参数)的方法得到其对应的数据                                参数: 1.int(没人用!!!!!)2.String(建议使用!!!!)3.sql注入问题:        为什么会出现? 因为在sql拼接,会将关键识别        通过PreparedStatement来解决, 他的参数用?来占位, 将来赋值的时候, 即使有关键字也不会识别!!!!!!                                                       


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马