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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 白菜蔡 初级黑马   /  2018-12-26 17:39  /  838 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

        数据库-database简称:DB
数据库:用于存储和管理数据的仓库
特点:
1,持久化存储数据的.其实数据库就是一个文件系统
2,方便存储和管理数据
3,使用了统一的方式操作数据库--SQL

SQL:结构化查询语言--其实就是定义了操作所有关系型数据库的规则.

SQL通用语法:
1.SQL 语句可以单行或多行书写,以分号结尾
2.不区分大小写,关键字用大写
3.单行注释 : --空格XXX   多行注释: /*XXX */   mysql特有注释: # XXX
4.可使用空格和锁紧tab键增强语句书写

        SQL分类
        -DDL:操作数据库,表

        1.操作数据库(database):
        CRUD
C-create:
创建--create database if not exists 数据库名称;
create database XXX character set gbk;创建gbk字符集的数据库;

R-retrieve:
查询--查询所有数据库名称:show databases;
--查询某个数据库的字符集:show create database 数据库名称;

U-update:
修改字符集--alter database XXX character set 字符集名称;

D-delete:删除
删除数据库--drop database if exists 数据库名称;

使用数据库
查询当前正在使用数据库名称--select database();
使用数据库--use 数据库名称;

        2.操作表(table):
        数据库类型:
int--整数类型
double(最多位数,小数点后位数)--小数类型,比如:100.0 为最长4位,小数点后1位
date--日期类型,只包含年月日,格式为:yyyy-MM-dd
datetime--日期,包含年月日,时分秒.格式:yyyy-MM-dd HH:mm:ss
timestamp--时间措类型,如果不赋值,则自动使用系统当前时间 格式:yyyy-MM-dd HH:mm:ss
varchar(最大长度)--字符串类型 一个中文为一个字符.一个字母也为一个字符

C-create:创建
create table 表名(
        列名1  数据类型1,
        列名2 数据类型2--注意:最后一列不需要加逗号
);
复制表:
create table XXX like 被复制的表名;

R-retrieve:查询
查询某个数据库中所有表名称--show tables;
查询表的结构--desc 表名;

U-update:修改
修改表名--alter table 表名 rename to 新表名

修改表的字符集--alter table 表名 character set 字符集名;
添加一列--alter table 表名 add 列名 数据类型;

修改列名 类型--alter table 表名 change 列名 新列名 新数据类型;
alter table 表名 modify 列名 新数据类型--只修改数据类型

删除列--alter table 表名 drop 列名;

D-delete:删除
drop table 表名;
drop table if exists 表名;

        -DML:操作表中的数据-增删改
添加数据--insert into 表名(列名1,列名2) values(值1,值2);
注意:
1.列名和值要一一对应.
2.如果表名后不定义列名,则默认给所有列添加值
3.除了数字类型,其他类型需要使用引号引起来,单双都行

删除数据--delete from 表名 where 条件; 不推荐使用,有多少条记录就会执行多少次删除操作,效率低
另一种删除法--truncate table 表名;    推荐使用, 因为会先删除表,然后在创建一个一模一样的空表;效率更高
注意:
1.如果不加条件,则删除表中所有记录.

修改数据--update 表名 set 列名1 = 值1, 列名2 = 值2 where 条件;
注意:如果不加条件,则会修改所有列的值

        -DQL:操作表中的数据-查
查询表中的所有数据--select * from 表名;

1.语法
select 字段列表
from 表名列表
where 条件列表
group by 分组字段
having 分组之后的条件
order by 排序
limit 分页限定

2.基础查询
-1.多个字段查询--select 列名1,列名2 from 表名;
-2.去除重复--select distinct 列名 from 表名;
-3.计算列--select 列名1,列名2,列名1+列名2 from 表名;
如果有null参与计算,结果都为null,解决方法:
select 列名1,列名2,列名1+ifnull(列名2,0) from 表名;
-4.起别名
select 列名1,列名2,列名1+ifnull(列名2,参数) as 别名 from 表名;
注意:  as 可以省略 但不能省略空格

        -DCL:授权
        Junit单元测试
属于白盒测试
        @Test
步骤:
1.定义一个测试类(测试用例),建议:类名:被测试的类名+test\ 包名:XXX.XXX.XX.test
2.定义测试方法,可以独立执行,建议:方法名:test测试的方法名\返回值:void\参数列表建议空参
3.给方法加@Test
4.导入Junit依赖环境

断言:Assert.assertEquals(期望的结果,运算的结果);

        @Before
初始化方法:用于资源申请,所有测试方法在执行之前都会先执行该方法

        @After
释放资源方法:在所有测试方法执行完后,都会自动执行该方法

        反射
反射:框架设计的灵魂
框架:半成品软件,可以在框架的基础上进行软件开发,简化编码

反射概念:将类的各个组成部分封装为其他对象,这就是反射机制.
好处:
1.可以在程序运行中,操作对象
2.可以解耦,提高程序的可开展性.

        获取字节码class对象的三种方式
1.class.forname("全类名"):将字节码文件加载进内存,返回class对象
        多用于配置文件,将类名定义在配置文件中,读取文件,加载类
2.类名.class:通过类名的属性class获取
        多用于参数的传递
3.对象.getclass():方法在Object中定义着.
        用于对象的获取字节码的方式

结论:同一个字节码文件在一次程序的运行过程中,只会被加载一次,不论通过哪种方式获取class对象都是同一个

