本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.DAO层的设计和编写

  1) 加入C3P0数据源: 两个jar包 mchange-commons-java-0.2.3.4.jar,c3p0-0.9.2.1.jar ,数据库驱动jar包

    

  2)具体类设计及结构

   ①代码的结构

  

    ②代码

    I. 编写DAO(常用的 添删改查 的方法)

    DAO.java

 package com.jason.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.jsaon.mvcapp.db.JdbcUtils;
import com.sun.org.apache.bcel.internal.generic.NEW; /**
*
* @author: jason
* @time:2016年5月25日下午2:59:06
* @param <T>: 当前DAO 处理的实体的类型是什么
* @description: 封装了CRUD 的方法 以供子类继承使用; 当前DAO直接在方法中获取数据库连接;整个DAO采取DBUtils解决方案;反射
*/
public class DAO<T> { private QueryRunner queryRunner = new QueryRunner(); //线程安全 ,直接new private Class<T> clazz; public DAO() {
//获取泛型父类的类型,getClass获取的是 子类的类型
Type superClass = getClass().getGenericSuperclass();
//
if(superClass instanceof ParameterizedType){
ParameterizedType parameterizedType = (ParameterizedType) superClass;
//获取真正的泛型的参数,返回的是一个Type类型的数组
Type[] typeArgs =parameterizedType.getActualTypeArguments();
//判断数组不为空 且长度大于0
if(typeArgs != null && typeArgs.length > 0){
//判断typeArgs[0]是否为Class 类型 ,即,泛型参数为一个类
if(typeArgs[0] instanceof Class){
clazz = (Class<T>) typeArgs[0]; //赋值给clazz对象
}
}
}
} /**
* @param sql
* @param args
* @description:返回某一个字段的值,例如:返回某一条记录的customerName
*/
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{
JdbcUtils.releaseConnection(connection);
}
return null;
} /**
* @param sql
* @param args
* @return
* @description:返回T 所对应的List
*/
public List<T> getForList(String sql, Object... args) {
Connection connection = null;
try {
connection = JdbcUtils.getConnection(); return queryRunner.query(connection, sql, new BeanListHandler<T>(clazz), args); } catch (Exception e) {
e.printStackTrace();
} finally{
JdbcUtils.releaseConnection(connection);
} return null;
} /**
* @param sql
* :sql语句
* @param args
* : sql语句的占位符
* @return :返回对象
* @description:返回对应的T 的一个实体类的对象
*/
public T get(String sql, Object... args) { Connection connection = null;
try {
connection = JdbcUtils.getConnection();
return queryRunner.query(connection, sql, new BeanHandler<T>(clazz), args); } catch (Exception e) {
e.printStackTrace();
} finally{
JdbcUtils.releaseConnection(connection);
} //System.out.println(clazz);
return null;
} /**
* @param sql
* : sql语句
* @param ags
* : sql语句的占位符
* @description:该方法封装了 INSERT ,DELETE,UPDATE 操作
*/
public void update(String sql, Object... ags){ Connection connection = null;
try {
connection = JdbcUtils.getConnection();
queryRunner.update(connection, sql, ags); } catch (Exception e) {
e.printStackTrace();
} finally{
JdbcUtils.releaseConnection(connection);
}
} }

  

    CustomerDAO.java

 package com.jason.mvcapp.dao;

 import java.util.List;

 import com.jsaon.mvcapp.domain.Customer;

 /**
* @author: jason
* @time:2016年5月25日下午3:28:00
* @description:
*/ public interface CustomerDAO { //查询所有
public List<Customer> getAll(); //保存操作
public void save(Customer coustomer); //更新前,先查询
public Customer get(Integer id); //删除用户
public void delete(Integer id); //查看与参数相同的名字有多少个记录数
public long getCountWithName(String name); }

 

 II.JdbcUtils工具类  

  JdbcUtils.java

 package com.jsaon.mvcapp.db;

 import java.sql.Connection;
import java.sql.SQLException; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; /**
* @author: jason
* @time:2016年5月25日下午3:23:46
* @description:使用c3p0数据库连接池,完成工具类
*/ public class JdbcUtils { /**
* @param connection
* @description:释放Connection连接
*/
public static void releaseConnection(Connection connection) { try {
if(connection != null){
connection.close();
} } catch (Exception e) {
e.printStackTrace();
}
} //强调:数据源只有一份就好了,初始化 放在静态代码块中
private static DataSource dataSource = null; static{
dataSource = new ComboPooledDataSource("mvcapp"); //读取mvcapp的配置,也就是c3p0-config.xml的配置信息 }
/**
* @return
* @throws SQLException
* @description: 获取数据库连接池连接
*/
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
} }

   

   c3p0-config.xml

 <?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- This app is massive! -->
<named-config name="mvcapp"> <!-- 连接数据库的节本信息 -->
<property name="user">登录数据库的用户名</property>
<property name="password">密码</property>
<property name="driverClass">驱动类</property>
<property name="jdbcUrl">url</property> <!-- 连接池的配置信息 -->
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">10</property>
<property name="maxPoolSize">50</property>
<property name="maxStatements">20</property>
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>

  III.提供CustomerDAO 接口的实现类 CustometDAOImpl

 package com.jason.mvcapp.dao.impl;

 import java.util.List;

 import com.jason.mvcapp.dao.CustomerDAO;
