在实际的开发中有一种项目的程序组织架构方案叫做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);
}
}