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. cordova build android get Execution failed for task ':dexArmv7Debug'

    本篇文章由:http://xinpure.com/cordova-build-android-get-execution-failed-for-task-dexarmv7debug/ XGPush 腾 ...

  2. LaTex 常见错误及解决办法

    出现错误: Multirow 要用库的  导入\usepackage{multirow} ,,即可

  3. List、Set、Map常见集合遍历总结

    Java中的集合有三大类,List.Set.Map,都处于java.util包中,List.Set和Map都是接口,不能被实例化,它们的各自的实现类可以被实例化.List的实现类主要有ArrayLis ...

  4. Python 爬虫实例(2)—— 爬取今日头条

    # coding:utf-8 import base64 import random, re import sqlite3 import redis, pickle import json, time ...

  5. linux实现ssh免密码登录

    linux实现ssh免密码登录 本地系统执行 ssh-keygen -t rsa 命令,生成密钥文件 在相应的目录下查看生成的密钥文件,其中:id_rsa为私钥文件,id_rsa.pub为公钥文件 本 ...

  6. unity, water cube

    <纪念碑谷>里有一关开始是一个宝箱展开后里面有一个water cube,其中还有小鱼在游.如下截图: 因为我们知道<纪念碑谷>是unity做的,而现在正开始学unity,所以也 ...

  7. POJ3187 Backward Digit Sums 【暴搜】

    Backward Digit Sums Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4487   Accepted: 25 ...

  8. Android 依赖注入: Dagger 2 实例解说(一)

    本文原创,转载请注明出处:http://blog.csdn.net/zjbpku [Duplicated]   link to  Dagger on Android - Dagger2具体解释 关于D ...

  9. Netty的ByteBuf

    https://blog.csdn.net/thinking_fioa/article/details/80795673  netty的ByteBuf知识点

  10. Git Manual / Git使用手册 / Git, GitLab, Git Bash, TortoiseGit (建议全文复制到Word文档中通过导航窗格查看)

    Git使用手册 目录 1     引言 2     Git.GitLab简介 2.1      Git 2.2      GitLab 2.3      Git基本概念 3     运行环境 4    ...