package PetShop.util;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
public abstract class DBUtil<T>{
private Connection conn=null;
private PreparedStatement pst=null;
private ResultSet rs=null;
private Properties pro=new Properties();
//1.统一连接方法 需要上面那一串
public Connection getConn(){
try {
pro.load(this.getClass().getClassLoader().getResourceAsStream("db.properties"));
Class.forName(pro.getProperty("driver"));
conn= DriverManager.getConnection(pro.getProperty("url"),pro.getProperty("uname"),pro.getProperty("password"));
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//2.统一关闭方法
public void getClose(ResultSet rs,PreparedStatement pst,Connection conn){
try {
if (rs!=null){
rs.close();
}if (pst!=null){
pst.close();
}if(conn!=null){
conn.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
//3.统一更新方法 增删改返回的都是受影响行数
public boolean update(String sql,Object...obj){
try {
pst=getConn().prepareStatement(sql);
//为占位符赋值
for (int i = 0; i < obj.length; i++) {
pst.setObject(i+1,obj[i]);
}
//执行sql
int row=pst.executeUpdate();
if (row>0){
return true;
}
}catch (Exception e){
e.printStackTrace();
}
return false;
}
//4.统一查询方法
public List<T> query(String sql,Object...obj){
List<T>list=new ArrayList<>();
try {
pst=getConn().prepareStatement(sql);
//为占位符赋值
for (int i = 0; i < obj.length; i++) {
pst.setObject(i+1,obj[i]);
}
//执行sql
rs=pst.executeQuery();
//获取结果集的数据源结构
ResultSetMetaData rsmd=rs.getMetaData();
//获取到表名,得到类
String tableName=rsmd.getTableName(1);
Class Clazz=Class.forName("PetShop/bean."+tableName.substring(0,1).toUpperCase()+tableName.substring(1));
//获取到字段的个数
int cnum=rsmd.getColumnCount();
while (rs.next()){
//创建对象 不要去检查的警告,解决警告
@SuppressWarnings("unchecked")
T t= (T) Clazz.newInstance();
//循环字段
for (int i = 0; i < cnum; i++) {
//循环字段并获取到字段名称
String cname=rsmd.getColumnName(i+1);
//通过字段名获取到属性
Field f= Clazz.getDeclaredField(cname);
//打开权限
f.setAccessible(true);
//为每个属性赋值
f.set(t,rs.getObject(i+1));
}
//再将对象放入集合
list.add(t);
}
}catch (Exception e){
e.printStackTrace();
}
return list;
}
}
#??
driver=com.mysql.jdbc.Driver
#???????
#url=jdbc:mysql://localhost:3306/myshop1?characterEncoding=utf-8&useSSL=true
url=jdbc:mysql://localhost:3306/petshop?characterEncoding=utf-8&useSSL=true
#???
uname=root
#??
password=111111
#???????
#url=jdbc:mysql://localhost:3306/myshop?characterEncoding=utf-8
显示下行号,test a main.java 中12行
DBUtil.getconn,应该是数据库没有链接成功
读取db.properties文件出错了,你文件里的中文怎么都乱码了,把空行和注释删一删试试
首先在DBUtil第19行打上断点,然后按f6进入,看看是否报空指针异常,如果是,说明没有读取到db.properties文件内容,没有成功创建数据库连接对象,然后再main方法第12行System.out.printIn(aa)之前添加一句代码System.out.printIn("进入输出方法");,如果该代码成功输出说明你查询出的list为null,然后否换时加上非空判断
这玩意儿null了,一般来说的文件没读到,用 getResourceAsStream方法很容易出现这种问题
没获取到连接,getConn返回是空
应该是你配置的db.properties没有读取到.看一下这个配置文件路径是否正确
可以远程点你电脑进行断点调试吗?2个问题一起帮你定位解决。
把当前系统变量打印出来
获取文件流 this.getClass().getClassLoader().getResourceAsStream(""); 这块是个null,所以报的空指针。