这是个采用DAO来与数据库沟通的例子(来源于 夏昕:深入浅出Hibernate):----------------------------
首先是测试类:CustomerDAOTest.java
----------------------------
/**
 * 
 */
package com.rizon.persistence.dao.busi;import java.math.BigDecimal;import com.rizon.persistence.dao.DAOException;
import com.rizon.persistence.dao.DAOFactory;
import com.rizon.persistence.domain.Customer;
import com.rizon.persistence.domain.Promotion;/**
 * @author sujl
 *
 */
public class CustomerDAOTest { public BigDecimal calcAmount(String customerID, BigDecimal amount) throws DAOException{

//根据客户ID获得客户记录
CustomerDAO customerDAO = 
(CustomerDAO)DAOFactory.getDAO(CustomerDAO.class); //报错行!!!!!!!!!!!!!!!!!!!!
Customer customer = customerDAO.getCustomer(customerID);

PromotionDAO promotionDAO = 
(PromotionDAO)DAOFactory.getDAO(PromotionDAO.class);
Promotion promotion = 
promotionDAO.getPromotion(customer.getLevel());

//累计客户总消费额,并更新数据库
customer.setSumAmount(customer.getSumAmount().add(amount));
customerDAO.save(customer);

//返回打折后金额
return amount.multiply(promotion.getRatio());
}

/**
 * test
 * @param args
 */
public static void main(String[] args) throws DAOException {
CustomerDAOTest test = new CustomerDAOTest();
test.calcAmount("001", new BigDecimal(25.5));
}
}
运行到CustomerDAO customerDAO = (CustomerDAO)DAOFactory.getDAO(CustomerDAO.class); 这行就报错:
Exception in thread "main" java.lang.ClassCastException: java.lang.Class
at com.rizon.persistence.dao.busi.CustomerDAOTest.calcAmount(CustomerDAOTest.java:23)
at com.rizon.persistence.dao.busi.CustomerDAOTest.main(CustomerDAOTest.java:45)不知道什么原因。相关的类:
---------------------
CustomerDAO.java
---------------------
/**
 * 
 */
package com.rizon.persistence.dao.busi;import com.rizon.persistence.domain.Customer;/**
 * @author sujl
 *
 */
