Java核心技术-BaseDao

DAO层中需要编写CRUD代码,可分为两类,
其中增删改可归类为update,
查询可归类为query。
可以根据这两类来进一步优化们的代码,
抽象出来一个BaseDao类
让具体应用的Dao类来继承这个类。

package com.cht.dao;

import com.cht.utils.Conn;
import org.apache.commons.beanutils.BeanUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class BaseDao {
//准备工作
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;

    /*更新类,参数介绍:
    void:增删改通常不需要返回值。
    sql:具体进行操作的增删改的sql语句。
    Parameters:用来存放占位符。*/

    public void Update(String sql, Object[] Parameters) {
    // 获取数据库链接。
        conn = Conn.getConnection();
        try {
        //预编译传递过来的sql语句。pstmt防sql注入
            pstmt = conn.prepareStatement(sql);
        //计算pstmt中元数据的个数
            int count = pstmt.getParameterMetaData().getParameterCount();
        //把传递过来的占位符逐一赋值,setObject下标从1开始,数组下标从0开始,因此注意 i+1
            for (int i = 0 ; i < count ; i++) {
                pstmt.setObject(i+1,Parameters[i]);
            }
         //执行sql语句
            pstmt.executeUpdate();
        } catch (Exception e) {
            throw new RuntimeException();
        }finally {
        //关闭资源
            Conn.CloseAll(conn,pstmt);
        }
    }
/*
代表此方法持有一个类型T,表示此方法是泛型方法, 
T 代表此方法的返回值类型为类型T
Class代表类泛型T的具体类型
查询结果可能是一个或者多个因此用List作为返回值类型。
*/
    public  List Query(String sql, Object[] Parameters,Class clazz) {
        conn = Conn.getConnection();
        try{
            pstmt = conn.prepareStatement(sql);
            //判断占位符数组中是否有数据。
            if (Parameters != null && Parameters.length > 0 ) {
            //把传递过来的占位符逐一赋值.
                for (int i = 0 ; i < Parameters.length ; i++) {
                    pstmt.setObject(i+1,Parameters[i]);
                }
            }
            //将查询结果放入结果集
            rs = pstmt.executeQuery();
            //获取结果集中元数据的个数
            int count = rs.getMetaData().getColumnCount();
            //用于存放查询出来的结果,作为返回值。
            List list = new ArrayList <>();
            //把结果集中的数据赋给t,相当于User user
            T t = null;
            while (rs.next()) {
            //通过反射机制,利用传递过来的字节码对象,创建实例。
                t = clazz.newInstance();
                //对该实例属性进行逐一赋值,需要用到BeanUtils的jar文件
                for (int i = 0 ;i < count ; i++) {
                //获取元数据中第i个字段的名称,可以是Id,Username...
                    String name = rs.getMetaData().getColumnName(i);
                    //获取对应字段的值
                    Object value = rs.getObject(name);
                    //通过BeanUtils对t进行赋值。
                    //比如:User(t)的Id(name)为001(value)
                    BeanUtils.copyProperty(t,name,value);
                }
                //将t添加到list集合中
                list.add(t);
            }
            return list;

        }catch(Exception e){
            throw new RuntimeException();
        }finally {
        //关闭资源
            Conn.CloseAll(conn,pstmt,rs);
        }
    }
}

编写好BaseDao之后就可以进行具体应用了
加注释的地方是extends BaseDao之前的代码。
通过BaseDao可以提高代码复用率。
注意:在挑食过程中出现了
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
这个异常,再引入WEB-INF/lib/commons-logging-1.1.3.jar
之后就可以了。错误是找不到对应的类。

import com.cht.bean.User;
import com.cht.dao.BaseDao;
import com.cht.dao.USERDao;
import com.cht.utils.Conn;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;


public class USERDaoimpl  extends BaseDao implements USERDao{

    public List QueryAll() {
//        Connection conn = null;
//        PreparedStatement pstmt = null;
//        ResultSet rs = null;
//        List list = new ArrayList();
//        try {
//            conn = Conn.getConnection();
//            String sql = "select * from user";
//            pstmt = conn.prepareStatement(sql);
//            rs = pstmt.executeQuery();
//            while (rs.next()) {
//                User user = new User();
//                user.setId(rs.getInt(1));
//                user.setUsername(rs.getString(2));
//                user.setPassword(rs.getString(3));
//                list.add(user);
//
//            }
//            return list ;
//        } catch (Exception e) {
//            throw new RuntimeException();
//        }finally {
//            Conn.CloseAll(conn,pstmt,rs);
//        }
        String sql =  "select * from user";
       return  super.Query(sql,null , User.class);
    }

