1.配置c3p0-config.xml
导入包:
<c3p0-config>
<!-- This app is massive! -->
<named-config name="mvcapp">
<property name="user">root</property>
<property name="password">1234</property>
<property name="driverClass">com.maysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/db_person</property>
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">10</property>
<property name="maxPoolSize">50</property>
<!-- intergalactoApp adopts a different approach to configuring statement caching -->
<property name="maxStatements">20</property>
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
2.使用dbutils工具包编写DAO((Data Access Object) 数据访问对象是一个面向对象的数据库接口)
编写jdbcUtils文件,进行数据连接
package MVCCases;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class jdbcUtils {
public static void release(Connection connection){
if(connection != null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
private static DataSource dataSource = null;//数据源
static {
//数据源只能被创建一次
dataSource = new ComboPooledDataSource("mvcapp");
}
public static Connection getConnection() throws SQLException{
return dataSource.getConnection();
}
}
package MVCCases;
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 java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
public class DAO<T> {
private QueryRunner queryRunner = new QueryRunner();
private Class<T> clazz;
public DAO() {
clazz = ReflectionUtils.getSuperGenericType(getClass());
}
/**
* 1.Create Retrieve Update Delete
* INSERT UPDATE DELETE
*/
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{
if(connection != null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
/**
* 2.查询,返回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{
if(connection != null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return null;
}
/**
* 3.查询,返回T所对应的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{
if(connection != null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return null;
}
/**
*4.返回某个字段的值:如返回某一条记录的值,或返回数据表中有多少条记录
*/
public <E> E getForValue(String sql, Object ...args){
Connection connection = null;
try{
connection = jdbcUtils.getConnection();
return (E) queryRunner.query(connection, sql,new ScalarHandler(), args);
}catch(Exception e){
e.printStackTrace();
}finally{
if(connection != null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return null;
}
}
3.编写Customer,和CustomerDAO接口
package MVCCases;
public class Customer {
private int id;
private String name;
private String address;
private String phone;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Customer(int id, String name, String address, String phone) {
this.id = id;
this.name = name;
this.address = address;
this.phone = phone;
}
public Customer() {}
@Override
public String toString() {
return "Customer{" +
"id=" + id +
", name='" + name + '\'' +
", address='" + address + '\'' +
", phone='" + phone + '\'' +
'}';
}
}
CustomerDAO接口
package MVCCases;
import java.util.List;
public interface CustomerDAO {
public void update(Customer customer);
public void save(Customer customer);
public void delete(int id);
public Customer get(int id);
public List<Customer> getAll();
}
4.继承和实现3中的父类和接口
package MVCCases;
import java.util.List;
public class CustomerDAOImpl extends DAO<Customer> implements CustomerDAO {
@Override
public void update(Customer customer) {
}
@Override
public void save(Customer customer) {
String sql = "INSERT INTO customer(name, address, phone) VALUES(?, ?, ?)";
update(sql, customer.getName(), customer.getAddress(), customer.getPhone());
}
@Override
public void delete(int id) {
String sql = "DELETE FROM customer WHERE id = ?";
update(sql, id);
}
@Override
public Customer get(int id) {
String sql = "SELECT id, name, address, phone FROM customer WHERE id = ?";
return get(sql, id);
}
@Override
public List<Customer> getAll() {
String sql = "SELECT id, name, address, phone FROM customer";
return getForList(sql);
}
}
ReflectionUtils
package MVCCases;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class ReflectionUtils {
/**
* 通过反射获得Class中声明的父类的泛型参数类型
* @param clazz
* @param <T>
* @return
*/
public static<T> Class<T> getSuperGenericType(Class clazz){
return getSuperGenericType(clazz, 0);
}
/**
* 通过反射,获得定义Class时声明的父类的泛型参数的类型
* @param clazz
* @param index
* @param <T>
* @return
*/
public static Class getSuperGenericType(Class clazz, int index) {
//获得父类泛型类型
Type genType = clazz.getGenericSuperclass();
//未被参数化
if(!(genType instanceof ParameterizedType)){
return Object.class;
}
//当被参数化之后 获取实际的泛型类型参数数组 注意括号
Type[] params = ((ParameterizedType)genType).getActualTypeArguments();
if(index >= params.length || index < 0){
return Object.class;
}
if(!(params[index] instanceof Class)){
return Object.class;
}
return (Class)params[index];
}
}