博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[原创]java WEB学习笔记21:MVC案例完整实践(part 2)---DAO层设计
阅读量:5058 次
发布时间:2019-06-12

本文共 9957 字,大约阅读时间需要 33 分钟。

本博客为原创:综合 尚硅谷(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

1 package com.jason.mvcapp.dao;  2   3 import java.lang.reflect.ParameterizedType;  4 import java.lang.reflect.Type;  5 import java.sql.Connection;  6 import java.util.List;  7   8 import org.apache.commons.dbutils.QueryRunner;  9 import org.apache.commons.dbutils.handlers.BeanHandler; 10 import org.apache.commons.dbutils.handlers.BeanListHandler; 11 import org.apache.commons.dbutils.handlers.ScalarHandler; 12  13 import com.jsaon.mvcapp.db.JdbcUtils; 14 import com.sun.org.apache.bcel.internal.generic.NEW; 15  16 /** 17  *  18  * @author: jason 19  * @time:2016年5月25日下午2:59:06 20  * @param 
: 当前DAO 处理的实体的类型是什么 21 * @description: 封装了CRUD 的方法 以供子类继承使用; 当前DAO直接在方法中获取数据库连接;整个DAO采取DBUtils解决方案;反射 22 */ 23 public class DAO
{ 24 25 private QueryRunner queryRunner = new QueryRunner(); //线程安全 ,直接new 26 27 private Class
clazz; 28 29 public DAO() { 30 //获取泛型父类的类型,getClass获取的是 子类的类型 31 Type superClass = getClass().getGenericSuperclass(); 32 // 33 if(superClass instanceof ParameterizedType){ 34 ParameterizedType parameterizedType = (ParameterizedType) superClass; 35 //获取真正的泛型的参数,返回的是一个Type类型的数组 36 Type[] typeArgs =parameterizedType.getActualTypeArguments(); 37 //判断数组不为空 且长度大于0 38 if(typeArgs != null && typeArgs.length > 0){ 39 //判断typeArgs[0]是否为Class 类型 ,即,泛型参数为一个类 40 if(typeArgs[0] instanceof Class){ 41 clazz = (Class
) typeArgs[0]; //赋值给clazz对象 42 } 43 } 44 } 45 } 46 47 /** 48 * @param sql 49 * @param args 50 * @description:返回某一个字段的值,例如:返回某一条记录的customerName 51 */ 52 public
E getForValue(String sql, Object... args) { 53 54 Connection connection = null; 55 try { 56 connection = JdbcUtils.getConnection(); 57 return (E) queryRunner.query(connection, sql, new ScalarHandler(), args); 58 59 } catch (Exception e) { 60 e.printStackTrace(); 61 } finally{ 62 JdbcUtils.releaseConnection(connection); 63 } 64 return null; 65 } 66 67 /** 68 * @param sql 69 * @param args 70 * @return 71 * @description:返回T 所对应的List 72 */ 73 public List
getForList(String sql, Object... args) { 74 Connection connection = null; 75 try { 76 connection = JdbcUtils.getConnection(); 77 78 return queryRunner.query(connection, sql, new BeanListHandler
(clazz), args); 79 80 } catch (Exception e) { 81 e.printStackTrace(); 82 } finally{ 83 JdbcUtils.releaseConnection(connection); 84 } 85 86 return null; 87 } 88 89 /** 90 * @param sql 91 * :sql语句 92 * @param args 93 * : sql语句的占位符 94 * @return :返回对象 95 * @description:返回对应的T 的一个实体类的对象 96 */ 97 public T get(String sql, Object... args) { 98 99 Connection connection = null;100 try {101 connection = JdbcUtils.getConnection();102 return queryRunner.query(connection, sql, new BeanHandler
(clazz), args); 103 104 } catch (Exception e) {105 e.printStackTrace();106 } finally{107 JdbcUtils.releaseConnection(connection);108 }109 110 //System.out.println(clazz);111 return null;112 }113 114 /**115 * @param sql116 * : sql语句117 * @param ags118 * : sql语句的占位符119 * @description:该方法封装了 INSERT ,DELETE,UPDATE 操作120 */121 public void update(String sql, Object... ags){122 123 Connection connection = null;124 try {125 connection = JdbcUtils.getConnection(); 126 queryRunner.update(connection, sql, ags);127 128 } catch (Exception e) {129 e.printStackTrace();130 } finally{131 JdbcUtils.releaseConnection(connection);132 }133 }134 135 }

 

  

    CustomerDAO.java

1 package com.jason.mvcapp.dao; 2  3 import java.util.List; 4  5 import com.jsaon.mvcapp.domain.Customer; 6  7  8 /** 9  * @author: jason10  * @time:2016年5月25日下午3:28:0011  * @description:12  */13 14 public interface CustomerDAO {15 16     //查询所有17     public List
getAll();18 19 //保存操作20 public void save(Customer coustomer);21 22 //更新前,先查询23 public Customer get(Integer id);24 25 //删除用户26 public void delete(Integer id);27 28 //查看与参数相同的名字有多少个记录数29 public long getCountWithName(String name);30 31 }

 

 

 II.JdbcUtils工具类  

  JdbcUtils.java

 

1 package com.jsaon.mvcapp.db; 2  3 import java.sql.Connection; 4 import java.sql.SQLException; 5  6 import javax.sql.DataSource; 7  8 import com.mchange.v2.c3p0.ComboPooledDataSource; 9 10 /**11  * @author: jason12  * @time:2016年5月25日下午3:23:4613  * @description:使用c3p0数据库连接池,完成工具类14  */15 16 public class JdbcUtils {17 18     /**19      * @param connection20      * @description:释放Connection连接21      */22     public static void releaseConnection(Connection connection) {23         24         try {25             if(connection != null){26                 connection.close();27             }28             29         } catch (Exception e) {30             e.printStackTrace();31         }32     }33     34     35     36     37     //强调:数据源只有一份就好了,初始化 放在静态代码块中38     private static DataSource  dataSource = null;39     40     static{41         dataSource = new ComboPooledDataSource("mvcapp"); //读取mvcapp的配置,也就是c3p0-config.xml的配置信息42         43     }44     /**45      * @return46      * @throws SQLException 47      * @description: 获取数据库连接池连接48      */49     public static Connection getConnection() throws SQLException {50         return dataSource.getConnection();51     }52 53     54     55 }

 

   

   c3p0-config.xml

 

1 
2
3
4
5 6
7
登录数据库的用户名
8
密码
9
驱动类
10
url
11 12 13 14
15
5
16
10
17
10
18
50
19
20
20
5
21
22

 

 

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

 

1 package com.jason.mvcapp.dao.impl; 2  3 import java.util.List; 4  5 import com.jason.mvcapp.dao.CustomerDAO; 6 import com.jason.mvcapp.dao.DAO; 7 import com.jsaon.mvcapp.domain.Customer; 8  9 /**10  * @author: jason11  * @time:2016年5月25日下午3:45:0612  * @description:对CustomerDAO 的实现13  */14 public class CustomerDAOJdbcImpl extends DAO
implements CustomerDAO {15 16 @Override17 public List
getAll() {18 String sql = "SELECT * FROM customers";19 return getForList(sql);20 }21 22 @Override23 public void save(Customer customer) {24 String sql = "INSERT INTO customers(name, address, phone) VALUES(?,?,? )";25 update(sql,customer.getName(),customer.getAddress(),customer.getPhone());26 }27 28 29 @Override30 public Customer get(Integer id) {31 String sql = "SELECT id, name, address, phone FROM customers WHERE id = ?";32 return get(sql,id);33 34 }35 36 @Override37 public void delete(Integer id) {38 String sql = "DELETE FROM customers WHERE id = ?";39 update(sql, id);40 }41 42 @Override43 public long getCountWithName(String name) {44 String sql = "SELECT count(id) FROM customers WHERE name = ?";45 return getForValue(sql, name);46 }47 48 }

 

 

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

 CustomerDAOJdbcImplTest.java

 

1 package com.jason.mvcapp.test; 2  3 import static org.junit.Assert.fail; 4  5 import java.util.List; 6  7 import org.junit.Test; 8  9 import com.jason.mvcapp.dao.CustomerDAO;10 import com.jason.mvcapp.dao.impl.CustomerDAOJdbcImpl;11 import com.jsaon.mvcapp.domain.Customer;12 13 public class CustomerDAOJdbcImplTest {14 15     private CustomerDAO customerDAO =new CustomerDAOJdbcImpl();16     @Test17     public void testGetAll() {18         List
customers = customerDAO.getAll();19 System.out.println(customers);20 }21 22 @Test23 public void testSaveCustomer() {24 Customer customer = new Customer();25 customer.setAddress("铁岭");26 customer.setName("黑土");27 customer.setPhone("15101035648");28 customerDAO.save(customer);29 }30 31 @Test32 public void testGetInteger() {33 Customer customer = customerDAO.get(1);34 System.out.println(customer);35 }36 37 @Test38 public void testDelete() {39 customerDAO.delete(1);40 }41 42 @Test43 public void testGetCountWithName() {44 long count = customerDAO.getCountWithName("白云");45 System.out.println(count);46 }47 48 }

 

 

  JdbcUtilsTest.java

1 package com.jason.mvcapp.test; 2  3 import java.sql.Connection; 4 import java.sql.SQLException; 5  6 import org.junit.Test; 7  8 import com.jsaon.mvcapp.db.JdbcUtils; 9 10 11 12 public class JdbcUtilsTest {13 14     @Test15     public void testGetConnection() throws SQLException {16         17         Connection connection = JdbcUtils.getConnection();18         System.out.println(connection);19     }20 21 }

 

 

 

 

2.总结

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

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

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

 

 

回看  

 

转载于:https://www.cnblogs.com/jasonHome/p/5528269.html

你可能感兴趣的文章
Python图像处理库(PIL)
查看>>
cocos2d-x载入图以及后前台切换
查看>>
数字处理类
查看>>
互观与评价
查看>>
验证视图状态 MAC 失败的解决办法
查看>>
css整理-01选择器和继承
查看>>
webapp前端开发总结
查看>>
【MAC下学习Unix网络编程】第一个例子中解决unp.h 在mac下的编译问题
查看>>
jquery ztree插件
查看>>
Java finally关键字
查看>>
InstallShield Limited Edition for Visual Studio 2013 图文教程(教你如何打包.NET程序)
查看>>
LUA安装过程
查看>>
Python-aiohttp百万并发
查看>>
牛顿法求平方根及习题1.6-1.8
查看>>
电赛初探(二)——语音采集回放系统
查看>>
SQL SERVER 如何调试存储过程
查看>>
php修改和增加xml结点属性
查看>>
Mysql插入数据是问号的乱码
查看>>
设计模式之原型模式
查看>>
(转)页面滚动图片加载
查看>>