package cn.lovepi.util;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
/**
* Created by icarus on 2016/5/31.
* 升级版万能数据库查询DAO类
*/
public class SuperDAOPro {
/**
* 使用ResultSetMetaData来获取数据库中查询到的表的所有列名
* 可以查询到查到返回数据的所有列名,即可以查询到多表返回的列名
* @param tableName 查询表名
* @return 表中列名的集合
*/
public static ArrayList<String> getColumnsByRSMD(String tableName){
ArrayList<String> al=new ArrayList<String>();
Connection conn=DBConnectionFactory.getInstance().getConn();
PreparedStatement ps=null;
ResultSet rs=null;
//sql语句,不会查询到任何数据,只会返回查询到的列信息
String sql="select * from "+tableName+" where 1=2";
try{
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
//获取ResultSetMetaData对象
ResultSetMetaData msd=rs.getMetaData();
//获取查询到的列的总数
int n=msd.getColumnCount();
//获取所有类名并加入到集合当中去,列号从1开始
for (int i=1;i<=n;i++){
al.add(msd.getColumnName(i));
}
}catch (Exception e){
e.printStackTrace();
}finally {
DBConnectionFactory.getInstance().closeConn(conn,ps,rs);
}
return al;
}
/**
* 使用DataBaseMetaData来获取数据库中查询到的表的所有列名
* DataBaseMetaData数据库元数据对象,也可理解为数据库数据对象
* DataBaseMetaData值可以获取到当前查询表的相关数据
* 即单表属性获取
* @param tableName
* @return
*/
public static ArrayList<String> getColumnsByDBMD(String tableName){
ArrayList<String> al=new ArrayList<String>();
Connection conn=DBConnectionFactory.getInstance().getConn();
try{
DatabaseMetaData dmd=conn.getMetaData();
//获取表中所有类的属性信息集合
ResultSet rs=dmd.getColumns(null,"%",tableName,"%");
//遍历集合,获取数据
while (rs.next()){
al.add(rs.getString("COLUMN_NAME"));
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return al;
}
/**
* 查询表中所有数据
* select * 效率太低,改为select具体列名
* @param cl 表对象实体类Class对象
* @return 查询到的表中数据集合
*/
public static ArrayList getList(Class cl){
ArrayList al=new ArrayList();
Connection conn=DBConnectionFactory.getInstance().getConn();
PreparedStatement ps=null;
ResultSet rs=null;
//获取表中的列名集合
ArrayList<String> cols=getColumnsByRSMD(cl.getSimpleName());
//获取属性集合
Field[] fields=cl.getDeclaredFields();
//拼接sql字符串
StringBuilder sb=new StringBuilder();
sb.append("select ");
for (int i=0;i<cols.size();i++){
sb.append(cols.get(i));
if (i!=cols.size()-1){
sb.append(",");
}
}
sb.append(" from "+cl.getSimpleName());
try{
ps=conn.prepareStatement(sb.toString());
rs=ps.executeQuery();
while (rs.next()){
Object ob=cl.newInstance();
for (String str:cols) {
for (Field f:fields){
if (f.getName().equals(str)){
f.setAccessible(true);
f.set(ob,rs.getObject(str));
break;
}
}
}
al.add(ob);
}
}catch (Exception e){
e.printStackTrace();
}finally {
DBConnectionFactory.getInstance().closeConn(conn,ps,rs);
}
return al;
}
/**
* 根据id来查询对应的数据
* @param cl 查询的表的POJO类对象
* @param id 查询对象的id
* @return 查询到的id
*/
public static Object getlistById(Class cl,int id){
//获取数据库连接
Connection conn=DBConnectionFactory.getInstance().getConn();
//查询到的对象是Object类型的
Object ob=null;
PreparedStatement ps=null;
ResultSet rs=null;
ArrayList<String> cols=getColumnsByRSMD(cl.getSimpleName());
//获取属性列表
Field[] fields=cl.getDeclaredFields();
//获取id的列名,id设置一般都是属性的第一位
Field idName=fields[0];
StringBuilder sb=new StringBuilder();
//数据库查询语句
sb.append("select ");
for (int i=0;i<cols.size();i++){
sb.append(cols.get(i));
if (i!=cols.size()-1){
sb.append(",");
}
}
sb.append(" from "+cl.getSimpleName()+" where "+idName.getName()+" = "+id);
try{
ps=conn.prepareStatement(sb.toString());
rs=ps.executeQuery();
//查询到数据
if (rs.next()){
ob=cl.newInstance();
for (String str:cols){
for (Field f:fields){
if (f.getName().equals(str)){
f.setAccessible(true);
f.set(ob,rs.getObject(str));
break;
}
}
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
DBConnectionFactory.getInstance().closeConn(conn,ps,rs);
}
return ob;
}
/**
* 根据某些特定值来查询符号要求的对象集合
* @param cl 查询的对象的Class类型
* @param str 所要查询的列名
* @param object 列名所对应的值
* @return 查询到符合要求的对象集合
*/
public static ArrayList getListBySome(Class cl,String str,Object object){
//对象集合
ArrayList al=new ArrayList();
//获取连接
Connection conn=DBConnectionFactory.getInstance().getConn();
PreparedStatement ps=null;
ResultSet rs=null;
//查询到的数据是Object类型的
Object ob=null;
Field[] fields=cl.getDeclaredFields();
ArrayList<String> cols=getColumnsByRSMD(cl.getSimpleName());
StringBuilder sb=new StringBuilder();
//数据库查询sql语句
sb.append("select ");
for (int i=0;i<cols.size();i++){
sb.append(cols.get(i));
if (i!=cols.size()-1){
sb.append(",");
}
}
sb.append(" from "+cl.getSimpleName()+" where "+str+" = '"+ob+"'");
try{
//查询数据库
ps=conn.prepareStatement(sb.toString());
rs=ps.executeQuery();
//查询到数据
while(rs.next()){
ob=cl.newInstance();
for (String s:cols){
for (Field f:fields) {
if (f.getName().equals(s)){
f.setAccessible(true);
f.set(ob,rs.getObject(s));
break;
}
}
}
al.add(ob);
利用Java反射实现万能DAO
5星 · 超过95%的资源 需积分: 48 27 浏览量
2016-06-23
23:15:22
上传
评论 2
收藏 41KB RAR 举报
wangxin1248
- 粉丝: 304
- 资源: 1
最新资源
- 基于Python实现的自动化办公项目.zip
- 基于python实现的基于PyQt5和爬虫的小说阅读系统.zip
- 机械设计整经机上纱自动化sw20非常好的设计图纸100%好用.zip
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