暴力反射:忽略访问权限修饰符安全的检查
对象.setAccessible(true);

使用class对象
        Field:成员变量
获取对象
cls.getField(String name)
        获取pubic修饰的指定成员变量名
cls.getFields() -->返回Field数组
        获取所有public修饰的成员变量
cls.getDeclaredField()-->返回Field数组
        获取所有的成员变量,不考虑修饰符权限
cls.getDeclaredFields(String name)
        获取指定的成员变量

Field的操作方法:
获取值:get(对象名);
设置值:set(对象名,设置的内容);

        Constructor构造方法
获取构造方法
cls.getConstructor()
cls.getConstructors()
cls.getDeclaredConstructor()
cls.getDeclaredConstructors()

创建对象:
Constructor con =cls.getConstructor(String.class,int.class)
con.newinstance("张三",18);

如果传空参,则创建空参对象
简化操作:class对象.newinstance();-->cls.newinstance();

        Method 方法
获取方法        
cls.getMethod();
cls.getMethods();
cls.getDeclaredMethods();
cls.getDeclaredMethod();

执行方法:
Method method =cls.getMethod("eat",string.class);
method.invoke(object obj,参数列表)

获取方法名称:
string getname() 获取方法名称

获取类名
cls.getname()

        注解
作用分类:
1.编写文档
2.代码分析
3.编译检查

JDK中预定义的一些注解
@override:检测是否继承父类
@deprecated:将该注解标注的内容,表示已过时
@suppresswarnings:压制警告  @suppresswarnings("all")固定写法

自定义注解
格式:
元注解:描述注解的注解
public @interface 注解名

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

属性:接口中可以定义的成员方法(是抽象方法)
要求:
1.属性的返回值类型:基本数据类型,string,枚举, 注解,以上类型的数组.不能用void
2.定义了属性,在使用时需要给属性赋值,如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行赋值
ps:如果只有一个属性需要赋值,并且属性的名称为value,则value可以省略,直接定义值即可
数组赋值时,值使用{}包裹,如果只有一个值 {}可以省略

元注解:
@target:描述注解能够作用的位置
elementtype取值:TYPE-可以作用于类上
        MEHOD-可以作用于方法上
        FIELD-可以作用于成员变量上
@retention:描述注解被保留的阶段
retentionpolicy取值:
RUNTIME:(自定义的一般都选这个):当前被描述的注解,会保留到class字节码文件中,并被jvm读取到
CLASS:当前被描述的注解,会保留到class字节码文件中,不会被jvm读取到

@documented:描述注解是否被抽取到api文档中
有这个,那么生产API文档的时候注解会被现实出来,否则不会现实注解

@inherited:描述注解是否被子类继承
有这个,那么子类也会继承父类拥有的注解

        解析注解--用来替代properties文件来配置文件
获取注解中定义的属性值
1.获取注解定义的位置的对象(Class,Method,Field)
2.获取指定的注解: getAnnotation(自定义注解名.class)
3.调用注解中的抽象方法获取配置的属性值

        stream流(省略集合的一些步骤)
JKD1.8之后出现的,关注的是做什么,而不是怎么做

stream流只是对函数模型进行操作,并没有对元素本身进行操作.所以数据源没有变
stream流属于管道流,只能被使用一次,所以返回的stream流都是新的流,第一个stream流使用完毕,
数据就会流到下一个stream上,这时候第一个流就会关闭,所以第一个就不能再调用方法了

        两种获取stream流的方式
所有的collection集合都可以通过stream默认方法获取流

1.XXX.stream
2.stream.of(XXX)

如果是map双列集合,就先把集合转换为单列集合在转换为stream流

延迟方法:返回值类型仍然是stream流本身,还可以继续调用方法,链式编程.
终结方法:返回值不在是stream流本事,不能再继续调用方法

        常用方法foreach        打印
foreach接收一个consumer接口函数,它是一个消费型接口,所以可以用lambda表达式
foreach是终结方法:
XXX.stream.foreach(name->sout(name))

        filter方法        过滤
将一个流过滤成另一个流
接收predicate接口
Stream<T> stream =XXX.stream.filter((name)->{过滤代码}).filter((name)->{过滤代码})

        map方法        转换
接收function接口,将一种类型转换为另一种类型的流
Stream<Integer> stream = XXX.stream.map((string s)->{Integer.parseint(s)})       
把字符串转换为数字

        count方法    计数
是终结方法 ,不能使用链式编程
返回的是long类型
long count = XXX.stream.count();不能传参

        limit方法        截取
不是终结方法,可以使用链式编程
Stream<T> stream = XXX.stream.limit(int 截取个数) 截取前几个

        skip方法  跳过
Stream<T> stream = XXX.stream.skip(int 跳过的个数)
跳过前N个,取后面的

        concat方法  拼接
是静态方法.直接用Stream类名调用
stream.of(XXX)
stream.of(YYY)
Stream<T> stream = Stream.concat(XXX,YYY)

        方法引用--优化lambda

引用非静态方法
格式:    对象::方法   通过对象找到里面的方法去运行
引用运算符    ::  双冒号

通过类名引用静态成员方法
格式:类名::方法

通过super引用父类的成员方法
格式:super::方法

通过this0引用本类成员方法
格式:this::方法

类的构造器(构造方法)引用
格式:类名称::new-->创建对象
比如:print("迪丽热巴",person::new);

数组的构造器引用
格式:数组类型::new
比如:int[] ::new

0 个回复

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