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);

wangxin1248
- 粉丝: 306
最新资源
- Java 计算文件 MD5 值(支持大文件)
- 永磁同步电机SVPWM算法控制仿真及Simulink建模详解
- FactoryIO液位PID仿真程序:基于TIA Portal V15与FactoryIO 2.4.0的入门指南 深度版
- COMSOL两相流模型的PDE建模技术及应用详解
- 基于OpenFOAM-PFC多孔介质流动仿真模拟:随时间变化的入口速度与多孔湍流分析
- Java语言new Date()得到的时间和系统时间不一样
- Comsol变压器热流耦合仿真模型
- DQN路径规划算法:深度强化学习在栅格环境走迷宫的Matlab代码实现及交互观察教程
- PFC3D环境中Clump配位数计算及其在岩石力学和土力学中的应用
- 永磁同步电机SVPWM自适应无位置算法控制仿真Simulink模型研究
- 基于遗传算法的永磁同步电机SVPWM控制仿真Simulink模型与脚本自动迭代优化研究
- Java中InputStream重复使用的问题解决方案
- 基于Simulink的永磁同步电机SVPWM无位置控制与滑膜锁相环优化仿真 - PMSM
- 永磁同步电机DPWM算法控制仿真Simulink模型的应用与研究 · DPWM算法 完整版
- Java中Byte数组与InputStream相互转换
- 永磁同步电机SVPWM与载波扩频调制技术优化及其高频振动噪声解决方案
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


