java DAO示例

TZQ_DO_Dreamer發表於2014-09-07
一、底層DAO實現 

DAO.java
package com. atguigu.java2;
import java. lang.reflect.*;
import java. sql.*;
import java. util.*;
import org. apache.commons.dbutils.*;
import org. apache.commons.dbutils.handlers.*;

class ReflectionUtils {
    //如何獲取形參 clazz的父類的泛型
    public static Class getSuperClassGeneric (Class clazz ) {
        Type t = clazz .getGenericSuperclass ();
        ParameterizedType type = (ParameterizedType ) t ;
        Type [] types = type .getActualTypeArguments ();
         return (Class ) types [0];
    }
}
public class DAO<T> {
    Class<T> clazz = null;

    public DAO() {
         // 此處的this 相當於正在建立的 customerDAO物件
        clazz = ReflectionUtils.getSuperClassGeneric(this.getClass());
    }
    
    //查詢某些特殊數值的資料
    public <E> E getValue (Connection conn ,String sql,Object ... args){

         try {
            ResultSetHandler <Object >handler =new ScalarHandler();
            QueryRunner runner =new QueryRunner ();
            Object obj =runner .query (conn , sql , handler , args);
            
             return (E ) obj ;
         } catch (Exception e ) {
    
            e .printStackTrace ();
         }
        
         return null;
    }
    
    //通用的查詢方法,返回多個物件的集合
     public List <T > getForList (Connection conn , String sql, Object... args ) {
         QueryRunner runner = new QueryRunner ();
         try {     
            ResultSetHandler <List <T >> handler = new BeanListHandler< T>( clazz );
            List <T >list =runner .query (conn , sql , handler );
             return list ;
         } catch (Exception e ) {
            e .printStackTrace ();
         }
         return null;
   
     }
    
    // 通用的查詢方法,返回一個物件
    public T getInstance (Connection conn , String sql , Object... args) {
         try {

            QueryRunner runner = new QueryRunner ();
            ResultSetHandler <T > handler = new BeanHandler<T>( clazz);
             return runner .query (conn , sql , handler , args);
         } catch (Exception e ) {
            e .printStackTrace ();
         }


         return null;
    }

    // 通用的增、刪、改的方法( version 3.0
    public void update(Connection conn , String sql , Object... args) {

         try {
            QueryRunner runner = new QueryRunner ();
            runner .update (conn , sql , args );
         } catch (SQLException e ) {
            e .printStackTrace ();
         }
    }
}

二、繼承DAO,事務處理

CustomerDAO .java

package com. atguigu.java2;

import java. sql.Connection;
import java. sql.Date;
import java. util.List;

public class CustomerDAO extends DAO<Customer > {
    /**
     *
     * 獲取customers 表中的最大的日期
     * @param conn
     * @return
     */
    public Date getMaxBirth (Connection conn ){
        String sql = "select max(birth) from customers";
         return (Date )getValue (conn ,sql );
    }
    
    /**
     * 獲取customers 表中的資料的條目數
     * @param conn
     * @return
     */
    public long getCount(Connection conn ){
        String sql = "select count(*) from customers";
         return (long) getValue(conn, sql);
    }
    
    /**
     * 獲取customers 表中的所有資料
     * @param conn
     * @return
     */
    public List<Customer > getAll (Connection conn ){
        String sql = "select id,name,email,birth from customers";
         return getForList (conn , sql );
        
    }
    
    /**
     *按照指定的id 查詢表中的一條資料,以物件的形式返回
     * @param conn
     * @param custId
     * @return
     */
    public Customer query (Connection conn ,int custId){
        String sql = "select id,name,email,birth from customers where id = ?";
         return getInstance (conn ,sql ,custId );
    }
    
    /**
     * 刪除customers 表中指定id的資料
     * @param conn
     * @param custId :要刪除的指定的資料的 id
     */
    public void delete(Connection conn ,int custId){
        String sql = "delete from customers where id = ?";
        update (conn ,sql ,custId );
    }
    
