JDBC操作DAO的通用类

来源:互联网 发布:ubuntu安装中文界面 编辑:程序博客网 时间:2024/06/05 09:37
package com.servlet.dao;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.servlet.entity.Student;
import com.servlet.util.JdbcUtil;


/*
 * JDBC操作DAO通用类
 */
public class StudentDao {
    
    // 通用单个对象查询方法
    public static Object search(String sql,Object[] params,Class<?> clz){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = JdbcUtil.getConnection();
            ps = conn.prepareStatement(sql);
            if(params != null && params.length > 0){
                for(int i=0;i<params.length;i++){
                    ps.setObject(i+1, params[i]);
                }
            }
            rs = ps.executeQuery();
            if(!rs.next()){
                return null;
            }
            return doResultSet(rs, clz);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtil.release(rs, ps, conn);
        }
        return null;
    }
    // 集合查询
    public static List<?> searchList(String sql,Object[] params,Class<?> clz){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        
        try {
            conn = JdbcUtil.getConnection();
            ps = conn.prepareStatement(sql);
            if(params != null && params.length > 0){
                for(int i=0;i<params.length;i++){
                    ps.setObject(i+1, params[i]);
                }
            }
            rs = ps.executeQuery();
            return doResultSetList(rs, clz);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally{
            JdbcUtil.release(rs,ps,conn);
        }
        return null;
    }
    // 利用反射机制处理结果集与实体对象进行对应
    private static Object doResultSet(ResultSet rs,Class<?> clz){
        try {
            ResultSetMetaData metaData = rs.getMetaData();  //元数据
            int colCount = metaData.getColumnCount();  //获得列总数
            //等价于Student stu = new Student();
            Object bean = clz.newInstance(); //实例化对象
            for(int i=0;i<colCount;i++){
                Object colValue = rs.getObject(i+1);  //获取当前列记录
                String colName = metaData.getColumnName(i+1); //获取列名
                Field f = clz.getDeclaredField(colName);
                f.setAccessible(true);
                f.set(bean, colValue);
            }
            return bean;
            
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }
        return null;
    }
    // 利用反射机制处理结果集与实体对象进行对应(多记录查询)
    private static List<Object> doResultSetList(ResultSet rs,Class<?> clz){
        List<Object> list = new ArrayList<Object>();
        try {
            while(rs.next()){
                ResultSetMetaData metaData = rs.getMetaData();  //元数据
                int colCount = metaData.getColumnCount();  //获得列总数
                //等价于Student stu = new Student();
                Object bean = clz.newInstance(); //实例化对象
                for(int i=0;i<colCount;i++){
                    Object colValue = rs.getObject(i+1);  //获取当前列记录
                    String colName = metaData.getColumnName(i+1); //获取列名
                    Field f = clz.getDeclaredField(colName);
                    f.setAccessible(true);
                    f.set(bean, colValue);
                }
                list.add(bean);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }
        return list;
    }
    // 通用增、改、删方法
    public static int update(String sql,Object[] params){ //CUD
        Connection conn = null;
        PreparedStatement ps = null;
        int result = 0;
        try {
            conn = JdbcUtil.getConnection();
            ps = conn.prepareStatement(sql);
            if(params != null && params.length > 0){
                for(int i=0;i<params.length;i++){
                    ps.setObject(i+1, params[i]);
                }
            }
            result = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally{
            JdbcUtil.release(null, ps, conn);
        }
        return result;
    }
    // 分页
    public static List pageStu(int pageIndex,int pageSize){
        String sql = "select * from student limit ?,?";
        int lim = (pageIndex-1)*pageSize;
        Object[] params = {lim,pageSize};
        List<Student> list = (List<Student>)StudentDao.searchList(sql, params, Student.class);
//        System.out.println(list);
        return list;
    }
    // 总记录书
    public static long totalstu(){
        String sql = "select ? from student";
        Object[] params = {"StudentNo"};
        List<Student> list = (List<Student>)StudentDao.searchList(sql, params, Student.class);
//        System.out.println(list.size());
        long totalnum = list.size();
        return totalnum;

        
    }
    
    // test
    public static void main(String[] args) {
        // 单条查询
//        String sql = "select * from student where StudentName=?";
//        Object[] params = {"袁华"};
//        Student stu = (Student)StudentDao.search(sql, params, Student.class);
//        System.out.println(stu);
        // 多条查询
//        String sql = "select * from student where GradeId>? and Sex=?";
//        Object[] params = {2,1};
//        List<Student> list = (List<Student>)StudentDao.searchList(sql, params, Student.class);
//        System.out.println(list);
        // 增加
//        String sql = "insert into student(StudentNo,StudentName) values(?,?)";
//        Object[] params = {1030,"毛泽东"};
//        int result = StudentDao.update(sql, params);
//        if(result>0){
//            System.out.println("插入成功");
//        }else {
//            System.out.println("插入失败");
//        }
        // 更改
//        String sql = "update student set Phone=? where StudentName=?";
//        Object[] params = {"13037230989","袁华"};
//        int result = StudentDao.update(sql, params);
//        if(result>0){
//            System.out.println("更新成功");
//        }else {
//            System.out.println("更新失败");
//        }
        // 删除
//        String sql = "delete from student where StudentNo>=?";
//        Object[] params = {1028};
//        int result = StudentDao.update(sql, params);
//        if(result>0){
//            System.out.println("删除成功");
//        }else {
//            System.out.println("删除失败");
//        }
        // 分页
//        StudentDao.pageStu(2, 5);
//        StudentDao.totalstu();
        
    }
    
}

0 0