黑马程序员技术交流社区
标题:
【石家庄校区】反射-数据库阶段总结
[打印本页]
作者:
暖羊羊
时间:
2018-1-11 15:55
标题:
【石家庄校区】反射-数据库阶段总结
本帖最后由 小石姐姐 于 2018-1-12 11:21 编辑
反射-数据库阶段总结
反射
反射
概念: 在程序运行时, 获取任何一个类的所有属性和方法(包括私有的). 调用任意一个对象的所有属性和方法(包括私有的)
前提:
获得字节码对象
获取字节码对象的3种方法
对象.getClass()
类名.class
Class.forName(String fullClassName)
反射能干的事
获取一个类的字节码对象, 通过该字节码对象:
获取一个类的构造方法(public或全部权限的)
创建一个类的对象
获取一个类的成员属性(public或全部权限的)
获取属性值
设置属性值
获取一个类的成员方法(public或全部权限的)
调用成员方法
反射使用的相关类和方法
java.lang.Class类: 类的字节码对象
获取构造方法
Constructor<?>[] getConstructors(): 以数组形式返回该类中所有public的构造方法. 如果没有public的, 则数组长度为0
Constructor<?>[] getDeclaredConstructors(): 以数组形式返回该类中所有权限的构造方法, 包括private的. 如果该类是接口, 基本类型, 数组, void, 则数组长度为0
Constructor<T> getConstructor(Class<?>... parameterTypes): 根据参数列表返回指定的public的构造方法. 参数列表填写参数的字节码对象
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes): 根据参数列表返回指定的所有权限的构造方法, 包括private的. 参数列表填写参数的字节码对象
获取成员属性
Field[] getFields(): 获取所有public的成员变量
Field[] getDeclaredFields(): 获取所有权限的成员变量, 包括private的
Field getField(String fieldName): 通过指定的成员变量名获取指定的public的成员变量
Field getDeclaredField(String fieldName): 通过指定的成员变量名获取指定的所有权限的成员变量, 包括private的
获取成员方法
Method[] getMethods(): 返回所有public的方法数组
Method[] getDeclaredMethods(): 返回所有权限的方法数组
Method getMethod(String name, Class<?>... parameterTypes): 获取public的方法, 传入方法名和方法形参字节码对象
Method getDeclaredMethod(String name, Class<?>... parameterTypes): 获取所有权限的指定方法, 传入方法名和方法形参字节码对象
创建对象
T newInstance(): 使用该类的无参构造创建一个对象
java.lang.reflect.Constructor类: 构造方法对象
T newInstance(): 通过无参构造方法对象创建一个类的对象
T newInstance(Object... initargs): 通过有参构造方法对象创建一个类的对象, 传入构造方法所需的参数列表
void setAccessible(boolean canAccess): 设置为true时禁用Java的访问安全检查, 可以访问所有权限的构造方法
java.lang.reflect.Field类: 成员变量对象
Object get(Object obj): 获取指定对象的属性值
void set(Object obj, Object value): 将指定对象的属性值设置为指定的值
void setAccessible(boolean canAccess): 设置为true时禁用Java的访问安全检查, 可以访问所有权限的成员属性
java.lang.reflect.Method类: 成员方法对象
Object invoke(Object obj, Object... args): 调用指定对象的成员方法
void setAccessible(boolean canAccess): 设置为true时禁用Java的访问安全检查, 可以访问所有权限的成员方法
JavaBean
就是一个类
作用: 用于封装和存储数据
规范
类必须是public修饰的
成员变量必须是private的
必须有public的set/get方法
至少提供一个无参构造方法
实现Serializable接口
Jar包
Java ARchive, 后缀名为.jar, 是一个压缩文件, 里面包含编译后的class文件和说明信息
作用: jar包中是写好的代码编译出来的class文件, 有了这些类文件, 就可以调用其中的方法
导入jar包的步骤
项目根目录下
创建名为lib的目录
复制jar文件, 粘贴到项目根目录下的lib目录下
选中项目中的jar包, 右键, 选择Build Path, 点击Add to Build Path. 此时项目中的Referenced Libraries中会出现jar包名称的奶瓶, 说明已经添加成功
导入的jar包整个项目都能使用
BeanUtils
Apache组织提供的第三方类库Commons中的一个组件
作用:
利用反射技术给一个类的对象的成员属性赋值或获取值, 用于快速封装数据到JavaBean
BeanUtils类常用的3个方法
static void setProperty(Object bean, String name, Object value): 给JavaBean对象的成员属性赋值, 传入对象, 成员属性名, 属性值
static String getProperty(Object bean, String name): 获取JavaBean成员属性的属性值, 传入对象, 成员属性名, 返回属性值的字符串形式
static void populate(Object bean, Map properties): 给JavaBean对象的成员属性
数据库
数据库
概念: 存储数据的仓库. 本质是一个文件系统, 数据按照指定的格式将数据存储起来, 用户可以对数据库中的数据进行增删改查
DBMS: Database Management System, 数据库管理系统. 是操作和管理数据库的大型软件, 用于建立, 使用和维护数据库, 对数据库进行统一管理和控制, 以保证数据库的安全性和完整性. 用户通过数据库管理系统访问数据库中表内的数据
常见数据库
MySQL
Oracle
数据库: 存储数据表
数据表: 存储记录
由行和列组成的
DBMS: 操作数据库
表和Java类的对应关系
表名: Java类名
列名: 成员属性名
记录: 类对象
MySQL
安装
配置和遇到的问题
命令行的登录和退出
登录: mysql -u 用户名 -p
退出: exit
SQL基本语言
SQL的概念: Structured Query Language, 结构化查询语言
结构: 数据表是由行和列组成的, 是有结构的, 从这种结构中查询
SQL的4中分类
DDL: Data Defination Language, 数据定义语言, 用来定义数据库对象(库, 表等)
CREATE
ALTER
DROP
DML: Data Manipulation Language, 数据操作语言, 对表中的记录进行增, 删, 改
INSERT
UPDATE
DELETE
DQL: Data Query Language, 数据查询语言, 对表中的记录进行查
SELECT
FROM
WHERE
DCL: Data Control Language, 数据控制语言, 创建修改用户, 权限
SQL特点
SQL不区分大小写
一条SQL语句以;分号结尾, 一条语句可以多行书写
单词之间通过空格分隔, 参数之间通过,逗号分隔
字符串和日期要用''或""引起来, 建议单引号
SQL注释(2+1种)
2种单行注释
#单行注释
-- 单行注释: 减号后必须有一个空格
1种多行注释: /* 注释内容 */
SQL的数据类型
INT: 整数
DOUBLE: 小数
VARCHAR: 可变长度字符
CHAR: 固定长度字符
其他看文档
VARCHAR和CHAR的区别:
VARCHAR(200), 可变长度字符, 存储占用的内存空间是可变的, 如果你的数据容量小于我们指定的空间大小, 那么就会按照实际的数据空间来开辟内存大小
优点: 节省内存
缺点: 因为每次存入数据时都会判断数据的实际大小, 来动态修改内存空间, 所以需要占用资源, 效率低
CHAR(200), 固定长度字符, 存储占用的内存空间是不可变的. 无论实际存入的数据容量是多大, 都占用这么大的空间
优点: 插入数据时不需要额外操作, 效率高
缺点: 可能会浪费空间
SQL对库的操作
创建库
使用默认字符集创建库: CREATE DATABASE 库名;
默认是UTF-8编码
指定字符集: CREATE DATABASE 库名 CHARACTER SET '字符集';
删除库
DROP DATABASE 库名;
查看所有库
SHOW DATABASES;
使用库
USE 库名;
查看当前使用的库
SELECT DATABASE();
SQL对表的操作
创建表: CREATE TABLE 表名 (列名1 数据类型 约束, 列名2 数据类型 约束);
删除表: DROP TABLE 表名;
查看当前库中的所有表: SHOW TABLES;
修改表的结构: ALTER TABLE 表名 操作关键字 列名 数据类型 约束;
增加列: ALTER TABLE 表名 ADD 新列名 新数据类型 新约束;
删除列: ALTER TABLE 表名 DROP 列名;
修改列的数据类型和约束(不能修改列名): ALTER TABLE 表名 MODIFY 列名 新数据类型 新约束;
修改列的列名, 数据类型, 约束: ALTER TABLE 表名 CHANGE 旧列名 新列名 新数据类型 新约束;
修改表名: RENAME TABLE 旧表名 TO 新表名;
SQL对记录的操作
增
一次插入一条记录: INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2);
一次性插入一条记录(省略自增主键): INSERT INTO 表名 (非主键自增列1, 非主键自增列2) VALUES (值1, 值2);
一次插入所有列的记录(省略列名): INSERT INTO 表名 VALUES (值1, 值2);
值的数量和顺序必须和表的列一致
一次插入多个记录(指定列): INSERT INTO 表名 (列1, 列2) VALUES (记录1值1, 记录1值2), (记录2值1, 记录2值2);
一次插入多个记录(省略列): INSERT INTO 表名 VALUES (记录1值1, 记录1值2), (记录2值1, 记录2值2);
删
删除符合条件的记录: DELETE FROM 表名 WHERE 条件;
删除所有记录: DELETE FROM 表名;
清空表: TRUNCATE TABLE 表名;
DELETE FROM 表名;和TRUNCATE TABLE 表名;的区别
DELETE, 逐条删除记录, 不会重置自增计数器
TRUNCATE, 删除表再重建, 会重置自增计数器
改
修改符合条件的记录: UPDATE 表名 SET 列名1=新值, 列名2=新值 WHERE 条件;
修改所有记录: UPDATE 表名 SET 列名1=新值, 列名2=新值;
查
查询指定列: SELECT 列名1, 列名2 FROM 表名;
查询所有列: SELECT * FROM 表名;
条件查询: SELECT 列名1, 列名2 FROM 表名 WHERE 条件;
运算符
比较运算符
=: 相等
<>或!=: 不等
>: 大于
<: 小于
>=: 大于等于
<=: 小于等于
BETWEEN...AND...: 在一个范围内(包含头和尾)
如: BETWEEN 0 AND 10
IN (): 在列表中, 满足列表中一个即可
如: IN (1, 3, 5)
IS NULL: 是空
LIKE '通配符': 模糊查询
%: 一个百分号可以表示任意个字符. 比如'王%', 王大锤, 王五
_: 一个下划线可以表示一个字符. 比如'王_', 只能匹配王五
逻辑运算符
AND: 与. 两边条件同时成立才成立
OR: 或. 两边条件只要有一个成立就成立
NOT: 非, 取相反结果
NOT BETWEEN ... AND ...: 不在范围内
NOT IN: 不在列表中
NOT LIKE: 不匹配
IS NOT NULL: 非空
去重: SELECT DICTINCT 列名1, 列名2 ... FROM 表名 WHERE 条件;
别名:
字段名 AS 别名
表名 AS 别名
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2