因为这个JDBCutil是博主自己学了反射的知识以后然后这边进行一个记录一下自己的学习历程。
然后这边每一条的代码我都有详细的标注。能够确保小白都能看懂。
这边需要引入一个工厂的依赖。
这边把这个源码简单的讲解一下:
其实简单来说就是,通过这个依赖利用配置文件去创建一个工厂,然后后面的方法里面都需要去拿到这样一个的链接对象,当然这个工厂里面肯定会有很多的对象,所以我们用了一个就需要还给他,有借有还嘛,对吧。所以我们在方法执行完以后都需要去关闭这个资源,这样就相对的归还了这个对象。
在每一个的方法里面我们都需要去拿到有一个数据库的链接对象。然后根据需要去得到这样一个预编译对象或者是拼接语句的对象,以及相对应的这个包装类的class对象,因为查询语句这边处理是获取一个class对象然后去实例化,然后分装,然后再返回给调用位置。每一个位置都有用到反射。所以说反射其实是很重要的。如果可以在渗透过程中用到反射的话,那么权限的设置形同虚设。一切java对象的爸爸。
所以源码与原理理解以后你会收获很多,其他的不多说,代码如下:
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
public class JDBCutil {
public static void main(String[] args) {
}
static DataSource dataSource;
static{
try {
//通过类加载来获取jabc的配置文件信息
InputStream inputStream = cn.smxy.ProjectS01_217.dao.JDBCutil.class.getResourceAsStream("/jdbc.properties");
//使用Properties对象操作properties文件
Properties properties = new Properties();
//将配置文件加载到Properties对象中.加载配置文件中的所有属性
properties.load(inputStream);
//通过druid来创建一个工厂类
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
//获取数据库操作对象,调用后记得还给我
public static Connection getConnection () {
try {
return dataSource.getConnection();
} catch (SQLException throwables) {
System.out.println("返回数据库链接失败,数据库工具管理系统有问题!!!");
throwables.printStackTrace();
return null;
}
}
//还数据库操作对象,如果后期有问题应该是在这里
public static void close(Connection connection, Statement statement) {
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
//通用的增删改
public static int update(String sql,Object...args){
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
// 获取链接
connection = dataSource.getConnection();
// 获取预编译对象
preparedStatement = connection.prepareStatement(sql);
// 通过预编译对象返回相应的SQL语句然后得到占位符————简单来说就是获取源数据,得到占位符
ParameterMetaData metaData = preparedStatement.getParameterMetaData();
// 得到占位符个数
int count = metaData.getParameterCount();
for(int i=1;i<=count;i++){
// 根据变量属性动态赋值,且SQL语句下标为1开始
preparedStatement.setObject(i,args[i-1]);
}
// 返回相对应的操作数据个数
return preparedStatement.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
return 0;
}finally {
//关闭资源还给数据库
close(connection,preparedStatement);
}
}
//通用查询方法
//第一个是用来声明类型参数的,后面的两个才是泛型的实现。
//
//也就是告诉大家 这是一种类型
public static List Equery(String sql,Class tClass,Object...args){
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
List list = new ArrayList<>();
try{
//获取链接
connection = dataSource.getConnection();
//获取数据库的预编译对象queryrunner
preparedStatement = connection.prepareStatement(sql);
//通过预编译对象获取源数据对于这个预编译对象的元数据
ParameterMetaData parameterMetaData = preparedStatement.getParameterMetaData();
//通过源数据获取占位符
int count = parameterMetaData.getParameterCount();
for(int i=0;i List StaQuery(Class c,String str1,String str2){
List list = new ArrayList<>();
Connection connection = null;
Statement Statement = null;
ResultSet resultSet = null;
String sql = "select * from student where";
try{
connection = dataSource.getConnection();
Statement = connection.createStatement();
sql = sql+" "+str1+"='"+str2+"'";
resultSet = Statement.executeQuery(sql);
while (resultSet.next()){
T t = c.newInstance();
Field[] fields = c.getDeclaredFields();
for(Field field:fields){
String temp = field.getName();
Object value = resultSet.getObject(temp);
field.setAccessible(true);
field.set(t,value);
}
list.add(t);
}
}catch (Exception e){
e.printStackTrace();
}finally {
close(connection,Statement);
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return list;
}
}
愿所有整装待发的开始,都能在匆匆岁月中为时不晚!!!
大伙加油叭,学习是一个漫长的过程!慢慢靠近,233333333333!



