这是个采用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();
}
}
}
}
}
首先是测试类: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();
}
}
}
}
}
解决方案 »
- 求个正则表达式
- 将手机号码进行64位编码的函数.
- 随便举个例子,说明单线程比多线程编程提高性能
- JAVA中读取数字集的问题
- 刚开始学java,问一个很基本的问题
- 菜鸟提问 一段代码编译出错,自己解决不了 请教!
- 用eclipse的请进:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- Connetion reset by peer JVM_recv in socket input stream read
- Look this , the menu is DISAPPEAR!!!
- 重载的小问题
- SUN公司的JDK和openJDK有什么区别?
- 接口中的变量为什么默认是public static final的?
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也是帮助类,均没问题,省略。肯定各位高手相助!!
这个类的代码呢?
(CustomerDAO)DAOFactory.getDAO(CustomerDAO.class);
强制转换出错。
public static synchronized void initial() {
if(null==daoMap){
daoMap = DAOConifg.load();//根据配置文件加载DAO实现
}
}
if(null==daoMap){
daoMap = DAOConifg.load();//根据配置文件加载DAO实现
} 在你的DaoFactory里面是这里根据配置文件加载DAO实现,所以最大可能就是配置文件的问题,也就是说daoMap里面根据传入的daoInterface取得的对象有误。
所以把你的配置文件贴出来看看.
<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>
getDAO(...)参数应该是实现类的?
Class impl = ClassToolKit.loadClass(daoImpl);
//将接口作为HashMap索引,实现作为值
map.put(iface, impl); 看这代码,你是放一个Class对象进去吧.并没有放一个实例进去.map.put(iface, impl.getInstance());
我在caclAmount中用这样打印:System.out.println(DAOFactory.getDAO(CustomerDAO.class).toString());
结果是:class com.rizon.persistence.dao.busi.CustomerDAOImpl_SQLServer
感觉取到了所要的类了啊。
<?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);