在数据库访问中一种好的办法是单独利用一个模块来管理获得连接和构建sql语句的代码复杂性。DAO模式能够很好的完成这一工作的简单模式。
使用这种模式需要持久化的为每一种类型对象都编写一个类,即DAO类。
DAO模式的编写:
1.DAO接口:所有的DAO都从这里产生。
2.BaseDAO类,它为所有的DAO提供基础的实现。
3.DataSourceCache类,辅助类负责管理DataSource,并进行缓存。
4.DAOFactory ,创建各种DAO实现的工厂类。
5.DAOException,DAO运行时抛出的异常。
6需要使用的DAO类及其实现类。
目录如下:
代码如下:
1.DAO
<span style="white-space:pre"> </span>package mvcStudyVolidator.dao;
<span style="white-space:pre"> </span>import java.sql.Connection;
<span style="white-space:pre"> </span>public interface DAO {
<span style="white-space:pre"> </span>public Connection getConnection() throws DAOException;
<span style="white-space:pre"> </span>}<span style="font-family: Arial, Helvetica, sans-serif;">.</span>
2.BaseDAO
package mvcStudyVolidator.dao;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.sql.DataSource;
public class BaseDAO implements DAO {
@Override
public Connection getConnection() throws DAOException {
DataSource dataSource = DataSourceCache.getInstance().getDataSource();
try {
return dataSource.getConnection();
} catch(Exception e) {
e.printStackTrace();
throw new DAOException();
}
}
protected void closeDBObject(ResultSet resultSet, Statement statement, Connection con) {
if(resultSet != null ) {
try {
resultSet.close();
} catch(Exception e) {
e.printStackTrace();
System.out.println("close resultSet failer");
}
}
if(statement != null) {
try {
statement.close();
} catch(Exception e) {
e.printStackTrace();
System.out.println("close statement failer");
}
}
if(con !=null) {
try {
con.close();
} catch(Exception e) {
e.printStackTrace();
System.out.println("close con failer");
}
}
}
}
3.DataSourceCache
package mvcStudyVolidator.dao;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
/**
*
* 单例模式实现一个数据库连接缓存
*
*/
public class DataSourceCache {
private static DataSourceCache instance ;
private DataSource dataSource ;
static {
instance = new DataSourceCache();
}
private DataSourceCache() {
Context context = null;
try {
context = new InitialContext();
dataSource = (DataSource) context.lookup("java:comp/env/jdbc/myDataSource");
} catch(NamingException e) {
e.printStackTrace();
}
}
public static DataSourceCache getInstance() {
return instance ;
}
public DataSource getDataSource() {
return dataSource ;
}
}
4. DAOFactory
package mvcStudyVolidator.dao;
public class DAOFactory {
public static ProductDAO getProduceDAO() {
return new ProductDAOImpl();
}
}
5.DAOException
package mvcStudyVolidator.dao;
public class DAOException extends Exception {
private static final long serialVersionUID = 1921L;
private String message ;
public DAOException() {
}
public DAOException(String message) {
this.message = message;
}
public String getMessage() {
return message ;
}
public void setMessage(String message) {
this.message = message ;
}
public String toString() {
return message ;
}
}
6productDAO
package mvcStudyVolidator.dao;
import java.util.List;
import mvcStudyVolidator.model.Product;
public interface ProductDAO extends DAO {
List<Product> getProducts() throws DAOException ;
void insert(Product product) throws DAOException ;
}
7.productDAOImpl
package mvcStudyVolidator.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import mvcStudyVolidator.model.Product;
public class ProductDAOImpl extends BaseDAO implements ProductDAO {
//get products sql
private static final String GET_PRODUCTS_SQL = "SELECT name, description, price FROM products";
//insert db products sql
private static final String INSERT_PRODUCT_SQL = "INSERT INTO products VALUES(?,?,?)" ;
@Override
public List<Product> getProducts() throws DAOException {
List<Product> products = new ArrayList<Product>();
Connection connection = null;
PreparedStatement pStatement = null;
ResultSet resultSet = null ;
try {
connection = getConnection();
pStatement = connection.prepareStatement(GET_PRODUCTS_SQL);
resultSet = pStatement.executeQuery();
while(resultSet.next()) {
Product product = new Product();
product.setName(resultSet.getString("name"));
product.setDescription(resultSet.getString("description"));
product.setPrice(resultSet.getFloat("price"));
System.out.println("price = " + product.getPrice());
products.add(product);
}
} catch(SQLException e) {
throw new DAOException("Errors geting products. " + e.getMessage());
} finally {
closeDBObject(resultSet, pStatement ,connection);
}
return products;
}
@Override
public void insert(Product product) throws DAOException {
Connection connection = null;
PreparedStatement pStatement = null;
try {
connection = getConnection();
pStatement = connection.prepareStatement(INSERT_PRODUCT_SQL) ;
pStatement.setString(1, product.getName());
pStatement.setString(2, product.getDescription());
pStatement.setFloat(3, product.getPrice());
pStatement.execute();
System.out.println("proudctName is " + product.getName() + " ProductDescription is " + product.getDescription());
} catch(SQLException e) {
throw new DAOException("Error insert product " +e.getMessage() );
} finally {
closeDBObject(null,pStatement,connection);
}
}
}