全能的SQLTool类,抛弃繁杂的DAO和映射文件

        以往在作项目开发的时候,总是需要写N多的DAO,每个DAO中还有N多的查询方法,最近自己写了个工具类来简化这些工作,具体代码如下:

 

package  com.hing.tools;

import  java.lang.reflect.Field;
import  java.lang.reflect.Method;
import  java.sql.Connection;
import  java.sql.PreparedStatement;
import  java.sql.ResultSet;
import  java.sql.ResultSetMetaData;
import  java.sql.Timestamp;
import  java.text.SimpleDateFormat;
import  java.util.ArrayList;
import  java.util.Date;
import  java.util.HashMap;
import  java.util.Iterator;
import  java.util.List;
import  java.util.Set;

public   class  SQLTool  {
    
// 用于无参数的统计查询
    public static Integer getCount(String sql) {
        Connection conn 
= null;
        PreparedStatement pstm 
= null;
        ResultSet rs 
= null;
        
try {
            conn 
= DBTool.getConnection();
            pstm 
= conn.prepareStatement(sql);
            rs 
= pstm.executeQuery();
            
if (rs.next()) {
                
return rs.getInt(1);
            }
 else
                
return 0;
        }
 catch (Exception e) {
            LogTool.error(SQLTool.
class, e);
            
return 0;
        }
 finally {
            DBTool.close(conn, pstm, rs);
        }

    }


    
// 用于有多个参数的统计查询
    public static Integer getCount(String sql, String[] args) {
        Connection conn 
= null;
        PreparedStatement pstm 
= null;
        ResultSet rs 
= null;
        
try {
            conn 
= DBTool.getConnection();
            pstm 
= conn.prepareStatement(sql);
            
for (int i = 1; i < args.length + 1; i++{
                pstm.setString(i, args[i 
- 1]);
            }

            rs 
= pstm.executeQuery();
            
if (rs.next()) {
                
return rs.getInt(1);
            }
 else
                
return 0;
        }
 catch (Exception e) {
            LogTool.error(SQLTool.
class, e);
            
return 0;
        }
 finally {
            DBTool.close(conn, pstm, rs);
        }

    }


    
// 用于无参数的查询,将每一行记录封装到一个HashMap,主键为列名的小写,然后放到List中
    public static List getList(String sql, String className) {
        Connection conn 
= null;
        PreparedStatement pstm 
= null;
        ResultSet rs 
= null;
        
try {
            List list 
= new ArrayList();
            conn 
= DBTool.getConnection();
            pstm 
= conn.prepareStatement(sql);
            rs 
= pstm.executeQuery();
            ResultSetMetaData rsmd 
= rs.getMetaData();
            Integer columns 
= rsmd.getColumnCount();
            
while (rs.next()) {
                HashMap hm 
= new HashMap();
                
for (int i = 1; i < columns + 1; i++{
                    String columnName 
= rsmd
                            .getColumnName(i);
                    String columnValue 
= rs
                            .getString(columnName);
                    hm.put(columnName.toLowerCase(),
                            columnValue);
                }

                list.add(hm);
            }

            System.out.println(
"get "+list.size()+" records.");
            
if(className!=null){
                
return SQLTool.getObjectList(list, className);
            }

            
else return list;
        }
 catch (Exception e) {
            LogTool.error(SQLTool.
class, e);
            
return null;
        }
 finally {
            DBTool.close(conn, pstm, rs);
        }

    }


    
// 用于有参数的查询
    public static List getList(String sql, String[] args,
            String className) 
{
        Long l
=(new Date()).getTime();
        Connection conn 
= null;
        PreparedStatement pstm 
= null;
        ResultSet rs 
= null;
        
try {
            List list 
= new ArrayList();
            conn 
= DBTool.getConnection();
            pstm 
= conn.prepareStatement(sql);
            
for (int i = 1; i < args.length + 1; i++{
                pstm.setString(i, args[i 
- 1]);
            }

            rs 
= pstm.executeQuery();
            ResultSetMetaData rsmd 
= rs.getMetaData();
            Integer columns 
= rsmd.getColumnCount();
            
while (rs.next()) {
                HashMap hm 
= new HashMap();
                
for (int i = 1; i < columns + 1; i++{
                    String columnName 
= rsmd
                            .getColumnName(i);
                    String columnValue 
= rs
                            .getString(columnName);
                    
// LogTool.info(SQLTool.class, "get
                    
// column:"+columnName+" "+columnValue);
                    hm.put(columnName.toLowerCase(),
                            columnValue);
                }

                list.add(hm);
            }

            
// System.out.println("get list:"+list.size());
            System.out.println("get "+list.size()+" records.");
            
if(className!=null){
                
return SQLTool.getObjectList(list, className);
            }

            
else return list;
        }
 catch (Exception e) {
            LogTool.error(SQLTool.
class, e);
            
return null;
        }
 finally {
            DBTool.close(conn, pstm, rs);
        }

    }


    
public static List getObjectList(List list,
            String className) 
{
        
try {
            Class cls 
= Class.forName(className);
            Field[] fields 
= cls.getDeclaredFields();
            String[] fieldName 
= new String[fields.length];
            Class[] fieldClass 
= new Class[fields.length];
            
for (int i = 0; i < fields.length; i++{
                fieldName[i] 
= fields[i].getName();
                fieldClass[i] 
= fields[i].getType();
            }

            Iterator it 
= list.iterator();
            List objects 
= new ArrayList();
            
while (it.hasNext()) {
                HashMap hm 
= (HashMap) it.next();
                Object obj 
= cls.newInstance();
                Set keys 
= hm.keySet();
                Iterator iter 
= keys.iterator();
                
while (iter.hasNext()) {
                    String key 
= (String) iter.next();
                    String value 
= (String) hm.get(key);
                    
if (value != null{
                        String realFieldName 
= null;
                        Class realFieldClass 
= null;
                        
for (int j = 0; j < fieldName.length; j++{
                            
if (key.equals(fieldName[j]
                                    .toLowerCase())) 
{
                                realFieldName 
= fieldName[j];
                                realFieldClass 
= fieldClass[j];
                                j 
= fieldName.length + 10;
                            }

                        }

                        Object realObj 
= SQLTool
                                .typeConvert(
                                        realFieldClass,
                                        value);
                        
if (realFieldName != null{
                            String methodName 
= "set"
                                    
+ realFieldName
                                            .substring(
01)
                                            .toUpperCase()
                                    
+ realFieldName
                                            .substring(
1);
                            Method method 
= cls
                                    .getDeclaredMethod(
                                            methodName,
                                            realFieldClass);
                            
if (method != null&&realObj!=null{
                                method.invoke(obj, realObj);
                            }

                        }


                    }

                }

                objects.add(obj);
            }

            
return objects;
        }
 catch (Exception e) {
            LogTool.error(SQLTool.
class, e);
            
return null;
        }

    }


    
public static Object typeConvert(Class cls, String value) {
        
try {

            
if (cls.getName().equals("java.lang.String")) {
                
return value;
            }
 else if (cls.getName().equals(
                    
"java.lang.Integer")) {
                
return Integer.valueOf(value);
            }
 else if (cls.getName().equals(
                    
"java.lang.Long")) {
                
return Long.valueOf(value);
            }
 else if (cls.getName().equals(
                    
"java.lang.Boolean")) {
                
return Boolean.valueOf(value);
            }
 else if (cls.getName().equals(
                    
"java.util.Date")) {
                
if(value.length()==10){
                    
return (new SimpleDateFormat("yyyy-MM-dd")).parse(value);
                }
else if(value.length()==19){
                    
return (new SimpleDateFormat("yyyy-MM-dd kk:mm:ss")).parse(value);
                }
else{
                    
return new Date(value);
                }

                
            }
 else if (cls.getName().equals(
                    
"java.lang.Float")) {
                
return Float.valueOf(value);
            }
 else if (cls.getName().equals(
                    
"java.sql.Timestamp")) {
                
return Timestamp.valueOf(value);
            }
 else if (cls.getName().equals(
                    
"java.lang.Double")) {
                
return Double.valueOf(value);
            }
 else
                
return null;

        }
 catch (Exception e) {
            LogTool.error(SQLTool.
class,
                    
"Type convert failed! "+cls.getName()+" "+value);
            LogTool.error(SQLTool.
class, e);
            
return null;
        }


    }

}

 

这个工具使用起来非常方便,如

List list=SQLTool.getList("select * from User limit ?",new String[]{"70"},"com.sms.pojo.User");

这么简单的一句代码就能实现相应的SQL查询,并将结果自动映射到User这个POJO中去,完全不需要写N多的DAO方法,更不需要去维护映射文件,数据库各列的数据类型和POJO中各属性的数据类型不需要一一对应,一句话,方便实用!由于时间比较仓促,估计当中还有不少问题,但我在Sqlserver2000及Mysql下都做了测试,基本上没什么问题,等过完春节再来慢慢完善,再增加增加记录、修改记录及删除记录的操作基本就OK了。对这个工具有兴趣或有更好想法的人可以找我进一步沟通,大家共同提升,共同进步!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值