import com.jason.mvcapp.dao.DAO;
import com.jsaon.mvcapp.domain.Customer; /**
* @author: jason
* @time:2016年5月25日下午3:45:06
* @description:对CustomerDAO 的实现
*/
public class CustomerDAOJdbcImpl extends DAO<Customer> implements CustomerDAO { @Override
public List<Customer> getAll() {
String sql = "SELECT * 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 getCountWithName(String name) {
String sql = "SELECT count(id) FROM customers WHERE name = ?";
return getForValue(sql, name);
} }

  IV 测试代码(通过创建相应的junit测试类,测试各个类的方法)

 CustomerDAOJdbcImplTest.java

 package com.jason.mvcapp.test;

 import static org.junit.Assert.fail;

 import java.util.List;

 import org.junit.Test;

 import com.jason.mvcapp.dao.CustomerDAO;
import com.jason.mvcapp.dao.impl.CustomerDAOJdbcImpl;
import com.jsaon.mvcapp.domain.Customer; public class CustomerDAOJdbcImplTest { private CustomerDAO customerDAO =new CustomerDAOJdbcImpl();
@Test
public void testGetAll() {
List<Customer> customers = customerDAO.getAll();
System.out.println(customers);
} @Test
public void testSaveCustomer() {
Customer customer = new Customer();
customer.setAddress("铁岭");
customer.setName("黑土");
customer.setPhone("15101035648");
customerDAO.save(customer);
} @Test
public void testGetInteger() {
Customer customer = customerDAO.get(1);
System.out.println(customer);
} @Test
public void testDelete() {
customerDAO.delete(1);
} @Test
public void testGetCountWithName() {
long count = customerDAO.getCountWithName("白云");
System.out.println(count);
} }

  JdbcUtilsTest.java

 package com.jason.mvcapp.test;

 import java.sql.Connection;
import java.sql.SQLException; import org.junit.Test; import com.jsaon.mvcapp.db.JdbcUtils; public class JdbcUtilsTest { @Test
public void testGetConnection() throws SQLException { Connection connection = JdbcUtils.getConnection();
System.out.println(connection);
} }

2.总结

  1)从代码层面,理解MVC设计模式

  2)使用dbUtils工具类,操作jdbc

  3)配置,使用c3p0数据库连接池

回看  案例完整实践(part 1)---MVC架构分析

[原创]java WEB学习笔记21:MVC案例完整实践(part 2)---DAO层设计的更多相关文章

  1. [原创]java WEB学习笔记20:MVC案例完整实践(part 1)---MVC架构分析

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  2. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. [原创]java WEB学习笔记11:HttpServlet(HttpServletRequest HttpServletRsponse) 以及关于 Servlet 小结

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. [原创]java WEB学习笔记26:MVC案例完整实践(part 7)---修改的设计和实现

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  7. [原创]java WEB学习笔记25:MVC案例完整实践(part 6)---新增操作的设计与实现

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. [原创]java WEB学习笔记24:MVC案例完整实践(part 5)---删除操作的设计与实现

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. [原创]java WEB学习笔记23:MVC案例完整实践(part 4)---模糊查询的设计与实现

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

随机推荐

  1. 【转】mongoDB命令行和客户端访问

    一.客户端 mongodb客户端常用的是mongoVUE  下载mongoVUE:网上下载地址,并且是破解版.[若没分,可以单独找我].因为非破解版的只有15天的使用限制.         打开界面如 ...

  2. 【ExtAspNet学习笔记】ExtAspNet控件库中常见问题

    1.在Grid控件中添加CheckBoxField控件,选择一行时,如何获取选择的CheckBoxField所对应记录的唯一标识值? ●解决方案: 在前台Grid控件中, 添加“<ext:Che ...

  3. windows下简单配置squid反向代理服务器

    下载windwosNT版本的squid下载地址: http://squid.acmeconsulting.it/download/squid-2.6.STABLE13-bin.zip 1.把squid ...

  4. sublime 插件(持续更新)

    sublime text 3创建新文件插件-AdvanceNewFile 这里要记录sublime text 3 在创建新文件时安装的插件–AdvanceNewFile ST本来自带的创建新文件的快捷 ...

  5. Linux学习笔记(三):系统执行级与执行级的切换

    1.Linux系统与其它的操作系统不同,它设有执行级别.该执行级指定操作系统所处的状态.Linux系统在不论什么时候都执行于某个执行级上,且在不同的执行级上执行的程序和服务都不同,所要完毕的工作和所要 ...

  6. Cygwin 版本的 Curl 安装,提取,使用笔记

    Cygwin 版本的 Curl 安装,提取,使用笔记 Cygwin 版本的 Curl 使其恢复 HTTPS 请求功能Cygwin 版本的 Curl 依赖的 DLL 清单提取 Cygwin 版本的 Cu ...

  7. windows下python安装Numpy、Scipy、matplotlib模块(转载)

    python下载链接     Numpy下载链接 python中Numpy包的安装及使用 Numpy包的安装 准备工作 Python安装 pip安装 将pip所在的文件夹添加到环境变量path路径中 ...

  8. Python snap

    orderedDict enum sys.path 注册装饰器 装饰器检查 入参 Flask01 flask_script flask blue print functools.partial dns ...

  9. 推荐android布局百分比框架

    githup:https://github.com/JulienGenoud/android-percent-support-lib-sample 下面是使用方法: Android Percent S ...

  10. Windows server2008 搭建ASP接口訪问连接oracle数据库全过程记录

    真的是太不easy了,曾经的时候在window server 2003上面搭建了一套asp+oracle的接口系统.就费了好大的劲儿,事实上那会迷迷瞪瞪的也不知道怎么的就弄好了,也懒得管了.OK,从昨 ...