    public User QueryById(int id ) {
//        Connection conn = null;
//        PreparedStatement pstmt = null;
//        ResultSet rs = null;
//
//        try {
//            conn = Conn.getConnection();
//            String sql = "select * from user where id=?";
//            pstmt = conn.prepareStatement(sql);
//            pstmt.setInt(1,id);
//            rs = pstmt.executeQuery();
//            User user = null;
//            if (rs.next()) {
//                user = new User();
//                user.setId(rs.getInt(1));
//                user.setUsername(rs.getString(2));
//                user.setPassword(rs.getString(3));
//            }
//            return user ;
//        } catch (Exception e) {
//            throw new RuntimeException();
//        }finally {
//            Conn.CloseAll(conn,pstmt,rs);
//        }
        String sql =  "select * from user where id = ?";
        Object Parameters[] = {id};
        return super.Query(sql,Parameters , User.class).get(0);
    }

    public  void  insert(User user) {
//        Connection connection = null;
//        PreparedStatement pstmt = null;
//        try {
//            connection = Conn.getConnection();
//            String sql = "insert into  user(id,username,password) values (?,?,?)";
//            pstmt = connection.prepareStatement(sql);
//            pstmt.setInt(1,user.getId());
//            pstmt.setString(2,user.getUsername());
//            pstmt.setString(3,user.getPassword());
//            int count = pstmt.executeUpdate();
//            System.out.println("共有"+count+"条记录添加");
//        } catch (Exception e) {
//            throw new RuntimeException();
//        }finally {
//            Conn.CloseAll(connection,pstmt);
//        }
            Object [] Parameters = {user.getId(),user.getUsername(),user.getPassword()};
            String sql = "insert into  user(id,username,password) values (?,?,?)";
            super.Update(sql,Parameters);

    }

    public void update(int id,String username,String password) {
//        Connection connection = null;
//        PreparedStatement pstmt = null;
//        try {
//            connection = Conn.getConnection();
//            String sql = "UPDATE USER  SET  username = ?,password = ? WHERE id = ?";
//            pstmt = connection.prepareStatement(sql);
//            pstmt.setString(1,"chihaotian");
//            pstmt.setString(2,"CHT");
//            pstmt.setInt(3,id);
//            int count = pstmt.executeUpdate();
//            System.out.println("共有"+count+"条记录更新!");
//        } catch (Exception e) {
//            throw new RuntimeException();
//        }finally {
//            Conn.CloseAll(connection,pstmt);
//        }
        Object [] Parameters = {username,password,id};
        String sql = "UPDATE USER  SET  username = ?,password = ? WHERE id = ?";
        super.Update(sql,Parameters);
    }

    public void delete(int id) {
//        Connection connection = null;
//        PreparedStatement pstmt = null;
//        try {
//            connection = Conn.getConnection();
//            String sql = "DELETE from USER   WHERE id = ?";
//            pstmt = connection.prepareStatement(sql);
//            pstmt.setInt(1,id);
//            int count = pstmt.executeUpdate();
//            System.out.println("共有"+count+"条记录删除!");
//        } catch (Exception e) {
//            throw new RuntimeException();
//        }finally {
//            Conn.CloseAll(connection,pstmt);
//        }
        Object [] a = {id};
        String sql = "DELETE from USER   WHERE id = ?";
        super.Update(sql,a);
    }

    public boolean isUser(String username,String password) {
        boolean flag = false;
        Connection connection = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            String sql = "select * FROM user where username =? AND password = ?";
            connection = Conn.getConnection();
            pstmt = connection.prepareStatement(sql);
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                flag = true ;
            }else{
                flag = false;
            }
            return flag;
        } catch (Exception e) {
            throw new RuntimeException();
        }finally {
            Conn.CloseAll(connection,pstmt,rs);
        }

    }
}

你可能感兴趣的:(java核心技术,java,技术,优化)