3. 基础功能

3.1. 设计BaseDao接口与BaseDaoImpl类

每个实体都应有一个对应的Dao,他封装了对这个实体的数据库操作。例

实体Dao接口实现类

========================================================

User--> UserDao--> UserDaoImpl

Role--> RoleDao--> RoleDaoImpl

Department--> DepartmentDao--> DepartmentDaoImpl

Article--> ArticleDao--> ArticleDaoImpl

...

设计Dao接口(抽取接口的公共方法)

BaseDao.java----把每个dao都需要的方法放到这里,好让他们继承

public interface BaseDao<T> {
void save(T entity);
/**
* 保存实体
* @param id
*/
void delete (Long id);
/**
* 删除实体
* @param entity
*/
void update(T entity);
/**
* 更新实体
* @param id
* @return
*/
T getById(Long id);
/**
* 按id查询
* @return
*/
List<T> getByIds(Long[] id);
/**
* 按id查询
* @return
*/
List<T> findAll();
/**
* 查询所有
*/
}

UserDao.java----一些公用的方法继承BaseDao即可

public interface UserDao extends BaseDao<User>{
//自己有的特殊方法写在自己这里面
}

RoleDao.java

public interface RoleDao extends BaseDao<Role>{

}

增删改查等共有方法都有了

设计Dao实现类(抽取实现类的公共方法)

//实现RoleDao,实现所有未实现的方法
public class RoleDaoImpl implements RoleDao{ public void save(Role entity) {
} public void delete(Long id) {
} public void update(Role entity) {
} public Role getById(Long id) {
return null;
} public List<Role> getByIds(Long[] id) {
return null;
} public List<Role> findAll() {
return null;
}
}
public class UserDaoImpl implements RoleDao{

    public void save(Role entity) {
} public void delete(Long id) {
} public void update(Role entity) {
} public Role getById(Long id) {
return null;
} public List<Role> getByIds(Long[] id) {
return null;
} public List<Role> findAll() {
return null;
}
}

public class BaseDaoImpl<T> implements BaseDao<T> {

    public void save(T entity) {
} public void delete(Long id) {
} public void update(T entity) {
} public T getById(Long id) {
return null;
} public List<T> getByIds(Long[] id) {
return null;
} public List<T> findAll() {
return null;
}
}
public class RoleDaoImpl extends BaseDaoImpl<Role> implements RoleDao{
}
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{

}

可以看出这两个实现类的很多方法都重复了,我们把它抽取出来,我们写一个类它事先实现了里面的公共方法,让这两个实现类继承即可。

BaseDaoImpl里方法是有了,但里面还没有内容,接下来写该实现类里面的方法内容

@SuppressWarnings("unchecked")
public abstract class BaseDaoImpl<T> implements BaseDao<T> { @Resource
private SessionFactory sessionFactory;// 通过注入得到SessionFactory,要把它放到容器里才能注入,在具体的实现类上声明@Repository private Class<T> clazz; public BaseDaoImpl() {
//使用反射技术得到T的真实类型
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();//获取当前new类型的泛型的父类类型
this.clazz = (Class<T>) pt.getActualTypeArguments()[0];//获取第一个类型参数的真实类型,只有一个泛型参数,所以写0
System.out.println("clazz--->" + clazz);
} /**
* 获取当前可用的session对象,用protected修饰方便子类得到session
*/
protected Session getSession() {
return sessionFactory.getCurrentSession();
} public void save(T entity) {
// 不需要自己关事务了,spring框架已经帮我们做了,我们用它的事务管理
getSession().save(entity);
} public void update(T entity) {
getSession().update(entity);
} public void delete(Long id) {
Object obj = getById(id);
if (obj != null) {
getSession().delete(obj);
}
} public T getById(Long id) {
return (T) getSession().get(clazz, id);
} public List<T> getByIds(Long[] ids) {
return getSession().createQuery(//
"FROM User WHERE id=IN(:ids)")//
.setParameter("", ids)
.list();
} public List<T> findAll() {
return getSession().createQuery(//
"FROM " + clazz.getSimpleName())//
.list();
}
}

说明:

4, 实体的Dao接口要继承BaseDao接口。

5, Dao的实现类要继承DaoImplBase类。

6, 也可以不继承指定的接口或类,这样就要自己写相应的方法。

7, T getById(Long id)与List<T> getByIdList(Long[] idList)不要合并为List getById(Long... ids),因为获取一个对象时也是返回List,不方便。

获取 BaseDao的类型参数T的Class

问题:

1, 有了DaoBase与DaoImplBase,还要用UserDao、RoleDao吗?

答:要用。因为UserDao或RoleDao中的方法可以分为有公有的方法与特有的方法两部分。公有的方法是通过继承BaseDao得到的,特有的方法要写在自己里面(BaseDao中是没有的)。

2, UserDaoImpl已经继承了BaseDaoImpl,就不实现UserDao可以吗?

答:不可以。否则UserDao userDao = new UserDaoImpl(); 就不成立。

使用反射获取类型参数的真实类型的代码如下:

