前言
嗨咯,又见面了,今天带来的分享是三层框架,今日的内容讲的是为什么需要分层,和怎么实现分层
提示:以下是本篇文章正文内容,下面案例可供参考
一、为什么需要分层?
由于业务处理的代码与jsp代码混在一起,不易于阅读,不易代码维护,所以我们需要分层
二、软件设计中的分层模式
1.分层模式
- 分层模式是最常见的一种架构模式
- 是很多架构模式的基础
2.分层
- 将解决方案的组件分隔到不同的层中
- 在同一个层中组件之间保持内聚性
- 层与层之间保持松藕合
三、三层模式的划分
- 表示层
- 业务逻辑层
- 数据库访问层
层与层之间的关系
表示层依赖于业务逻辑层
业务逻辑层依赖于数据访问层
图解:
二、实现分层
第一种方式【接口和实现类放到同一个包中】:
1.编写数据访问层
数据类型访问接口:
public interface IUserDao {
/**
* 查询全部
* @return 用户集合
*/
public List<User>getAll();
/**
* 模糊查询
* @param colName 列名
* @param str 关键字
* @return 用户集合
*/
public List<User>getAll(String colName,String str);
/**
* 根据用户id查询
* @param uuid 编号
* @return 用户对象
*/
public User getUser(int uuid);
/**
* 增加用户
* @param u 用户对象
* @return 影响行数
*/
public int addUser(User u);
/**
* 根据id 删除
* @param uuid 用户编号
* @return 影响行数
*/
public int deleteUser(int uuid);
/**
* 根据 id修改用户
* @param u 用户对象
* @param uuid 用户编号
* @return影响行数
*/
public int updateUser(User u,int uuid);
/**
* 实现用户登录
* @param name 用户名
* @param upwd 密码
* @return 用户
*/
public User login(String name,String upwd);
}
2.数据访问接口的实现:
/**
* 数据库访问层
* @author Administrator
*
*/
public class UserDao implements IUserDao{
private Connection con=null;
private PreparedStatement ps=null;
private ResultSet rs=null;
@Override
public List<User> getAll() {
// TODO Auto-generated method stub
return null;
}
@Override
public List<User> getAll(String colName, String str) {
// TODO Auto-generated method stub
return null;
}
@Override
public User getUser(int uuid) {
// TODO Auto-generated method stub
return null;
}
@Override
public int addUser(User u) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int deleteUser(int uuid) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int updateUser(User u, int uuid) {
// TODO Auto-generated method stub
return 0;
}
@Override
public User login(String name, String upwd) {
User u=null;
try {
con=DBHelper.getCon();//获得连接
String sql="select * from tb_0325 where sname=? and spwd=?";//定义sql语句
ps=con.prepareStatement(sql);//获得执行对象
//给占位符赋值
ps.setString(1, name);
ps.setString(2, upwd);
rs=ps.executeQuery();//获得结果集
//判断
if(rs.next()) {
u=new User();//实例化
u.setUuid(rs.getInt(1));
u.setUname(rs.getString(2));
u.setUpwd(rs.getString(3));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.myClose(con, ps, rs);
}
return u;
}
}
第二种方式【接口和实现类放到不同的包中】:
1. 编写业务逻辑层接口
2.数据访问接口的实现
/**
* 业务逻辑层 B
* @author Administrator
*
*/
public class UserBiz implements IUserBiz {
//业务逻辑层 调用 数据库访问层c
IUserDao iud=new UserDao();//里氏替换原则
@Override
public List<User> getAll() {
// TODO Auto-generated method stub
return iud.getAll();
}
@Override
public List<User> getAll(String colName, String str) {
// TODO Auto-generated method stub
return iud.getAll(colName, str);
}
@Override
public User getUser(int uuid) {
// TODO Auto-generated method stub
return iud.getUser(uuid);
}
@Override
public int addUser(User u) {
// TODO Auto-generated method stub
return iud.addUser(u);
}
@Override
public int deleteUser(int uuid) {
// TODO Auto-generated method stub
return iud.deleteUser(uuid);
}
@Override
public int updateUser(User u, int uuid) {
// TODO Auto-generated method stub
return iud.deleteUser(uuid);
}
@Override
public User login(String name, String upwd) {
// TODO Auto-generated method stub
return iud.login(name, upwd);
}
}
注意:在业务逻辑层中要调用数据访问层,实体类要去实现Serializable接口,是为了防止序列化和反序列化异常
三、调用
//表示层a 调用 业务逻辑层b
IUserBiz iud=new UserBiz();
//调用登录方法
User u=iud.login(name, pwd);
//判断
if(u!=null){
//登录成功
out.print("登录成功");
}
else{
//说明登录失败
out.print("<script>alert('用户名或者密码错误');location.href='login.jsp';</script>");
}
总结
以上就是要讲的内容了,感谢阅读,如有不对的地方,还请告知,我们下次再见吧