一 lambda表达式
lambda表达式概念 概念:匿名的方法块 格式: ():形式参数,多个参数通过,分开 ->:固定语法格式 {}:重写的方法体
lambda简写方式 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来解决, 他的参数用?来占位, 将来赋值的时候, 即使有关键字也不会识别!!!!!!
|
|