本博客为原创:综合 尚硅谷(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. asp.net 导出excel 中文乱码解决方法 (转)

    用我转载的上一篇文章 Asp.net中把DataTable或DataGrid导出为Excel 导出的文档,中文有乱码现象,其实要解决中文乱码很简单,设置一下字符集.如下: // 设置编码和附件格式 c ...

  2. PrincetonUniversity-Coursera 算法:算法简单介绍

    Course Overview What is this course? Intermediate-level survey course. Programming and proble solvin ...

  3. 42:换汽水瓶ExchangeBottle

    有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水.小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个 ...

  4. C# 系统应用之注冊表使用具体解释

    在平时做项目时,我们有时会遇到注冊表的操作,比如前面我们须要获取IE浏览器地址栏的信息.获取"我的电脑"地址栏输入的目录信息.USB近期使用信息等.注冊表项是注冊表的基本组织单位, ...

  5. PDO中捕获SQL语句中的错误

    使用默认模式-----PDO::ERRMODE_SILENT 在默认模式中设置PDOStatement对象的errorCode属性,但不进行其它不论什么操作. 比如: 通过prepare()和exec ...

  6. 【文献阅读】Perceptual Generative Adversarial Networks for Small Object Detection –CVPR-2017

    Perceptual Generative Adversarial Networks for Small Object Detection 2017CVPR 新鲜出炉的paper,这是针对small ...

  7. NSIS 变量

    $PROGRAMFILES 程序文件目录(通常为 C:\Program Files 但是运行时会检测). $COMMONFILES 公用文件目录.这是应用程序共享组件的目录(通常为 C:\Progra ...

  8. TensorFlow CNN 測试CIFAR-10数据集

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50738311 1 CIFAR-10 数 ...

  9. unity回调函数范例

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class callback ...

  10. 解决Command "laravoole" is not defined.

    版权声明:本文为博主原创文章,未经博主允许不得转载.  GitHub地址:https://github.com/garveen/laravoole 先来执行正常的安装流程: 安装 要开始,将larav ...