MVC案例代码详解--基本配置(1)这里的案例是个基本MVC模式,包含了基本的数据库连接池,编写了基本的DAO,JdbcUtils操作类,具体的操作Customer的接口和实现类。后续的Servlet,请关注后续的经验分享
第一步:创建数据库
第二步:搭建web工程
第三步:使用c3p0数据库连接池
11.拷入使用的jar包,这里显示的是所有用到的jar包
33.配置如下,可以修改的有, 用户名,密码,数据库名称,其他默认即可
44.编写JdbcUtils.java(重点,以后其他工程可以复用的代码),代码如下
55.新建JdbcTest单元测试类,测试C3P0数据库连接池是否配置正常
66.至此,CP03数据库连接池配置完毕(重点,以后其他工程使用到C3P0连接池的话也可以这样配置)
第四步:编写数据库对应的model
新建Customer.java 其属性对应数据库的字段
第五步:编写基本DAO操作类
11.说明这里的DAO没有用到事务,所以比较简单新建类DAO.java 新建接口 CustomersDAO.java
22.DAO.java 封装了基本的增删改查操作方法,以供子类继承使用当前DAO直接在方法中获取数据库连接(没有事务)整个DAO采用DBUtils解决方案这个只是一基本的工具类,具体的操作数据库由它的子类来实现例如如果要操作Customer数据库表,则需要新建一个CustomersDAOJdbcImpl.java 来继承这个父类。(重点理解,代码亦可以复用于其他没有事务的操作中,这里贴出源码,方便拷贝)
33.DAO.java源码如下:package com.sjzjava.mvcapp.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.sjzjava.mvcapp.db.JdbcUtils;/** * 封装了基本的增删改查操作方法,以供子类继承使用 * 当前DAO直接在方法中获取数据库连接(没有事务) * 整个DAO采用DBUtils解决方案 * @author sjzjava * * @param :当前DAO 处理的实体类的类型是什么 */public class Dao { //DBUtils 中的方法 private QueryRunner queryRunner = new QueryRunner(); private Class 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)typeArgs[0]; } } } } /** * 该方法封装了 insert update delete 操作 * @param sql:SQL语句 * @param args:填充SQL语句的参数(占位符) */ public void update(String sql,Object ... args){ Connection conn = null; try { conn = JdbcUtils.getConnection(); queryRunner.update(conn, sql, args); } catch (Exception e) { e.printStackTrace(); }finally{ JdbcUtils.releaseConnection(conn); } } /** * 返回对应的T的一个实体类的对象 * @param clazz * @param sql * @param args * @return */ public T get(String sql,Object ... args){ Connection conn = null; try { conn = JdbcUtils.getConnection(); return (T) queryRunner.query(conn, sql, new BeanHandler(clazz), args); } catch (Exception e) { e.printStackTrace(); }finally{ JdbcUtils.releaseConnection(conn); } return null; } /** * 返回T所对应的List * @param sql * @param args * @return */ public List getForList(String sql,Object ... args){ Connection conn = null; try { conn = JdbcUtils.getConnection(); return queryRunner.query(conn, sql, new BeanListHandler(clazz), args); } catch (Exception e) { e.printStackTrace(); }finally{ JdbcUtils.releaseConnection(conn); } return null; } /** * 返回某一个字段的值 * @param sql * @param args * @return */ public E getForValue(String sql,Object ... args){ Connection conn = null; try { conn = JdbcUtils.getConnection(); return (E) queryRunner.query(conn, sql, new ScalarHandler(), args); } catch (Exception e) { e.printStackTrace(); }finally{ JdbcUtils.releaseConnection(conn); } return null; }}
44.CustomersDAO是一个接口,仅给出了操作Customer表的基本方法
55.新建CustomersDAOJdbcImpl.java 继承DAO.java 可以使用DAO的所有方法实现CustomersDAO,具体给出操作Customer的实现方法
66.CustomersDAOJdbcImpl.java源码如下:package com.sjzjava.mvcapp.dao.impl;import java.util.List;import com.sjzjava.mvcapp.dao.CustomersDAO;import com.sjzjava.mvcapp.dao.Dao;import com.sjzjava.mvcapp.domain.Customer;public class CustomersDAOJdbcImpl extends Dao implements CustomersDAO { @Override public List getAll() { String sql = 'SELECT id,name,address,phone FROM customers'; return getForList(sql); } @Override public void save(Customer customer) { String sql = 'INSERT INTO customers(name,address,phone) VALUES(?,?,?)'; update(sql, customer.getName(),customer.getAddress(),customer.getPhone()); } @Override public Customer get(Integer id) { String sql = 'SELECT id,name,address,phone FROM customers WHERE id = ?'; return get(sql, id); } @Override public void delete(Integer id) { String sql = 'DELETE FROM customers WHERE id = ?'; update(sql, id); } @Override public long getCountWidthName(String name) { String sql = 'SELECT COUNT(id) FROM customers WHERE name = ?'; return getForValue(sql, name); }}
77.新建CustomersDAOJdbcImplTest 单元测试类
总结:
1.C3P0数据库连接池可以复用2.DAO.java可以复用于没有事务的情况下(着重理解DBUtils的使用,反射理解即可)3.理解CustomersDAOJdbcImpl 的继承和实现。