在实际的开发中有一种项目的程序组织架构方案叫做MVC模式,按照程序 的功能将他们分成三个层,如下图

Modle层(模型层)、View层(显示层)、Controller层(控制层)。

Modle层:可以分两层,DAO层、service层,基文本功能 如下

service层:主要去负责一些业务处理,比如取得连接、关闭数据库连接、事务回滚,一些复杂的逻辑业务处理就放到service层

DAO层:负责访问数据库进行数据的操作,取得结果集,之后将结果集中的数据取出封装到VO类对象之后返回给service层

Cotroller层:叫做控制层,主要的功能是处理用户发送的请求。

View层:叫做显示层,主要是负责现实数据。

在实际开发中dao层要先定义出自己的操作标准即标准接口,就是为了解耦合。

Modle层(DAO层和service层)的设计如下。

  1. //BasDaoUtil.java代码,共7个方法
  2. package com.sxt.mvcpro.dao.impl;
  3. import java.lang.reflect.Field;
  4. import java.sql.Connection;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import java.util.ArrayList;
  8. import java.util.Iterator;
  9. import java.util.List;
  10. public class BaseDAOUtil {
  11. private static PreparedStatement pst;
  12. private static ResultSet rst;
  13. /**
  14. *
  15. * @param conn
  16. * @param sql
  17. * @param clz
  18. * @param vo
  19. * @return
  20. * @throws Exception
  21. */
  22. public <T> int save(Connection conn, String sql, Class<T> clz, T vo) throws Exception {
  23. //取得预编译对象
  24. pst = conn.prepareStatement(sql);
  25. // 为sql设置占位符内容(insert into 表(字段1,字段2,字段3,字段4)VALUES(?,?,?,?))
  26. String[] coulums = sql.split("\\(")[1].split("\\)")[0].split(",");
  27. for (int i = 0; i < coulums.length; i++) {
  28. Field f = vo.getClass().getDeclaredField(coulums[i]);
  29. // 取消私有封装访问限制
  30. f.setAccessible(true);
  31. //取得字段对应的属性的值
  32. Object fvalue = f.get(vo);
  33. pst.setObject(i + 1, fvalue);
  34. }
  35. return pst.executeUpdate();
  36. }
  37. /**
  38. *
  39. * @param conn
  40. * @param sql
  41. * @param vo
  42. * @return
  43. * @throws Exception
  44. */
  45. public <T> int edit(Connection conn,String sql,T vo) throws Exception{
  46. // update emp SET sal=?,job=?,comm=? WHERE empno=? AND ... ;
  47. //取得预编译对象
  48. pst=conn.prepareStatement(sql);
  49. String[] strs = sql.split("SET")[1].split("WHERE")[0].split(",");
  50. int i=0;
  51. for(i=0;i<strs.length;i++) {
  52. //取得要修改的字段名称
  53. String column=strs[i].split("=")[0];
  54. //通过反射取得column对应在vo中的属性对象(就是拿vo的变量,比如ename)
  55. Field f = vo.getClass().getDeclaredField(column.trim());
  56. // 取消私有封装访问限制
  57. f.setAccessible(true);
  58. //取得该字段在vo对象中的值
  59. Object fvalue=f.get(vo);
  60. //为占位符设置具体的内容
  61. pst.setObject(i+1, fvalue);
  62. }
  63. String coditions = sql.split("WHERE")[1].split("=")[0];
  64. Field f = vo.getClass().getDeclaredField(coditions.trim());
  65. f.setAccessible(true);
  66. Object fvalue=f.get(vo);
  67. pst.setObject(i+1, fvalue);
  68. return pst.executeUpdate();
  69. }
  70. /**
  71. *
  72. * @param conn
  73. * @param sql
  74. * @param id
  75. * @return
  76. * @throws Exception
  77. */
  78. public int removeById(Connection conn,String sql,Object id) throws Exception{
  79. //取得预编译对象
  80. pst=conn.prepareStatement(sql);
  81. pst.setObject(1, id);
  82. return pst.executeUpdate();
  83. }
  84. /**
  85. *
  86. * @param conn
  87. * @param sql
  88. * @param ids
  89. * @return
  90. * @throws Exception
  91. */
  92. public int removeBatch(Connection conn,StringBuffer sql,List<Object> ids) throws Exception{
  93. Iterator<Object> iter=ids.iterator();
  94. while (iter.hasNext()) {
  95. sql.append(iter.next()+",");
  96. }
  97. sql.delete(sql.length()-1, sql.length());
  98. sql.append(")");
  99. pst=conn.prepareStatement(sql.toString());
  100. return pst.executeUpdate();
  101. }
  102. /**
  103. *
  104. * @param conn
  105. * @param sql
  106. * @param clz
  107. * @param id
  108. * @return
  109. * @throws Exception
  110. */
  111. public <T> T selectOne(Connection conn,String sql,Class<T> clz,Object id) throws Exception{
  112. //取得预编译对象
  113. pst=conn.prepareStatement(sql);
  114. pst.setObject(1, id);
  115. //执行sql语句
  116. rst=pst.executeQuery();
  117. T t=null;
  118. if (rst.next()) {
  119. t=clz.newInstance();
  120. //取得所有属性
  121. Field[] fs = clz.getDeclaredFields();
  122. for (Field f : fs) {
  123. //为属性取消私有封装
  124. f.setAccessible(true);
  125. //取得属性名
  126. String fname=f.getName();
  127. //使用该属性名称从结果集中取得数据
  128. Object fvalue=rst.getObject(fname);
  129. //将取得的值保存t对象的属性
  130. f.set(t, fvalue);
  131. }
  132. return t;
  133. }
  134. return null;
  135. }
  136. /**
  137. *
  138. * @param conn
  139. * @param sql
  140. * @param clz
  141. * @param params
  142. * @return
  143. * @throws Exception
  144. */
  145. public <T> List<T> selectList(Connection conn,String sql,Class<T> clz,Object...params) throws Exception{
  146. List<T> list= new ArrayList<T>();
  147. pst=conn.prepareStatement(sql);
  148. for(int i=0;i<params.length;i++) {
  149. pst.setObject(i+1, params[i]);
  150. }
  151. //执行sql语句
  152. rst=pst.executeQuery();
  153. T t=null;
  154. while (rst.next()) {
  155. t=clz.newInstance();
  156. //取得所属性
  157. Field[] fs = clz.getDeclaredFields();
  158. for (Field f : fs) {
  159. //为属性取消私有封装
  160. f.setAccessible(true);
  161. //取得属性名
  162. String fname = f.getName();
  163. //使用该属性名称从结果集中取得数据
  164. Object fvalue=rst.getObject(fname);
  165. //将取得的值保存给t对象的属性
  166. f.set(t, fvalue);
  167. }
  168. list.add(t);
  169. }
  170. return list;
  171. }
  172. /**
  173. *
  174. * @param conn
  175. * @param sql
  176. * @param params
  177. * @return
  178. * @throws Exception
  179. */
  180. public int selectCount(Connection conn,String sql,Object...params) throws Exception{
  181. pst=conn.prepareStatement(sql);
  182. for(int i=0;i<params.length;i++) {
  183. pst.setObject(i+1, params[i]);
  184. }
  185. //执行sql语句
  186. rst=pst.executeQuery();
  187. rst.next();//让指针往下移动
  188. return rst.getInt(1);
  189. }
  190. }

