【石家庄校区】学习小结
反射:
在运行时,我们可以获取任意一个类的所有方法和属性
在运行时,让我们调用任意一个对象的所有方法和属性
前提:
要获取类的对象(Class对象)
Class:
Constructor<?>[]getConstuctors():获取一个对象中所有的构造方法(public所修饰的构造)
Constructor<T>getConstuctor(Class<?>... parameterTypes):根据传入字节码参数获取构造方法(若无参数,获取的是无参构造)
TnewInstance():使用无参的构造方法创建对象
Field[]getFidlds():获取对象中所有的被public修饰的成员变量
FieldgetField(String name):根据变量名获取对象中的被public修饰的成员变量对象
Field[]getDeclaredFields():获取对象中所有的成员变量
MethodgetMethod(String name,Class<?>...parameterTypes):获取对象中被public修饰的成员方法对象,name为方法名,可变参数为方法参数
MethodgetDeclaredMethod(String name,Class<?>...parameterTypes):获取对象的成员方法对象
Constuctor:
TnewInstance(Object... initargs):使用构造方法创建对象
voidsetAccessible(boolean flag):如果为true取消Java的访问检查,暴力访问
Field:
Objectget(Object obj):返回对象的对象值
voidset(Object obj,Object value):通过成员变量对象,修改指定为指定的值
voidsetAccessible(boolean flag):如果为true取消Java的访问检查,暴力访问
Method:
Objectinvoke(Object,Object...args):调用方法
voidsetAccessible(boolean flag):如果为true取消Java的访问检查,暴力访问
SQL语句
SQL分类
数据定义语言:简称DDL,用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等
数据操作语言:简称DML,用来对数据库中表的记录进行更新。关键字:insert,delete,update等
数据控制语言:简称DCL,用来定义数据库的访问权限和安全级别,及创建用户。
数据查询语言:简称DQL,用来查询数据库中表的记录。关键字:select,from,where等
SQL语法特点:
SQL语句可以单行或多行书写,以;结尾
可使用空格和缩进来增强语句的可读性
MySQL数据库的SQL语句不区分大小写,建议使用大写,例如:SELECT * FROM user。
同样可以使用/**/的方式多行注释
#单行注释
--单选注释(空格不能少)
字符串和日期要使用''单引号或""双引号包裹,推荐单引号
SQL数据类型
int 整型
double 浮点型
varchar 字符串型(可变字符型)
date 日期类型,只有年月日,没有时分秒
time 时间类型
datetime 日期时间类型
SQL语句
CREATEDATABASE 数据库名 (CHARACTER SET 字符集);
SHOWDATABASES; 显示所有数据库
SHOWCREATE DATABASE 库名;查看该库的信息
DROPDATABASE 数据库名;删除数据库
USE库名;使用库
SELECTDATABASE();查看当前正在使用的数据库
创建数据表
CREATETABLE 表名(
列名1 数据类型(长度) 约束,
列名2 数据类型(长度) 约束,
...
)
约束:
主键:PRIMARY KEY,限制该列的记录值不能为空且唯一,相当于同时设定了NOT NULL和UNIQUE
非空:NOT NULL
自增:AUTO_INCREMENT,设置该列的记录值可以自动增加(只能用于数据类型)
唯一:UNIQUE:不能重复
外键:FOREIGN KEY,主要是连接加一个表的主键
检查:CHECK(条件),限制该列插入的记录值是否符合要求
默认值:DEFAULT,限制该列记录如果没有插入值,则使用默认值
SHOWTABLES:查看库中的所有表
DESC表名:查看表结构
DROPTABLE 表名:删除表
DOS命令行乱码
临时:set name 'gbk';(将数据库数据修改为Windows的GBK)
增删改
修改表名:
RENAMETABLE 表名TO 新名;
修改表的字符集:
ALTERTABLE 表名CHARACTER SET 字符集;
列
添加列,添加字段:
ALTERTABLE 表名ADD 列名 数据类型 约束;
修改列:
ALTERTABLE 表名MODIFY 列名 数据类型 约束;
修改列名:
ALTERTABLE 表名CHAGE 旧列名 新列名 数据类型 约束;
删除列:
ALTERTABLE 表名DROP 列名;
添加数据
一次添加单条:
INSERTINTO 表名(列名1,列名2,列名3....)VALUES (值1,值2,值3)
添加数据格式,所有值全给出
INSERTINTO 表名VALUES (全列值)
一次添加多条:
INSERTINTO 表名(列名1,列名2,列名3...)VALUES(值1,值2,值3),(值1,值2,值3),...
注意:
列名,表名问题
对应问题,个数,数据类型
插入主键可以用null代替
更新(修改)数据
UPDATE表名SET 列1=值1,列2=值2....WHERE 条件;
删除数据
DELETEFROM 表名WHERE 条件;
清空数据:
DELETEFROM 表名;
逐条删除记录,不会重置自增计数器
TRUNCATETABLE 表名;
全部删除记录,重置自增计数器
查询数据
普通查询:
查询指定列的数据
SELECT列名1,列名2 ... FROM 表名;
查询所有列的数据
SELECT* FROM 表名;
去重查询
SELECTDISTINCT 列名FROM 表名;
#如果多个列,则按照多个列组合去重
查询重新命名列
SELECT列名AS 临时列名 FROM 表名 AS 临时表名;
在查询数据中,可以直接进行数学计算
条件查询:
即按指定条件查询记录返回符合条件的结果集, 使用SELECT和WHERE组合
作用: 条件子句, 过滤符合条件的结果
运算符
比较运算符
=:相等
<>或!=: 不等
>:大于
<:小于
>=:大于等于
<=:小于等于
BETWEEN...AND...: 在一个范围内(包含头和尾), BETWEEN 0 AND 10; 0~10
IN(): 在列表中, 满足列表中一个即可
如: IN (1, 3, 5)
ISNULL: 是空
LIKE通配符`: 模糊查询
通配符种类
%:一个百分号可以表示任意个字符. 比如王%, 王大锤, 王五
_:一个下划线可以表示一个字符. 比如王_, 只能匹配王五
逻辑运算符
AND:与.两边条件同时成立才成立
OR:或.两边条件只要有一个成立就成立
NOT:非,取相反结果
NOTBETWEEN ... AND ...: 不在范围内
NOTIN: 不在列表中
NOTLIKE: 不匹配
ISNOT NULL: 非空
日期也是可以比较的
对结果集进行排序
ORDERBY 列名[DESC][ASC],列名 [DESC][ASC]
先过滤条件WHERE查询再排序
分组
GROUPBY 列名[HAVING] 条件
分组必须跟随聚合函数
SELECT查询的时候,被分组的列,要出现在SELECT选择列的后面
聚合函数:
count:统计个数
sum:求和
avg:平均值,如果列中有空值,则忽略不算
max:求最大值
min:求最小值
JDBC
JDBC:
就是一套API,就是Sun定义的类或者是接口,由数据库厂商实现
JDBC开发步骤
前提: 导入数据库驱动jar包
代码编写步骤:
1.注册驱动
告知JVM使用哪一个数据库驱动
使用java.sql.DriverManager类静态方法registerDriver(Driver driver)
Driver是一个接口,参数传递,传入MySQL驱动程序中的实现类
//DriverManager.registerDiver(newDriver());
通过源代码看出,源代码已经注册了驱动,不需要重复再次注册,不推荐
推荐使用反射注册
Class.forName("com.mysql.jdbc.Driver");
2.获取连接
使用JDBC中的类, 创建对MySQL数据库的连接
DriverManager方法:
staticConnection getConnection(String url,String user,String password)
返回值是Connection接口的实现类,在mysql驱动程序
url:数据库地址 jdbc:mysql://连接的主机IP:端口号/数据库名字
如:String url="jdbc:mysql://localhost:3306/mybas";
可以将localhost:3306删除,默认为localhost:3306
3.获取语句执行平台
通过连接对象获取对SQL语句的执行者对象
Connection调用方法
StatementcreatStatement():获取Statment,该对象用于将SQL语句发送到数据库
PreparedStatementpreparedStatment(String sql):预编译SQL语句
方法中参数,SQL语句的参数全部采用问号占位符
4.执行SQL语句
使用执行者对象, 向数据库执行SQL语句, 并获取执行结果
Statement接口
intexecuteUpdate(Stirng sql):执行SQL语句,仅限于INSERT,DELETE,UPDATE,返回生效的行数
ResultSetexeceteQuery(String sql):执行SQL,仅限于SELECT
ResultSet接口
booleannext():将结果集的指针向下移动一行,并返回是否还有下一条记录
注意:没有调用该方法之前,ResultSet的光标是在第一行之前,只有调用一次next方法后,指针才能指向第一条记录
StringgetString(String columnName):以字符串形式获取columnName列的数据
防止注入攻击
PreparedStatment:对SQL预编译存储,多次高效的执行SQL
使用PreparedStatement的set方法对占位符上的参数进行设置
如:setObject(inti,Object obj);i从1开始
5.处理结果
根据项目的业务需求对结果进行操作
6.释放资源
释放数据库连接, 必须
stat.close();
con.close();
SQL的注入攻击
原因:使用字符串拼接,用户输入单引号
如:1' or '1=1
ORM:对象关系映射,就是指Java对象和关系型数据表的相互转换过程
dao:一般操作数据库的包叫做dao
DBUtils
可以操作事务,回滚
QuerRunner
update(Connectioncon,String sql,Object...param),用来完成表数据的增加,删除,更新操作
query(Connectioncon,String sql,ResultSetHandler r,Object...parm),查询数据
注意:query方法返回值,返回的值是泛型,具体返回值类型,跟随结果集处理方式变化
ResultSetHandler
ArrayHandler 将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值
ArrayListHandler 将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
BeanHandler 将结果集中第一条记录封装到一个指定的javaBean中。
BeanListHandler 将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
注意:JavaBean必须要有空参构造
ColumnListHandler 将结果集中指定的列的字段值,封装到一个List集合中
ScalarHandler 它是用于单数据。例如select count(*) from 表操作。
MapHandler 将结果集第一行封装到Map集合中,Key列名, Value 该列数据
MapListHandler 将结果集第一行封装到Map集合中,Key列名, Value 该列数据,Map集合存储到List集合
设计模式:
实际的软件开发,对问题的处理总结经验,设计模式.
在JAVA中,一共有23种设计模式
分类
创建型
关系型
功能型
单例模式:
保证一个类的对象唯一性
饿汉式:
私有构造方法
在本类的成员位置,创建出自己类的对象
提供一个静态的方法getXXX(getInstance),获取单例对象
在多线程下安全
懒汉式(安全的,高效的应用):
私有构造方法
在本类的成员位置,定义自己类的变量赋值为空
提供一个静态的方法getXXX(getInstance),如果变量为空则创建自己类的对象,返回单例对象
在多线程并发下不安全
解决方式:
加锁:snychronizeda
在锁的外面加上非空判断,如果不为非空则不需要拿锁,这样可以提高运行的效率
工厂模式:
将所有的创建对象的任务,交给一个工厂实现
找工厂获取即可
简单工厂:
优点:方便创建对象
缺点:如果传入的对象没有找到,会出现空指针异常
工厂方法:
将每个对象,交给了各自工厂去创建
缺点:如果对象太多,那么工厂也太多