public interface CustomerDAO { public Customer getCustomer(String id);

public void save(Customer customer);
}
------------------------------
CustomerDAOImpl_SQLServer.java
------------------------------
package com.rizon.persistence.dao.busi;import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import com.rizon.persistence.domain.Customer;
import com.rizon.persistence.helper.DBHelper;public class CustomerDAOImpl_SQLServer implements CustomerDAO { /**
 * 根据id获取customer对象
 * @param id
 * @return
 */
public Customer getCustomer(String id){
Customer customer = null;

Connection conn = null;
ResultSet rset_customer = null;
PreparedStatement stmt_customer = null;

try{
String mysql = "select level,sumamount from customer " +
"where id = ?";
conn = DBHelper.getConnection();
stmt_customer = conn.prepareStatement(mysql);
stmt_customer.setString(1, id);
rset_customer = stmt_customer.executeQuery();

if(rset_customer.next()){
customer = new Customer();
customer.setId(id);

int level = rset_customer.getInt(1);
customer.setLevel(level);
double sumAmount = rset_customer.getDouble(2);
customer.setSumAmount(new BigDecimal(sumAmount));
}
}catch(SQLException e){
e.printStackTrace();
}finally{
if(conn!=null){
if(rset_customer!=null){
try{
rset_customer.close();
}catch(SQLException e){
e.printStackTrace();
}
}
if(stmt_customer!=null){
try{
stmt_customer.close();
}catch(SQLException e){
e.printStackTrace();
}
}

try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
return customer;


/**
 * 把customer对象更新至数据库
 * @param customer
 */
public void save(Customer customer){
Connection conn = null;
ResultSet rset_customer = null;
PreparedStatement stmt_customer = null;

try{
String mysql = "update customer set sumamount = sumamount + ? " +
"where id = ?";
conn = DBHelper.getConnection();
stmt_customer = conn.prepareStatement(mysql);
stmt_customer.setDouble(1,customer.getSumAmount().doubleValue());
stmt_customer.setString(2,customer.getId());

stmt_customer.executeUpdate();
}catch(SQLException e){
e.printStackTrace();
}finally{
if(conn!=null){
if(rset_customer!=null){
try{
rset_customer.close();
}catch(SQLException e){
e.printStackTrace();
}
}
if(stmt_customer!=null){
try{
stmt_customer.close();
}catch(SQLException e){
e.printStackTrace();
}
}

try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}

}

解决方案 »

  1.   

    -----------------------
    PromotionDAO.java
    -----------------------
    /**
     * 
     */
    package com.rizon.persistence.dao.busi;import com.rizon.persistence.domain.Promotion;/**
     * @author sujl
     *
     */
    public interface PromotionDAO { public Promotion getPromotion(int level);

    //public void save(Promotion promotion);
    }
    -------------------------------
    PromotionDAOImpl_SQLServer.java
    -------------------------------
    /**
     * 
     */
    package com.rizon.persistence.dao.busi;import java.math.BigDecimal;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;import com.rizon.persistence.domain.Promotion;
    import com.rizon.persistence.helper.DBHelper;/**
     * @author sujl
     *
     */
    public class PromotionDAOImpl_SQLServer implements PromotionDAO { public Promotion getPromotion(int level){
    Promotion promotion = null;

    Connection conn = null;
    ResultSet rset_promotion = null;
    PreparedStatement stmt_promotion = null;

    try{
    String mysql = "select ratio from promotion " +
    "where level = ?";
    conn = DBHelper.getConnection();
    stmt_promotion = conn.prepareStatement(mysql);
    stmt_promotion.setInt(1, level);
    rset_promotion = stmt_promotion.executeQuery();

    if(rset_promotion.next()){
    promotion = new Promotion();
    promotion.setLevel(level);

    double ratio = rset_promotion.getDouble(1);
    promotion.setRatio(new BigDecimal(ratio));
    }
    }catch(SQLException e){
    e.printStackTrace();
    }finally{
    if(conn!=null){
    if(rset_promotion!=null){
    try{
    rset_promotion.close();
    }catch(SQLException e){
    e.printStackTrace();
    }
    }
    if(stmt_promotion!=null){
    try{
    stmt_promotion.close();
    }catch(SQLException e){
    e.printStackTrace();
    }
    }

    try{
    conn.close();
    }catch(SQLException e){
    e.printStackTrace();
    }
    }
    }
    return promotion;
    }
    }
    --------------------
    DAOFactory.java
    --------------------
    /**
     * 
     */
    package com.rizon.persistence.dao;import java.util.HashMap;/**
     * @author sujl
     *
     */
    public class DAOFactory { private static HashMap daoMap = null;

    public static Object getDAO(Class daoInterface) throws DAOException{
    initial();

    Object dao = daoMap.get(daoInterface);
    if(dao==null){
    throw new DAOException("NO implementation found of DAO interface =>" +
    daoInterface.getName());
    }

    return dao;
    } public static synchronized void initial() {
    if(null==daoMap){
    daoMap = DAOConifg.load();//根据配置文件加载DAO实现
    }
    }
    }
    ---------------------
    DAOException.java
    ---------------------
    /**
     * 
     */
    package com.rizon.persistence.dao;/**
     * @author sujl
     *
     */
    public class DAOException extends Exception { private static final long serialVersionUID = 3085593827233867742L; public DAOException() {
       super();
    } /**
    * @param message
    */
    public DAOException(String message) {
       super(message);
    } /**
    * @param cause
    */
    public DAOException(Throwable cause) {
       super(cause.getMessage(), cause);
    } /**
    * @param message
    * @param cause
    */
    public DAOException(String message, Throwable cause) {
       super(message, cause);
    }
    }
    -----------------
    DAOConfig.java
    -----------------
    /**
     * 
     */
    package com.rizon.persistence.dao;import java.util.Enumeration;
    import java.util.HashMap;
    import java.util.Properties;import org.apache.log4j.LogManager;
    import org.apache.log4j.Logger;
    import org.igfay.jfig.JFig;
    import org.igfay.jfig.JFigIF;
    import org.igfay.jfig.JFigLocator;/**
     * @author sujl
     *
     */
    public class DAOConifg { private static Logger logger = LogManager.getLogger(DAOConifg.class);

    private static final String DAO_CONFIG_FILE = "dao.xml";
    private static final String DAO_CONFIG_SECTION = "DAO";

    public static synchronized HashMap load(){
    HashMap map = new HashMap();

    JFigLocator jfigLocator = new JFigLocator(DAO_CONFIG_FILE);
    JFigIF daoConfig = JFig.getInstance(jfigLocator);
    Properties prop = 
    daoConfig.getSectionAsProperties(DAO_CONFIG_SECTION);

    Enumeration enumSection = prop.keys();
    while(enumSection.hasMoreElements()){
    String daoIface = (String)enumSection.nextElement();
    String daoImpl = prop.getProperty(daoIface);

    try{
    Class iface = ClassToolKit.loadClass(daoIface);
    Class impl = ClassToolKit.loadClass(daoImpl);
    //将接口作为HashMap索引,实现作为值
    map.put(iface, impl);
    }catch(ClassNotFoundException e){
    logger.debug("No Class Found => "+e);
    }
    }
    return map;
    }
    }
    ----------------
    ClassToolKit.java
    --------------------/**
     * 
     */
    package com.rizon.persistence.dao;/**
     * @author sujl
     *
     */
    public class ClassToolKit { public static Class loadClass(String className)
    throws ClassNotFoundException {
    Class cls = null;
    try{
    //首先尝试用当前ClassLoader加载
    cls = Thread.currentThread().getContextClassLoader()
    .loadClass(className);
    }catch(Exception e){
    e.printStackTrace();
    }
    if(cls==null){
    //如果通过当前的ClassLoader加载失败,使用系统的ClassLoader加载
    cls = Class.forName(className);
    }
    return cls;
    }

    }
    此外,Customer.java,Promotion.java为POJO类,省略;DBHelper.java为数据库帮助类返回connection,Utils.java也是帮助类,均没问题,省略。肯定各位高手相助!!
      

  2.   

    import com.rizon.persistence.dao.DAOFactory;
    这个类的代码呢?
      

  3.   

    to:AWUSOFT,里头有的。您看一下。
      

  4.   

     (CustomerDAO)DAOFactory.getDAO(CustomerDAO.class); 可能你这里写错了,换成这个试试 (CustomerDAO)DAOFactory.getDAO(CustomerDAOImpl_SQLServer.class); 
      

  5.   

    java.lang.ClassCastException你那报错的那,出现了造型异常,即你这
    (CustomerDAO)DAOFactory.getDAO(CustomerDAO.class); 
    强制转换出错。
      

  6.   

    你测试一下DAOFactory.getDAO(CustomerDAO.class); 返回的是什么东东.
      

  7.   

    DAOFactory  这个类写的有问题实例化方法 没返回对象 那事例什么呢
    public static synchronized void initial() { 
    if(null==daoMap){ 
    daoMap = DAOConifg.load();//根据配置文件加载DAO实现 


      

  8.   

    to:AWUSOFT,DAOFactory.getDAO(Class daoInteface)这个方法的参数是接口类(CustomerDAO.class),返回实现类的。
      

  9.   

    既然是ClassCastException,那么可以肯定的是类型不匹配了,看代码的话public static synchronized void initial() { 
    if(null==daoMap){ 
    daoMap = DAOConifg.load();//根据配置文件加载DAO实现 
    } 在你的DaoFactory里面是这里根据配置文件加载DAO实现,所以最大可能就是配置文件的问题,也就是说daoMap里面根据传入的daoInterface取得的对象有误。
    所以把你的配置文件贴出来看看.
      

  10.   

    to numen_wlm:<?xml version="1.0" encoding="UTF-8"?>
    <configuration>
       <section name="DAO">
    <entry key="com.rizon.persistence.dao.busi.CustomerDAO" 
    value="com.rizon.persistence.dao.busi.CustomerDAOImpl_SQLServer" />
    <entry key="com.rizon.persistence.dao.busi.PromotionDAO" 
    value="com.rizon.persistence.dao.busi.PromotionDAOImpl_SQLServer" />
       </section>
    </configuration>
      

  11.   

    (CustomerDAO)DAOFactory.getDAO(CustomerDAO.class); 
    getDAO(...)参数应该是实现类的?
      

  12.   

    Class iface = ClassToolKit.loadClass(daoIface); 
    Class impl = ClassToolKit.loadClass(daoImpl); 
    //将接口作为HashMap索引,实现作为值 
    map.put(iface, impl); 看这代码,你是放一个Class对象进去吧.并没有放一个实例进去.map.put(iface, impl.getInstance()); 
      

  13.   


    我在caclAmount中用这样打印:System.out.println(DAOFactory.getDAO(CustomerDAO.class).toString());
    结果是:class com.rizon.persistence.dao.busi.CustomerDAOImpl_SQLServer
    感觉取到了所要的类了啊。
      

  14.   


    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
       <section name="DAO">
            <entry key="com.rizon.persistence.dao.busi.CustomerDAO" 
                value="com.rizon.persistence.dao.busi.CustomerDAOImpl_SQLServer" />
            <entry key="com.rizon.persistence.dao.busi.PromotionDAO" 
                value="com.rizon.persistence.dao.busi.PromotionDAOImpl_SQLServer" />
       </section>
    </configuration>很显然,你传进来的Key是CustomerDAO.class,得到的Value是CustomerDAOImpl_SQLServer,但是你的代码里面是把它转型为了
    CustomerDAO,所以会报转型异常。
    所以改为这样:(CustomerDAOImpl_SQLServer)DAOFactory.getDAO(CustomerDAO.class); 
      

  15.   

    分给给得不好,sorry,zidasine给多了,他回答得不对。
      

  16.   

    数据库中为Decimal类型取出后转为Double 对吗?