DAO层基础设计原理的更多相关文章

  1. Java SE 之 DAO层接口设计思想

    用图说话 好处 1.只需要定义好IBaseDao的接口方法,并只需要实现BaseDaoImpl的方法,而具体的业务类和业务类/接口的方法的基本方法(IBaseDao已定义的)并不需要再考虑实现. 2. ...

  2. Hibernate的Dao层通用设计

    hibernate作为一款优秀的数据库持久化框架,在现实的运用中是非常广泛的.它的出现让不熟悉sql语法的程序员能开发数据库连接层成为一种可能,但是理想与现实永远是有差距的.开发过程中如果只使用hql ...

  3. DAO层设计Junit测试

    DAO层的设计: 在实际的开发中有一种项目的程序组织架构方案叫做MVC模式. MVC模式就是按照程序的功能将它们分成三层,分别是Modle层 (模型层).View(显示层).Controller(控制 ...

  4. [原创]java WEB学习笔记21:MVC案例完整实践(part 2)---DAO层设计

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

  5. Mybatis系列全解(七):全息视角看Dao层两种实现方式之传统方式与代理方式

    封面:洛小汐 作者:潘潘 一直以来 他们都说为了生活 便追求所谓成功 顶级薪水.名牌包包 还有学区房 · 不过 总有人丢了生活 仍一无所获 · 我比较随遇而安 有些事懒得明白 平日里问心无愧 感兴趣的 ...

  6. DAO层,Service层,Controller层、View层 的分工合作

    DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...

  7. [转]DAO层,Service层,Controller层、View层

    来自:http://jonsion.javaeye.com/blog/592335 DAO层 DAO 层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DA ...

  8. 简单数据库开发之dao层开发

    数据库 dao层是用来与底层数据库连接的一系列代码,它因上层service层调用而调用底层数据库,因为一般的数据库不会只存在一到几张表格,所以必须定义出dao层的接口协议,方便各种表格的操作. dao ...

  9. Java高并发秒杀API之业务分析与DAO层

    根据慕课网上关于java高并发秒杀API的课程讲解用maven+ssm+redis实现的一个秒杀系统 参考了codingXiaxw's blog,很详细:http://codingxiaxw.cn/2 ...

随机推荐

  1. 洛谷P2503 [HAOI2006]均分数据(模拟退火)

    题目描述 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: 输入输出格式 输入格式: 输入文件data.in包括: 第一行 ...

  2. [vue三部曲]第一部:vue脚手架的搭建和目录资源介绍,超详细!

    第一步 node环境安装 1.1 如果本机没有安装node运行环境,请下载node 安装包进行安装1.2 如果本机已经安装node的运行换,请更新至最新的node 版本下载地址:https://nod ...

  3. Cesium-知识点(Viewer)

    Cesium之Viewer的构造(转自:https://blog.csdn.net/zhy905692718/article/details/78865107) Viewer属于Cesium的控件部分 ...

  4. git 入门教程之初识git

    初识 git git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. 背景 我们都知道,Linus 在1991年创建了开源的linux系统,随着不断发展壮大,目前已发展成为最大 ...

  5. 2019年Web前端入门的自学路线

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文.本文内容不定期更新. 我前几天写过一篇文章:<裸辞两个月,海投一个月 ...

  6. Java-- String源码分析

    版权声明:本文为博主原创文章,未经博主允许不得转载 本篇博文基于java8,主要探讨java中的String源码. 首先,将一个类分为几个部分,分别是类定义(继承,实现接口等),全局变量,方法,内部类 ...

  7. 关于一体机打印新加菜按钮更改为下单小票打印设置FAQ(适用正餐6.0.1.0+,轻餐4.0.6.2+)

    适用版本:正餐6.0.1.0+,轻餐4.0.6.2+ 实际场景:更新后小票设置中的打印新加菜按钮更换为下单小票打印设置,更换后,设置中,有3个选项: 1.仅打印新加菜    (选中后,订单加菜后前台小 ...

  8. request获取各种路径

    equest.getRealPath() 这个方法已经不推荐使用了,代替方法是: request.getSession().getServletContext().getRealPath() 在ser ...

  9. java任意n以内连续的和等于n

    import java.util.Scanner; /** * Created by Admin on 2017/3/25. */ public class test01 { public stati ...

  10. ASP.NET Core 1.0、ASP.NET MVC Core 1.0和Entity Framework Core 1.0

    ASP.NET 5.0 将改名为 ASP.NET Core 1.0 ASP.NET MVC 6  将改名为 ASP.NET MVC Core 1.0 Entity Framework 7.0    将 ...