JavaWeb同步学习笔记之三十、JavaWeb_MVC案例之DAO层实现

MVC案例之DAO层实现

搭建相关环境,

  • 1.搭建c3p0环境,在Web工程的src目录下添加c3p0-config.xml文件。同时在WebContent/WEB-INF/lib/下加入c3p0的jar包和Oracle数据库驱动文件。
  • 2.因为Jdbc用到DBUtils工具,所以同时导入DBUtils的jar包。
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<named-config name="mvccrud">

		<property name="user">scott</property>
		<property name="password">tiger</property>
		<property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
		<property name="jdbcUrl">jdbc:oracle:thin:@localhost:1521:orcl</property>
		
		<!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。 -->
		<property name="acquireIncrement">5</property>
		<!-- 初始化时获取十个连接,取值应在minPoolSize与maxPoolSize之间。 -->
		<property name="initialPoolSize">10</property>
		<!-- 连接池中保留的最小连接数。 -->
		<property name="minPoolSize">10</property>
		<!-- 连接池中保留的最大连接数。 -->
		<property name="maxPoolSize">50</property>

		<!-- JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements 属于单个connection而不是整个连接池,所以设置这个参数需要考虑到多方面的因素。 
			如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。 -->
		<property name="maxStatements">20</property>
		<!-- 连接池内单个连接所拥有的最大缓存statements数。 -->
		<property name="maxStatementsPerConnection">5</property>
		
	</named-config>
</c3p0-config>

下面的代码在上次笔记上补充,具体代码:

  • 1.JdbcUtils代码:
/**  
 * All rights Reserved,Designed By XS
 * @Title: JdbcUtils.java
 * @Package com.xs.mvc_crud.db
 * @Description: TODO
 * @author: XS
 * @date: 2019年3月9日 下午12:36:46
 * @version V1.0
 */
package com.xs.mvc_crud.db;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * @ClassName: JdbcUtils
 * @Description: JDBC操作的工具类
 * @author: XS
 * @date: 2019年3月9日 下午12:36:46
 * @version V1.0
 */
public class JdbcUtils {