    /**
     * 修改customers 表中的一條資料
     * @param conn
     * @param cust :將表中與cust id相同的資料改為cust的資訊
     */
    public void update(Connection conn , Customer cust ) {
        String sql = "update customers set name = ?,email = ?,birth = ? where id = ?";
        update (conn ,sql ,cust .getName (), cust .getEmail (), cust.getBirth(),
                cust .getId ());
    }

    /**
     * customers 表中插入一條資料
     * @param conn :資料庫的連線
     * @param cust :將此物件新增到 customers表中
     */
    public void insert(Connection conn , Customer cust ) {
        String sql = "insert into customers(name,email,birth) values(?,?,?)";
        update (conn , sql , cust .getName (), cust.getEmail(), cust.getBirth());
    }

}

三、測試類
package com. atguigu.java2;
import java. sql.Connection;
import java. sql.Date;
import java. util.List;
import org. junit.Test;
import com. atguigu.java.JDBCUtils;

public class TestCustomerDAO {
    CustomerDAO custDao = new CustomerDAO ();
    //查詢年齡最小的日期
    @Test
    public void testGetMaxBirth (){
        Connection conn = null;
         try {
            conn = JDBCUtils .getConnection ();
            Date birth = custDao .getMaxBirth (conn );
            System .out .println (birth );
         } catch (Exception e ) {
            e .printStackTrace ();
         }finally{
            
            JDBCUtils .close (null, null, conn);
         }
    }
    //查詢 customers表中的人數
    @Test
    public void testGetCount(){
        Connection conn = null;
         try {
            conn = JDBCUtils .getConnection ();
             long count = custDao .getCount (conn );
            System .out .println (count );
         } catch (Exception e ) {
            e .printStackTrace ();
         }finally{
            
            JDBCUtils .close (null, null, conn);
         }
    }
    
    //查詢 customers表中所有資料
    @Test
    public void testQuery1(){
        Connection conn = null;
         try {
            conn = JDBCUtils .getConnection ();
            List <Customer > list = custDao .getAll (conn );
             for(Customer c : list ){
                System .out .println (c );
             }
         } catch (Exception e ) {
            e .printStackTrace ();
         }finally{
            JDBCUtils .close (null, null, conn);
            
         }
        
    }
    //查詢 id=20 一條資料
    @Test
    public void testQuery(){
        Connection conn = null;
         try {
            conn = JDBCUtils .getConnection ();
            Customer cust = custDao .query (conn ,20);
            System .out .println (cust );
            
         } catch (Exception e ) {
            e .printStackTrace ();
         }finally{
            JDBCUtils .close (null, null, conn);
            
         }
    }
    //刪除資料
    @Test
    public void testDelete(){
        Connection conn = null;
         try {
            conn = JDBCUtils .getConnection ();
            
            custDao .delete (conn , 18);
         } catch (Exception e ) {
            e .printStackTrace ();
         }finally{
            JDBCUtils .close (null, null, conn);
            
         }
    }
    //更新資料
    @Test
    public void testUpdate() {
        Connection conn = null;
         try {
            conn = JDBCUtils .getConnection ();
            
            Customer cust = new Customer (21, " 張藝謀", "zhangym@126.com", new Date(
                     new java .util .Date ().getTime ()));
            
            custDao .update (conn , cust );
         } catch (Exception e ) {
            e .printStackTrace ();
         }finally{
            JDBCUtils .close (null, null, conn);
            
         }
    }
    //插入資料
    @Test
    public void testInsert() {
        Connection conn = null;
         try {
            conn = JDBCUtils .getConnection ();
            
            Customer cust = new Customer (21, " 張藝謀", "zhangym@126.com", new Date(
                     new java .util .Date ().getTime ()));
            
            custDao .insert (conn , cust );
         } catch (Exception e ) {
            e .printStackTrace ();
         }finally{
            JDBCUtils .close (null, null, conn);
            
         }
    }
}


相關文章