利用反射封装数据查询操作

本人java小白,刚学完反射,写了用反射赖封装数据库基本操作,尤其是查询,通过使用泛型,集合,类,反射是查询操作更简单,方便,下面是具体的
封装代码;用DBtools类封装了连接和关闭方法,使用DBUtils方法封装了增删改(较为简单)和查询(单条查询、多行多列查询、查询记录数等特定查询)。
下面是具体实现代码:
首先是:DBtools类
public class JDBCTools {
public Connection getConnection() {
Connection conn = null;
InputStream is = this.getClass().getClassLoader().getResourceAsStream("database.properties");
Properties pro = new Properties();
try {
pro.load(is);
} catch (IOException e) {
e.printStackTrace();
}
String driver = pro.getProperty("driver");
try {
Class.forName(driver);
String url = pro.getProperty("url");
String user = pro.getProperty("user");
String password = pro.getProperty("password");
conn = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}

// 释放所有资源
public void close(Connection conn, PreparedStatement pstmt, ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}

} catch (SQLException e) {
e.printStackTrace();
}
}
}
public class DBUtils {
JDBCTools jdbc=new JDBCTools();
//获取连接
Connection conn=jdbc.getConnection();
PreparedStatement ps=null;
ResultSet rs=null;
}
/*
* 单条数据查询:用到泛型,集合,反射
*/
public <T> T getData(Class<T> clazz,String sql,Object...obj){
T entity=null;
//查询数据
try {
ps=conn.prepareStatement(sql);
for (int i = 0; i < obj.length; i++) {
ps.setObject(i+1,obj[i]);
}
rs=ps.executeQuery();
if(rs.next()){
//查询到一条语句
ResultSetMetaData rsda=rs.getMetaData();
Map<String, Object> map=new HashMap<>();
for (int i = 0; i < rsda.getColumnCount(); i++) {
//查询列名和列名所对应的值
String columnName=rsda.getColumnName(i+1);
Object columnValue=rs.getObject(i+1);
map.put(columnName, columnValue);
}
if(map.size()>0){
try {
// 导入commons-beanutils-1.8.0.jar包和commons-logging-1.1.1.jar,
这种利用反射比较标准,都在jar 包里面
entity=clazz.newInstance();
for (Entry<String, Object> object :map.entrySet()) {
BeanUtils.setProperty(entity, object.getKey(), object.getValue());
}
} catch (InstantiationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//这是自己根据所学反射,利用反射获取和改变类的属性
/*Field[] fields=clazz.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
//设置可见性
if(Modifier.toString(fields[i].getModifiers()).equals("private")){
fields[i].setAccessible(true);
}
Set set=map.entrySet();
Iterator it= set.iterator();
while(it.hasNext()){
Map.Entry<String,Object> oj=(Map.Entry<String,Object>)it.next();
if(oj.getKey().equals(fields[i].getName())){
try {
fields[i].set(entity,oj.getValue());
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}*/
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
jdbc.closeAll(rs, ps, conn);
}
return entity;
}
/*
* 多行多列查询
*/
public <T> List<T> selectForObject(Class<T> clazz,String sql){
List<T> list=new ArrayList<>();
//执行查询
try {
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
//存放map的list集合
Map<String, Object> map=new HashMap<>();
while(rs.next()){
ResultSetMetaData rsda=rs.getMetaData();
//输出查询的列数
//System.out.println(rsda.getColumnCount());
for (int i = 0; i < rsda.getColumnCount(); i++) {
//查询列名和列名所对应的值
String columnName=rsda.getColumnName(i+1);
Object columnValue=rs.getObject(i+1);
//System.out.println(columnName+":"+columnValue);
map.put(columnName, columnValue);
}
if(map.size()>0){
T entity=clazz.newInstance();
//输出不了具体的列,因为setProperty没有equalIgnorecase而是用equals方法,
//所以sql语句中的字段名需和数据库中的字段名完全一样
for (Entry<String, Object> object :map.entrySet()) {
BeanUtils.setProperty(entity, object.getKey(), object.getValue());
}
//System.out.println(entity.toString());
list.add(entity);
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
jdbc.closeAll(rs, ps, conn);
}
return list;
}
/**
* 返回要查询的行数,和某一字段值出现的次数
*/
public Object selectCount(String sql,Object...object){
Object obj=null;
try {
ps=conn.prepareStatement(sql);
for (int i = 0; i < object.length; i++) {
ps.setObject(i+1, object[i]);
}
rs=ps.executeQuery();
//判断是否有数据
if(rs.next()){
//查询总行数
obj=rs.getObject(1);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;
}
/**
* 增删改操作 较为容易
*/
public int excuteUpdate(String sql,Object...object){
int num=0;
try {
ps=conn.prepareStatement(sql);
for (int i = 0; i < object.length; i++) {
ps.setObject(i+1, object[i]);
}
num=ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
jdbc.closeAll(rs, ps, conn);
}
return num;
}
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值