第一周:day29--day34
一.数据库 1.事务的概念事务就是在执行某个业务功能中,当这个业务功能它同时执行多个sql语句,将这多个sql语句的执行
过程看成一个整体,要么同时执行成功,要么同时执行失败.
2.数据库三大范式1NF:(最基本范式)
第一范式 : 数据库表中的每一列是不可在拆分的原子数据项(是一个独立的列)
2NF:
第二范式: 满足第一范式基础上,每张表非主键字段(列)必须完全依赖于主键字段,不能产生部分依赖
3NF:
第三范式: 满足第二范式基础上(非主键字段必须完全依赖主键字段),非主键字段不能产生传递依赖.
3.反射 3.1获取一个类的字节码文件对象(1)方式1:Object类的getClass()方法获取
public final Class> getClass()
(2)方式2:任意Java类型的class属性
(3)方式3:反射类中字节码文件对象Class 里面静态方法,返回值是当前类本身
public static Class> forName(String className) throws ClassNotFoundException
方式1:
Person p = new Person() ;
System.out.println(p.getClass());
方式2:
Class personClazz = Person.class ;
方式3:
Class c = Class.forName("com.qf.reflect_01.Person"); 参数必须是类的全限定名称:包名.类名
3.2获取构造方法
<1>获取这个类所有公共的构造方法:public Constructor>[] getConstructors()
<2>获取这个类中所有的构造方法,包括私有,或者受保护的:
public Constructor>[] getDeclaredConstructors():
<3>获取单个的公共构造方法:(参数:参数类型的class,就是类型字节码文件对象)
public Constructor
<4>获取单个的指定的构造方法(参数为参数类型的class)
public Constructor
3.2.1获取公共构造方法
(1)获取字节码文件
(2)获取构造方法
3.2.2获取私有构造方法
(1)获取字节码文件
(2)获取构造方法
(3)非公共时取消语言访问限制
public void setAccessible(boolean flag)
(4)创建实例
public T newInstance(Object... initargs) :参数:实际参数值
3.3获取成员变量(1)获取字节码文件对象
(2)通过反射获取成员变量所在的Field类对象
<1>获取所有的公共字段的类对象
public Field[] getFields()
<2>获取所有的字段(成员变量)的类对象,包括默认,受保护,私有
public Field[] getDeclaredFields()
<3>获取指定的默认字段所在的字段类对象Field(参数为指定的属性名称)
public Field getDeclaredField(String name)
(3)取消Java语言访问检查
(4)将参数值绑定在当前类的实例
public void set(Object obj, Object value)
3.4获取成员方法<1>获取当前类公共的成员方法,以及继承的公共方法
public Method[] getMethods()
<2>获取所有的成员方法类对象,只包含自己的,不包括继承的
public Method[] getDeclaredMethods()
<3>获取指定的公共成员方法(参数1:成员方法的方法名,参数2:成员方法携带参数类型的class)
public Method getMethod(String name,Class>... parameterTypes)
<4>获取指定的私有成员方法所在类对象Method(参数1:成员方法的方法名,参数2:成员方法携带参
数类型的class)
getDeclaredMethod(String name,Class>... parameterTypes)
<5>底层方法调用Method里面调用机制
public Object invoke(Object obj,Object... args)
3.4.1获取公共成员方法
(1)获取类字节码文件对象
(2)获取公共的show方法所在的类对象并且调用这个方法
3.4.2获取私有成员方法
(1)获取字节码文件对象
(2)获取成员方法所在类对象
(3)取消java语言访问检查
(4)调用
4.JDBC开发步骤(1)第一步:导包: mysql驱动jar包
(2)第二步: 注册驱动
使用 Class.forName("com.mysql.jdbc.Driver");手动加载字节码文件到 JVM 中。
(3)第三步: 获取数据库的连接对象: 驱动管理程序的类DriverManager
public static Connection getConnection(String url,String user,String password)
参数1:连接数据库的地址; 参数2:数据库的用户名; 参数3:密码
(4)第四步: 准备好sql语句
String sql = "sql语句";
(5)第五步: 通过连接对象创建执行对象Statement
Statement createStatement()
(6)第六步: 执行sql语句:
<1>通用方法:增删改
int executeUpdate(String sql)
<2>查询语句
ResultSet executeQuery(String sql)
boolean next(): 将光标从当前位置向前移动一行。
XXX getXXX( int columnIndex;):通过列的索引值获取内容
XXX getXXX(String columnLaber):通过列的标签名称获取内容(字段名称)
(7)释放资源
5.PreparedStatement(1)通过Connection接口下: PreparedStatement prepareStatement(String sql):获取预编译对象,同
时将参数化sql发送给数据库,通过预编译sql语句对象,它内存中就可以对参数?(占位符)赋值.
(2)通过void setXXX(int parameterIndex,XXX x)进行赋值
参数1:就是第几个占位符号(占位符的索引值,从1开始)
参数2:赋的实际参数---根据字段类型
(3)PreparedStatement特点:参数化的sql,防止参数字符串拼接,有效防止SQL注入,比Statement
更安全.
(4)面试题:PreparedStatement和Statement区别
<1>PreparedStatement: 预编译对象,执行都是参数化的sql语句,sql语句参数都是占位符号?,可以有
效防止sql注入(不存在字符串拼接),sql语句就执行一次,可以发送不同的参数进行赋值,执行sql效率
相对快于Statement.
<2>Statement:普通的执行对象,每次执行的都是静态的sql,存在硬编码,而且存在字符串拼接,会造成
sql注入,不安全,执行sql效率低,每次执行都要发送sql.
6.Junit使用 6.1使用步骤(1)导包
(2)自定义类,书写单元测试方法
(3)没有返回值类型,没有参数类型
(4)方法注解@Test---启动器
7.注解 7.1注解的概念注解: 标记类,方法,参数,成员变量,由一种特殊的含义 (能被解析的);注解不是注释,注释针对代码解
释说明的文字,普通注释不能被解析,除非文档注释.
注解的本质就是接口interface---->前面加入了@标记
注解中的属性----->就是接口中的方法名
java代码经历三个阶段:SOURCE :原码编译阶段; CLASS: 类的加载; RUNTIME:运行阶段
7.2注解的分类jdk内置注解
(1)@Overrid:标记当前这个方法是否为重写方法
(2)@Deprecated:标记某个方法是过时方法
(3)@SuppressWarnings:压制警告
(4)@FunctionalInteface:函数式接口 :jdk8后;接口如果只有一个抽象方法,那么这个接口就可以是函
数式接口----使用lambda表达式.
7.3元测试提供的其他注解(1)@Before:它标记的方法在执行@Test方法之前先执行,后期的服务器的初始化操作代码
(2)@After它标记的方法是在执行@Test方法之后执行,存储的一些释放资源代码
(3)断言的功能:Assert.asserEquals(预期的结果,单元测试中的结果):进行匹配,如果值一样,就断言成
功,否则断言失败.
7.4注解中的属性(方法名)返回值类型(1)String
(2)枚举类型Enum
(3)注解类型@Annotation
(4)基本类型
(5)以上类型的数组
8.动态代理 8.1代理核心思想代理: 最终目的是使用代理角色帮助真实角色完成事情;程序中,就是对业务功能进行增强.
动态代理---是在程序运行过程中,通过反射获取代理对象
8.2动态代理基本方法(1)核心类:Proxy:该类提供了创建动态代理类和实例的静态方法
Proxy静态功能: public static Object newProxyInstance(ClassLoader loader,
Class>[] interfaces,InvocationHandler h);
参数1:当前基于接口的类加载器
参数2:代理类实现的接口列表
参数3:基于代理的处理程序的接口
(2)InvocationHandler是代理实例调用处理程序实现的接口 ;
通过invoke方法处理代理实例上的方法并返回结果;
Object invoke(Object Proxy,方法 method,Object[] args) throws Throwable;
参数1:调用该方法的代理实例
参数2:当前需要被增强的方法
参数3:当前被增强方法的实际参数数组;
public class UserTest {
public static void main(String[] args) {
UserDao ud = new UserDaoImpl() ; 真实角色
MyInvocationHandler handler = new MyInvocationHandler(ud) ;
UserDao udProxy = (UserDao) Proxy.newProxyInstance(
ud.getClass().getClassLoader(),
ud.getClass().getInterfaces(),
handler);
udProxy.add() ;
}
}
代理角色可以是任意java对象
public class MyInvocationHandler implements InvocationHandler {
private Object target ; 目标对象
public MyInvocationHandler(Object target)
this.target = target ;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
System.out.println("权限校验") ;
Object obj = method.invoke(target, args);
System.out.println("产生日志记录");
return obj; 代理对象
}
}



