DAO层基础设计原理
在实际的开发中有一种项目的程序组织架构方案叫做MVC模式,按照程序 的功能将他们分成三个层,如下图
Modle层(模型层)、View层(显示层)、Controller层(控制层)。

Modle层:可以分两层,DAO层、service层,基文本功能 如下
service层:主要去负责一些业务处理,比如取得连接、关闭数据库连接、事务回滚,一些复杂的逻辑业务处理就放到service层
DAO层:负责访问数据库进行数据的操作,取得结果集,之后将结果集中的数据取出封装到VO类对象之后返回给service层
Cotroller层:叫做控制层,主要的功能是处理用户发送的请求。
View层:叫做显示层,主要是负责现实数据。
在实际开发中dao层要先定义出自己的操作标准即标准接口,就是为了解耦合。
Modle层(DAO层和service层)的设计如下。

//BasDaoUtil.java代码,共7个方法
package com.sxt.mvcpro.dao.impl;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class BaseDAOUtil {
private static PreparedStatement pst;
private static ResultSet rst;
/**
*
* @param conn
* @param sql
* @param clz
* @param vo
* @return
* @throws Exception
*/
public <T> int save(Connection conn, String sql, Class<T> clz, T vo) throws Exception {
//取得预编译对象
pst = conn.prepareStatement(sql);
// 为sql设置占位符内容(insert into 表(字段1,字段2,字段3,字段4)VALUES(?,?,?,?))
String[] coulums = sql.split("\\(")[1].split("\\)")[0].split(",");
for (int i = 0; i < coulums.length; i++) {
Field f = vo.getClass().getDeclaredField(coulums[i]);
// 取消私有封装访问限制
f.setAccessible(true);
//取得字段对应的属性的值
Object fvalue = f.get(vo);
pst.setObject(i + 1, fvalue);
}
return pst.executeUpdate();
}
/**
*
* @param conn
* @param sql
* @param vo
* @return
* @throws Exception
*/
public <T> int edit(Connection conn,String sql,T vo) throws Exception{
// update emp SET sal=?,job=?,comm=? WHERE empno=? AND ... ;
//取得预编译对象
pst=conn.prepareStatement(sql);
String[] strs = sql.split("SET")[1].split("WHERE")[0].split(",");
int i=0;
for(i=0;i<strs.length;i++) {
//取得要修改的字段名称
String column=strs[i].split("=")[0];
//通过反射取得column对应在vo中的属性对象(就是拿vo的变量,比如ename)
Field f = vo.getClass().getDeclaredField(column.trim());
// 取消私有封装访问限制
f.setAccessible(true);
//取得该字段在vo对象中的值
Object fvalue=f.get(vo);
//为占位符设置具体的内容
pst.setObject(i+1, fvalue);
}
String coditions = sql.split("WHERE")[1].split("=")[0];
Field f = vo.getClass().getDeclaredField(coditions.trim());
f.setAccessible(true);
Object fvalue=f.get(vo);
pst.setObject(i+1, fvalue);
return pst.executeUpdate();
}
/**
*
* @param conn
* @param sql
* @param id
* @return
* @throws Exception
*/
public int removeById(Connection conn,String sql,Object id) throws Exception{
//取得预编译对象
pst=conn.prepareStatement(sql);
pst.setObject(1, id);
return pst.executeUpdate();
}
/**
*
* @param conn
* @param sql
* @param ids
* @return
* @throws Exception
*/
public int removeBatch(Connection conn,StringBuffer sql,List<Object> ids) throws Exception{
Iterator<Object> iter=ids.iterator();
while (iter.hasNext()) {
sql.append(iter.next()+",");
}
sql.delete(sql.length()-1, sql.length());
sql.append(")");
pst=conn.prepareStatement(sql.toString());
return pst.executeUpdate();
}
/**
*
* @param conn
* @param sql
* @param clz
* @param id
* @return
* @throws Exception
*/
public <T> T selectOne(Connection conn,String sql,Class<T> clz,Object id) throws Exception{
//取得预编译对象
pst=conn.prepareStatement(sql);
pst.setObject(1, id);
//执行sql语句
rst=pst.executeQuery();
T t=null;
if (rst.next()) {
t=clz.newInstance();
//取得所有属性
Field[] fs = clz.getDeclaredFields();
for (Field f : fs) {
//为属性取消私有封装
f.setAccessible(true);
//取得属性名
String fname=f.getName();
//使用该属性名称从结果集中取得数据
Object fvalue=rst.getObject(fname);
//将取得的值保存t对象的属性
f.set(t, fvalue);
}
return t;
}
return null;
}
/**
*
* @param conn
* @param sql
* @param clz
* @param params
* @return
* @throws Exception
*/
public <T> List<T> selectList(Connection conn,String sql,Class<T> clz,Object...params) throws Exception{
List<T> list= new ArrayList<T>();
pst=conn.prepareStatement(sql);
for(int i=0;i<params.length;i++) {
pst.setObject(i+1, params[i]);
}
//执行sql语句
rst=pst.executeQuery();
T t=null;
while (rst.next()) {
t=clz.newInstance();
//取得所属性
Field[] fs = clz.getDeclaredFields();
for (Field f : fs) {
//为属性取消私有封装
f.setAccessible(true);
//取得属性名
String fname = f.getName();
//使用该属性名称从结果集中取得数据
Object fvalue=rst.getObject(fname);
//将取得的值保存给t对象的属性
f.set(t, fvalue);
}
list.add(t);
}
return list;
}
/**
*
* @param conn
* @param sql
* @param params
* @return
* @throws Exception
*/
public int selectCount(Connection conn,String sql,Object...params) throws Exception{
pst=conn.prepareStatement(sql);
for(int i=0;i<params.length;i++) {
pst.setObject(i+1, params[i]);
}
//执行sql语句
rst=pst.executeQuery();
rst.next();//让指针往下移动
return rst.getInt(1);
}
}
DAO层基础设计原理的更多相关文章
- Java SE 之 DAO层接口设计思想
用图说话 好处 1.只需要定义好IBaseDao的接口方法,并只需要实现BaseDaoImpl的方法,而具体的业务类和业务类/接口的方法的基本方法(IBaseDao已定义的)并不需要再考虑实现. 2. ...
- Hibernate的Dao层通用设计
hibernate作为一款优秀的数据库持久化框架,在现实的运用中是非常广泛的.它的出现让不熟悉sql语法的程序员能开发数据库连接层成为一种可能,但是理想与现实永远是有差距的.开发过程中如果只使用hql ...
- DAO层设计Junit测试
DAO层的设计: 在实际的开发中有一种项目的程序组织架构方案叫做MVC模式. MVC模式就是按照程序的功能将它们分成三层,分别是Modle层 (模型层).View(显示层).Controller(控制 ...
- [原创]java WEB学习笔记21:MVC案例完整实践(part 2)---DAO层设计
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Mybatis系列全解(七):全息视角看Dao层两种实现方式之传统方式与代理方式
封面:洛小汐 作者:潘潘 一直以来 他们都说为了生活 便追求所谓成功 顶级薪水.名牌包包 还有学区房 · 不过 总有人丢了生活 仍一无所获 · 我比较随遇而安 有些事懒得明白 平日里问心无愧 感兴趣的 ...
- DAO层,Service层,Controller层、View层 的分工合作
DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...
- [转]DAO层,Service层,Controller层、View层
来自:http://jonsion.javaeye.com/blog/592335 DAO层 DAO 层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DA ...
- 简单数据库开发之dao层开发
数据库 dao层是用来与底层数据库连接的一系列代码,它因上层service层调用而调用底层数据库,因为一般的数据库不会只存在一到几张表格,所以必须定义出dao层的接口协议,方便各种表格的操作. dao ...
- Java高并发秒杀API之业务分析与DAO层
根据慕课网上关于java高并发秒杀API的课程讲解用maven+ssm+redis实现的一个秒杀系统 参考了codingXiaxw's blog,很详细:http://codingxiaxw.cn/2 ...
随机推荐
- 洛谷P3209 [HNOI2010]PLANAR(2-SAT)
题目描述 若能将无向图G=(V,E)画在平面上使得任意两条无重合顶点的边不相交,则称G是平面图.判定一个图是否为平面图的问题是图论中的一个重要问题.现在假设你要判定的是一类特殊的图,图中存在一个包含所 ...
- 开发Spring过程中几个常见异常(一)
异常一:java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory 原因:未导入有关日志管理的jar包或者未添加到路径. ...
- Javascript 对象 - 数学对象
数学对象 JavaScript中提供了math对象,math对象包含一些常用的属相和方法.Math对象与Array对象.String对象.Data对象不同,没有构造函数,因此不能创建Math对象.可直 ...
- 小技巧:在线生成按钮Shape的网站
AndroidButton Make 右侧设置按钮的属性,可以即时看到效果,并即时生成对应的.xml 代码,非常高效(当然熟练的话 自己手写代码更快)
- Codeup
问题 I: 习题5-10 分数序列求和 时间限制: 1 Sec 内存限制: 12 MB提交: 611 解决: 537[提交][状态][讨论版][命题人:外部导入] 题目描述 有如下分数序列 求出次 ...
- 性能优化1--UI优化
1.使用系统为我们提供了几个抽象的标签 ①include:重用 include中layout属性指定一个外部布局文件,通过该方式则不需要把这个布局文件在该代码中重复的写一遍了. 若include指定了 ...
- SSL与TLS 区别 以及介绍
SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层.SSL通过互相认证.使用数字签名确保完整性.使用加密确保私密性,以实现客户 ...
- <1>Linux日志查找方法
Linux日志查找方法 适用于测试,开发,运维人员,用来查找Linux服务器问题的一般方法,比较实用,如果有更好的办法可以一块讨论,欢迎大神们来指导哈!!! 进入正题 第一步.通过Xshell登录服务 ...
- c/c++ const关键字
const 在星号的右边:不可以改指针的指向,可以用指针改里面的值 int * const p; const在星号的左边:可以改指针的指向,不可以用指针改里面的值 int const *p; cons ...
- AI学习---数据IO操作&神经网络基础
数据IO操作 TF支持3种文件读取: 1.直接把数据保存到变量中 2.占位符配合feed_dict使用 3. QueueRunner(TF中特有的) 文件读取流程 文件读取流程(多线 ...