public DaoBaseImpl () {

  Type type = this.getClass().getGenericSuperclass();

  ParameterizedType pt = (ParameterizedType) type;

  this.clazz = (Class<T>) pt.getActualTypeArguments()[0];

}

说明:

1, 使用Session时,不要自己创建,也不要管理事务,直接调用getSession()即可。

2, 暂时不实现getSession()方法,在后面的事务管理中实现:
protected Session getSession(){
    throw new UnsupportedOperationException();
}

ItcastOA_设计BaseDao_设计DAO接口和实现类_写DAO实现类中的方法内容的更多相关文章

  1. 【面向对象设计原则】之接口隔离原则(ISP)

    接口隔离原则(Interface  Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 从接口隔离原则的定义可以看 ...

  2. 我对面向对象设计的理解——Java接口和Java抽象类

    在没有好好地研习面向对象设计的设计模式之前,我对Java接口和Java抽象类的认识还是很模糊,很不可理解. 刚学Java语言时,就很难理解为什么要有接口这个概念,虽说是可以实现所谓的多继承,可一个只有 ...

  3. 面象对象设计原则之四:接口隔离原则(The Interface Segregation Principle,ISP)

    接口隔离原则定义如下: 接口隔离原则(Interface  Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 根 ...

  4. 使用JWT设计SpringBoot项目api接口安全服务

    转载直: 使用JWT设计SpringBoot项目api接口安全服务

  5. 为何有DAO与Service层?为何先搞Dao接口在搞DaoImpl实现?直接用不行吗?

    转自 http://blog.sina.com.cn/s/blog_4b1452dd0102wvox.html 我们都知道有了Hibernate后,单独对数据的POJO封装以及XML文件要耗损掉一个类 ...

  6. 重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 难以跨越的瓶颈期,把你拿捏滴死死的! 编程开发学习过程中遇到的瓶颈期,往往是由于看不 ...

  7. 好的框架需要好的 API 设计 —— API 设计的六个原则

    说到框架设计,打心底都会觉得很大很宽泛,而 API 设计是框架设计中的重要组成部分.相比于有很多大佬都认可的面向对象的六大原则.23 种常见的设计模式来说,API 设计确实缺少行业公认的原则或者说设计 ...

  8. Java生鲜电商平台-商品基础业务架构设计-商品设计

    Java生鲜电商平台-商品基础业务架构设计-商品设计 在生鲜电商的商品中心,在电子商务公司一般是后台管理商品的地方.在前端而言,是商家为了展示商品信息给用户的地方,它是承担了商品的数据,订单,营销活动 ...

  9. Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

    #29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类T ...

随机推荐

  1. Ubuntu桌面操作快捷键

    Ubuntu操作基本快捷键 * 打开主菜单 = Alt + F1 * 运行 = Alt + F2 * 打开终端 = Alt+F2 然后输入gnome-terminal回车 * 显示桌面 = Ctrl ...

  2. AI的分支学科

    AI 的分支学科 [References]AAI(Advanced Artificial Intelligence)

  3. mosquitto --- 单向认证

    1.生成证书要单向配置SSL 需要 做三项前置工作 1. 生成CA证书 2.生成server 端证书,server 端key github 的一个开源项目已经做到这点 ,详情可见 https://gi ...

  4. java遍历实体类的属性和数据类型以及属性值

    遍历实体类的树形和数据类型一级属性值 /** * 遍历实体类的属性和数据类型以及属性值 * @param model * @throws NoSuchMethodException * @throws ...

  5. 没有msdtc服务的解决方法(sql server分布式事务挂掉的解决方法)

    没有msdtc服务的解决方法如下:1.删除注册表中的键:  开始 运行 regedit  打开注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servic ...

  6. Web Socket rfc6455 握手 (C++)

    std::string data((const char*)buf->data(),bytes_transferred); recycle_buffer(buf); std::string ke ...

  7. 0059 Spring MVC与浏览器间的JSON数据转换--@RequestBody--@ResponseBody--MappingJacson2HttpMessageConverter

    浏览器与服务器之间的数据交换有很多类型,不只是表单提交数据这一种,比如ajax技术就大量使用json.xml等,这时候就涉及到浏览器端和服务器端数据格式转换的问题,服务器端都是Java对象,需要把请求 ...

  8. 解决在eclipse中配置Tomcat时,出现"Cannot create a server using the selected type"的错误

    比如说使用tomcat 这是因为你之前创建过一次,比如说tomcat6,你指定的目录是:D:/tomcat-6.0.3 后来因为某种原因你把tomcat删了,然后你又安装到了E:/tomcat-6.0 ...

  9. vuex 开始

    每一个vuex的应用的核心都是store(仓库),store基本上就是一个容器,它包含着你的应用中大部分的状态(state),vuex和单纯的全局对象有以下两点不同: 1,vuex的状态存储是响应式的 ...

  10. array2json

    原文:jQuery方法扩展:type, toJSON, evalJSON. http://zhkac.iteye.com/blog/499330 .2013-05-19 (function($) { ...