1,设计 BaseDao 与 BaseDaoImpl
1,设计接口 BaseDao
1,每个实体都应有一个对应的Dao接口,封装了对这个实体的数据库操作。例
实体 Dao接口 实现类
========================================================
User --> UserDao --> UserDaoImpl
Role --> RoleDao --> RoleDaoImpl
Department --> DepartmentDao --> DepartmentDaoImpl
Article --> ArticleDao --> ArticleDaoImpl
...
2,在每个Dao接口中都应有一个基本的增删改查的方法,
但每个Dao接口中都写一遍就是重复的代码,可以把这些方法抽取到一个父接口中,定义为:
public interface BaseDao<T> {
save(entity : T) : void
delete(id : Serializable) : void
update(entity : T) :void
getById(id : Serializable) : T
getByIds(ids : Serializable[]) : List<T>
findAll() : List<T>
}
3,说明:
1,使用泛型的技术,可以在使用时更方便,如:User user = userDao.getById(1L); // 不需要强制转型
2,getById(id : Long) 与 getByIds(ids : Long[]) 不要合并为一个有可变参数的方法,
因为那个用起来就不方便了,比如要经常使用的根据一个id获取一个对象时就很不方便:
List<User> list = userDao.getByIds(1L); User user = list.size() > 0 ? list.get(0) : null。
3,以后再有Dao接口就可以继承这个 BaseDao,以拥有基本的增删改查方法,如:
UserDao extends BaseDao<User>
RoleDao extends BaseDao<Role>
2,设计实现类 BaseDaoImpl
1,每个Dao的接口还要有相应的实现类才可以,在每个DaoImpl中都要实现Dao接口中定义的所有方法,
当然也包括公共的增删改查方法(BaseDao中定义的6个基本方法)。
2,每个DaoImpl中都实现一遍公共方法显然是重复的,所以也可以抽取出来为一个父类BaseDaoImpl,
在BaseDaoImpl中实现了BaseDao接口的所有方法,我们的DaoImpl只需要继承他就可以不用重复的写公共方法的实现了。
声明如下:
public class BaseDaoImpl<T> implements BaseDao<T> {
@Resource private SessionFactory sessionFactory; // 让Spring注入sessionFactory
private Class<T> clazz; // 要想办法得到T的Class
public void save(T entity) { }
public void delete(Long id) { }
public void update(T entity) { }
public T getById(Long id) { }
public List<T> getByIds(Long[] ids) { }
public List<T> findAll() { }
}
在实现方法时,获取Session的代码为:sessionFactory.getCurrentSession()
3,在获取clazz时有两种方法
1,方法一:
1,把clazz声明成protected修饰符的,这样子类中就可以访问了,
2,在每个子类的构造方法中传递这个属性的值,如:
public RoleDaoImpl() { clazz = Role.class; }
public UserDaoImpl() { clazz = User.class; }
2,方法二:使用反射的方式:
1,在BaseDaoImpl的默认构造方法中写如下代码就可以了:
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
clazz = (Class) pt.getActualTypeArguments()[0];
2,说明:BaseDaoImpl不能直接使用,只能使用他的子类,否则这段代码就无效了。
1,设计实体/表
设计实体 --> JavaBean --> hbm.xml --> 建表
2,分析有几个功能,对应几个请求。
3,实现功能:
1,写Action类,写Action中的方法,确定Service中的方法。
2,写Service方法,确定Dao中的方法。
3,写Dao方法。
4,写JSP
============================
请求数量 地址栏
转发 1 不变
重定向 2 变化
增删改查共4个功能,需要6个请求。
所以需要相应的6个Action方法,每个Action方法处理一种请求。
作用 方法名 返回值 对应的页面
----------------------------------------------------
列表 list() list list.jsp
删除 delete() toList
添加页面 addUI() addUI addUI.jsp
添加 add() toList
修改页面 editUI() editUI editUI.jsp
修改 edit() toList
<result name="toList" type="redirectAction">role_list</result>
--------------------------------------------------------------------------------------------------------
笔记:
设计公共接口及其实现类
公共接口中有公共方法(增删改查),使用泛型,不指定类型
实现类implements公共接口,实现公共接口中的方法增删改查(class BaseDaoImpl<T> implements BaseDao<T>)
设计实体/表
设计实体 --> JavaBean --> hbm.xml ---> 建表
分析有几个功能,对应几个请求。
实现功能:
1,写Action类,写Action中的方法,确定Service中的方法。
2,写Service方法,确定Dao中的方法。
3,写Dao方法。
4,写JSP
将对象放到值栈的map中(jsp中用#获取值):ActionContext.getContext().put("roleList", roleList);
添加信息方法:
//1,封装到对象中
Role role=new Role();
role.setName(model.getName());
role.setDescription(model.getDescription());
//2,保存到数据库
roleService.save(role); //或直接保存
return "toList";
编辑信息页面保存方法:
将对象保存到对象栈中:ActionContext.getContext().getValueStack().push(role);
获取栈对象:
public Role getModel(){
return model;
}
- OA项目笔记
一.创建项目构架 1.创建一个Maven的web工程 1.1修改编译器版本 <properties> <project.build.sourceEncoding>UTF-8&l ...
- ASP.Net MVC OA项目笔记<六>
1.1.1 开始写业务,先写业务的实现再写业务的接口 业务类中也是有写增删改查公用的方法 引用Model,IDAL,DALFactory BLL添加两个类 UserInfoService,BaseSe ...
- ASP.Net MVC OA项目笔记<五>
1.1.1 抽象工厂封装数据操作类实例创建,然后DBSession调用抽象工厂,修改DBSession CZBK.ItcastOA.DALFactory数据会话层调数据层不能直接new,要封装一下解 ...
- ASP.Net MVC OA项目笔记<二>
1.1.0 创建数据层 1.1.1 CZBK.ItcastOA.IDAL 引用 CZBK.ItcastOA.Model 1.2.1 给IDAL添加一个接口IUserInfoDal 里面写增删改查分页的 ...
- ASP.Net MVC OA项目笔记<四>
1.1.1 EF线程唯一 在数据层中用到了EF的实例,在数据会话层也用到了,所以在一个请求中只能创建一个EF实例(线程内唯一对象),把它封装成工厂类 1.1.2 为了防止相互引用,循环引用,所以这个工 ...
- ASP.Net MVC OA项目笔记<三>
1.1.1 业务层和数据层之间加一个数据会话层,封装所有数据操作类实例的创建(工厂类) 工厂类是负责对象的创建 作用:将BLL和DAL解耦了,提供一个数据访问的统一访问点 数据会话层DBSession ...
- ASP.Net MVC OA项目笔记<一>
1.1.1 新建空白解决方案CZBK.ItcastOA 1.2.1 添加类库 1.2.2 同上添加多个类库 生成的 class1.cs先不用删除,删了的后,后面可能没办法直接点引用 1.3.1 添加表 ...
- 05传智_jbpm与OA项目_部门模块中增加部门的jsp页面增加一个在线编辑器功能
这篇文章讲的是在线编辑器功能,之前的部门模块中,增加部门的功能jsp页面起先是这么做的.
- Django商城项目笔记No.10用户部分-登录接口
Django商城项目笔记No.10用户部分-登录接口 添加url路由 接下来第二步,增加返回内容: 增加结果如下: 配置:上边的方法定义了返回的内容都有哪些,那这个方法jwt还不知道,需要配置: 修改 ...
随机推荐
- 实验一、熟悉DOS命令
实验一.熟悉DOS命令 实验一.熟悉DOS命令 一. 实验目的 1.从操作系统理论的观点来了解和掌握DOS有关用户接口的特点: 2.熟悉常用DOS操作命令(md.cd.rd.copy.m ...
- C++/java之间的Socket通信大小端注意事项
在一个物联往项目中,需要java云平台与一个客户端做socket定制协议的通信:然而在第一次测试时,并没有按照预想的那样完成解析.查找资料以后是因为客户端的数据读取方式为小端模式,而java默认采用大 ...
- PHP实现文本快速查找 - 二分查找
PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...
- 在ubuntu14.04 64位虚拟机中安装mysql
因为在win10 系统上手贱的将mysql卸载掉了之后有个插件一直无法正常删除导致只能将mysql装到ubuntu虚拟机上, 宝宝心里都是累啊,所以记录下来自己的安装过程2333 命令行操作: &qu ...
- 更新记录后关闭子窗口并刷新父窗口的Javascript
有时我们需要在新打开的窗口里面编辑信息,等编辑完了,需要将当前窗口关闭并且刷新父窗口,以使修改生效,本文就是介绍用 javascript 来实现"更新记录后关闭子窗口并刷新父窗口" ...
- [.NET] 自己实现任务池(模仿线程池)
线程池虽然好用,但限制也不少: (1)总觉得默认的 MaxThread 小了一点,每次使用都要手工调大= = (2)任务不能等待完成 (3)任务一旦加入不能取消,甚至不知道是正在排队/正在执行/执行完 ...
- Ruby的基本语法-数组
Ruby中数组的实例 1.color=["Red", "Green" ,"Blue"] #数组赋值
- SELF, self in CORE DATA
Predicate SELF Represents the object being evaluated. CORE DATA Retrieving Specific Objects If your ...
- ReportViewer中修改rdlc图表中显示的数据
将rdlc以xml的格式打开,修改里面的数据,实现方式如下: public MemoryStream GenerateRdlc() { XmlDocument xmlDoc = new XmlD ...
- MSSQL—行转列
行转列,是SQL中经常会遇到的一个问题,并且分为静态转换和动态转换,所谓静态转换即在转换的行数已知或固定:动态转换则为转换的行数不固定. 转换的方法一般采用case when语句或pivot(MSSQ ...