![2326b3abf404dd0464f3d8175e8fbed5.png](https://i-blog.csdnimg.cn/blog_migrate/ebdac4b86b5902a41a65b45ec32484d8.jpeg)
新的一周,新的催更,新的学习,学习使我昏厥。
![756128b1dd8af65271e579874d4bb386.png](https://i-blog.csdnimg.cn/blog_migrate/9b6a2f14d951fafbd4465bef0dcc187c.jpeg)
正文分割线
一、反射
1、反射的定义:在程序编译的过程中动态加载类的方式。
2、反射的使用顺序:
1)获得一个类的定义:
Class.forname(类的限定名);当你不知道类的名字时候。
类名.class;当你知道类名字时,你可以用类名.class。
类对象.getclass();当这个类已经实例化了以后,你可以用类对象.getclass()方法。
2)创建类对象:
调用无参构造器产生实例:直接用该class对象.newInstance();
调用有参构造器产生实例:该class对象.getConstructor(参数的数据类型.class);这个方法会返回一个Constructor对象,用这个对象调用newInstance(具体的参数)来实例化对象
3)调用属性
使用Field来得到类的属性:直接用该class对象.getField(某某属性)
如果该类是私有类,那么我们需要给其他类授权访问私有属性:该类class对象.setAccessible(true);然后再通过该类class对象.getDeclaredField(某某属性)
给属性赋值的话就使用set方法。
4)调用私有方法
使用Method来得到某方式:直接用该类class对象.getMethod(方法名,null)
假如这个方法私有方法,那么处理方法和上面的一样。最后使用getDeclaredMethod。
调用该方法的话就是使用invoke方法。
5)获得注解
使用MyLog来获得方法上面的注解。
首先要获得该方法Method类对象,然后用这个类对象.getAnnotation(MyLog.class);
二、JDBC
1、JDBC的定义:
JDBC(Java Database Connectivity)是Java中提供的一套数据库编程API,它定义了一套用来访问数据库的标准Java类库(位于java.sql和javax.sql包中)
2、JDBC的作用:
通过发送SQL语句,来完成对数据库的操作(CRUD)
JDBC:只是一套JAVA用来连接数据库的标准API(接口)而已,具体的实现还需要不同的厂商自己实现。由于它的标准是统一,所以JDBC可以通过同一套代码连接不同的数据库
mybatis,hibernate,spring-data-jpa 他们的底层,连接数据库都是使用的JDBC
3、JDBC的执行过程
![0d0ef73d9977936fa068cce1c57c12fb.png](https://i-blog.csdnimg.cn/blog_migrate/f2695c5a217f3146f1e7325e438d9040.jpeg)
三、JDBC连接数据库的6个步骤
1、根据相应程序所用的数据库,选择JDBC驱动程序类型。
从从https://mvnrepository.com/ 网上下载 mysql-connector-java.jar 驱动包
![eda80353c21b5a2ccebd351595a71c79.png](https://i-blog.csdnimg.cn/blog_migrate/60a7ecefda65bdb2e278b6cfb49e5b3f.jpeg)
在项目中,创建一个目录lib (库) 跟src 平级
运行select version();检查数据库的版本
5.6 — mysql-connector-java-5.1.47.jar
8.+ — mysql-connector-java-8.0.19.jar
选择mysql-connector-java-5.1.47.jar 右键—Build Path — Add Buid Path把数据库文件加载到项目之中。
2、连接到数据库,得到Connection对象
package com.woniuxy.java33.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class MainEnter {
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection conn = null;
try {
//使用反射加载数据库的驱动程序
Class.forName("com.mysql.jdbc.Driver");
//使用url name password 连接MySQL数据库
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/woniuxy?characterEncoding=utf8", "root", "123456");
//取消自动提交
conn.setAutoCommit(false);
3、通过Connection创建Statement对象
//创建Statement编译对象
Statement state = conn.createStatement();
4、使用Statement对象提交SQL语句
//编写需要发送给MySQL的SQL语句
String sql = "insert into user_info(user_name,age,gender) values ('坡上',18,'男')";
5、操作结果集
//调用executeUpdate() 执行SQL语句,并查看数据库受影响的行数
int result = state.executeUpdate(sql);//通常用来CUD
System.out.println("rows==" + result);
//事务提交
conn.commit()
6、回收数据库资源
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
try {
//数据库回滚
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}finally {
try {
//连接关闭
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
代码详解
package com.woniuxy.test;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 反射中所涉及的方法
* @author 84980
*
*/
public class Improtant{
//主启动类
public static void main(String[] args) {
try {
//通过Class.forName获得Class类,其中的参数是类的全限定名
Class cls = Class.forName("com.woniuxy.test.Clazz");
//如果已知类的情况,使用类名.class也可以获得
Class cls2 = Clazz.class;
//如果已知类的对象,使用对象.getClass()同样可以获取到
Clazz clazz = new Clazz();
Class cls3=clazz.getClass();
//可以看到三个对象都是一样的
System.out.println(cls);
System.out.println(cls2);
System.out.println(cls3);
//通过Class类对象创建对象,通过无参构造器创建
Object obj = cls.newInstance();
//通过有参构造器创建对象,有参构造器中参数是什么类型就传入该类型的类
Constructor cons =cls.getConstructor(int.class,int.class);
Object obj1=cons.newInstance(11,12);
//打印两个实例化类
System.out.println(obj);
System.out.println(obj1);
//调用属性
Field field=cls.getField("num_pub");
//给属性赋值,第1个参数为实例化的对象
field.set(obj,100);
//获得私有属性
Field field2=cls.getDeclaredField("num_pri");
//假如遇到是私有属性的话要授权访问私有属性
field2.setAccessible(true);
field2.set(obj, 101);
//现在obj这个对象中属性就有值了
System.out.println(obj);
//调用方法
Method meth = cls.getMethod("method_pub", int.class);
//调用方法
Object result = meth.invoke(obj, 11);
System.out.println(result);
//调用私有方法
Method meth1 = cls.getDeclaredMethod("method_pri", int.class);
//授权访问私有方法
meth1.setAccessible(true);
Object result1 = meth1.invoke(obj, 12);
System.out.println(result1);
//获得注解,此处的MyLog是你自定义的注解名字
MyLog mylog = meth.getAnnotation(MyLog.class);
System.out.println(mylog.desc());
System.out.println(mylog.uri());
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
/**
* 反射所引用的类
* @author 84980
*
*/
class Clazz{
//公共的属性
public int num_pub;
//私有的属性
private int num_pri;
//公共的方法
@MyLog(desc="我爱你",uri="我不爱你")
public int method_pub(int a) {
System.out.println("方法调用1"+a);
return a;
}
//私有的方法
private int method_pri(int a) {
System.out.println("方法调用2"+a);
return a;
}
//无参构造器
public Clazz() {
super();
}
//有参构造器
public Clazz(int num_pub, int num_pri) {
super();
this.num_pub = num_pub;
this.num_pri = num_pri;
}
@Override
public String toString() {
return "Clazz [num_pub=" + num_pub + ", num_pri=" + num_pri + "]";
}
}
自定义的注解
package com.woniuxy.test;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 自定义一个注解
* @author 84980
*
*/
@Documented //该注解可以文档化
@Target(value= {ElementType.TYPE,ElementType.METHOD}) //注解使用范围
//括号中的参数代表着这个注解可以放在接口、类、枚举和方法上
@Retention(RetentionPolicy.RUNTIME)
public @interface MyLog {
//随便创建两个注解的变量
String uri();
String desc();
}
JDBC简单地操作数据库(注意导包哦,你的数据库是哪个版本就用哪个版本的JDBC)
package com.woniuxy.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
*
* @author 84980
*
*/
public class ThreadStudy {
public static void main(String[] args) {
//定义一个数据库连接
Connection conn = null;
try {
//使用反射加载数据库的驱动程序
Class.forName("com.mysql.jdbc.Driver");
/*连接你的数据库
* jdbc:mysql:是固定写法
* 后面那个是你数据库所在的ip地址,假如安装到本机的话就是本机的IP地址
* 后面的3306是数据库默认使用的端口,假如你在安装数据的时候没有改过,那么默认就是3306
* 后面woniuxy这个是你数据库的名字
* ?后面那个是编码格式
* 后两个参数是你的账号和密码
*/
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/woniuxy?characterEncoding=utf8", "root", "admin123456");
//取消自动提交
conn.setAutoCommit(false);
//通过Connection创建Statement对象
Statement state = conn.createStatement();
//使用Statement对象提交SQL语句,此处写SQL语句就像之前前两天写SQL语句那样
String sql = "insert into user_info(user_name,age,gender) values ('坡上',18,'男')";
//调用executeUpdate() 执行SQL语句,并查看数据库受影响的行数。这个方法通常用来增,删,改
int result = state.executeUpdate(sql);
System.out.println("影响行数=="+result);
//提交事务
conn.commit();
} catch (Exception e) {
//假如执行有问题就回滚数据库,就是让插入数据这个操作撤回
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
}
}finally {
//回收数据库资源
//关闭连接
try {
conn.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}