	/**
	 * @Title: releaseConnection
	 * @Description: 释放Connection连接
	 * @return void
	 */
	public static void releaseConnection(Connection connection) {
		
		try {
			if (connection != null) {
				connection.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	/**
	 * @Fields dataSource: 数据源。
	 */
	private static DataSource dataSource = null;

	static {
		//数据源只能被创建一次,所以放在静态代码块中。
		dataSource = new ComboPooledDataSource("mvccrud");
	}

	/**
	 * @Title: getConnection
	 * @Description: 返回数据源的一个Connection对象
	 * @return
	 * @return Connection
	 * @throws SQLException
	 */
	public static Connection getConnection() throws SQLException {
		return dataSource.getConnection();
	}

}
  • 2.DAO代码:
/**  
 * All rights Reserved,Designed By XS
 * @Title: DAO.java
 * @Package com.xs.mvc_crud.dao
 * @Description: TODO
 * @author: XS
 * @date: 2019年3月9日 上午11:22:55
 * @version V1.0
 */
package com.xs.mvc_crud.dao;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import com.xs.mvc_crud.db.JdbcUtils;

/**   
 * @ClassName: DAO
 * @Description: <T>:当前DAO处理的实体类是什么类型,封装了CRUD的方法,以供子类继承使用。
 * 当前DAO直接在方法中获取数据库连接。
 * @author: XS
 * @date: 2019年3月9日 上午11:22:55
 * @version V1.0
 */
public class DAO<T> {
	
	private QueryRunner queryRunner = new QueryRunner();
	
	private Class<T> clazz;
	
	public DAO() {
		Type superClass = getClass().getGenericSuperclass();
		if (superClass instanceof ParameterizedType) {
			ParameterizedType parameterizedType = (ParameterizedType)superClass;
			Type [] typeArgs = parameterizedType.getActualTypeArguments();
			if (typeArgs != null && typeArgs.length > 0) {
				if (typeArgs[0] instanceof Class) {
					clazz = (Class<T>) typeArgs[0];
				}
			}
		}
	}
	
	/**   
	 * @Title: getForValue
	 * @Description: 返回某一个字段的值,例如返回某一条记录的customerName,或返回数据表中有多少条记录等。
	 * @param sql
	 * @param args
	 * @return 
	 * @return E
	 */
	public <E> E getForValue(String sql,Object ... args) {
		Connection connection = null;
		try {
			connection = JdbcUtils.getConnection();
			return queryRunner.query(connection, sql, new ScalarHandler<>(), args);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.releaseConnection(connection);
		}
		return null;
	}
	
	/**   
	 * @Title: getForList
	 * @Description: 返回T所对应的List
	 * @param sql
	 * @param args
	 * @return 
	 * @return List<T>
	 */
	public List<T> getForList(String sql, Object ... args) {
		Connection connection = null;
		try {
			connection = JdbcUtils.getConnection();
			return queryRunner.query(connection, sql, new BeanListHandler<>(clazz), args);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.releaseConnection(connection);
		}
		return null;
	}
	
	/**   
	 * @Title: get
	 * @Description: 返回对应的T的一个实例类的对象。
	 * @param sql
	 * @param args
	 * @return 
	 * @return T
	 */
	public T get(String sql,Object ... args) {
		Connection connection = null;
		try {
			connection = JdbcUtils.getConnection();
			return queryRunner.query(connection, sql, new BeanHandler<>(clazz), args);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.releaseConnection(connection);
		}
		return null;
	}
	
	/**   
	 * @Title: update
	 * @Description: 该方法封装了INSERT、DELETE、UPDATE操作。
	 * @param sql: SQL 语句。
	 * @param args: 填充SQL语句的占位符。
	 * @return void
	 */
	public void update(String sql,Object ... args) {
		Connection connection = null;
		
		try {
			connection = JdbcUtils.getConnection();
			queryRunner.update(connection, sql, args);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.releaseConnection(connection);
		}
	}
}
  • 3.CustomerDAOJdbcImpl代码:
/**  
 * All rights Reserved,Designed By XS
 * @Title: CustomerDAOJdbcImpl.java
 * @Package com.xs.mvc_crud.dao.impl
 * @Description: TODO
 * @author: XS
 * @date: 2019年3月9日 下午12:47:50
 * @version V1.0
 */
package com.xs.mvc_crud.dao.impl;

import java.math.BigDecimal;
import java.util.List;

import com.xs.mvc_crud.dao.CustomerDAO;
import com.xs.mvc_crud.dao.DAO;
import com.xs.mvc_crud.domain.Customer;

/**   
 * @ClassName: CustomerDAOJdbcImpl
 * @Description: TODO
 * @author: XS
 * @date: 2019年3月9日 下午12:47:50
 * @version V1.0
 */
public class CustomerDAOJdbcImpl extends DAO<Customer> implements CustomerDAO {

	/**   
	 * <p>Title: getAll</p>
	 * <p>Description: </p>
	 * @see com.xs.mvc_crud.dao.CustomerDAO#getAll()
	 * @return
	 */
	@Override
	public List<Customer> getAll() {
		String sql = "SELECT id, name, address, phone FROM customers";
		return getForList(sql);
	}

	/**   
	 * <p>Title: save</p>
	 * <p>Description: </p>
	 * @see com.xs.mvc_crud.dao.CustomerDAO#save(com.xs.mvc_crud.domain.Customer)
	 * @param customer
	 */
	@Override
	public void save(Customer customer) {
		String sql = "INSERT INTO customers(id, name, address, phone) values(id_seq.nextval,?,?,?)";
		update(sql, customer.getName(), customer.getAddress(), customer.getPhone());
	}

	/**   
	 * <p>Title: get</p>
	 * <p>Description: </p>
	 * @see com.xs.mvc_crud.dao.CustomerDAO#get(int)
	 * @param id
	 * @return
	 */
	@Override
	public Customer get(int id) {
		String sql = "SELECT id, name, address, phone FROM customers WHERE id = ?";
		return get(sql,id);
	}

	/**   
	 * <p>Title: delete</p>
	 * <p>Description: </p>
	 * @see com.xs.mvc_crud.dao.CustomerDAO#delete(int)
	 * @param id
	 */
	@Override
	public void delete(int id) {
		String sql = "DELETE FROM customers WHERE id = ?";
		update(sql, id);
	}

	/**   
	 * <p>Title: getCountWithName</p>
	 * <p>Description: </p>
	 * @see com.xs.mvc_crud.dao.CustomerDAO#getCountWithName(java.lang.String)
	 * @param name
	 * @return
	 */
	@Override
	public BigDecimal getCountWithName(String name) {
		String sql = "SELECT count(id) FROM customers WHERE name = ?";
		return getForValue(sql,name);
	}
}

猜你喜欢

转载自blog.csdn.net/baidu_38688346/article/details/88366338