通用持久层如何设计

夕阳游子 夕阳游子     2022-10-13     742

关键词:

设计通用持久层的好处

多个类相同的操作数据库方法可以用一个类来解决,如:基本的增删改查等操作。

1.通用持久层如何设计,基于泛型和反射

1.1通用持久层,意味着多个实体类都可以用的持久层,那么我们只能用泛型来定义数据类型

1.2泛型来定义数据类型,我们需要通过传递过来的泛型创建出我们正真的实体对象,这时反射就出场了。

2.案例

(1) IBaseDao<T>就是一个通用的持久层,BaseDaoImpl<T>就是一个通用持久层的实现。

(2) IUserDao就是专门针对UserDaoImpl操作的接口

(3) UserDaoImpl继承BaseDaoImpl类和实现IUserDao接口的好处是,都是IBaseDao<T>的子类,在IUserDao里面基本的增删改查,已经在BaseDaoImpl里面有实现,简化了开发过程中代码的书写。

通用接口的编码案例:

 

 1 /**
 2  * 抽取持久层通用方法
 3  * @param <T>
 4  */
 5 public interface IBaseDao<T> {
 6     public void save(T entity);
 7     public void delete(T entity);
 8     public void update(T entity);
 9     public T findById(Serializable id);
10     public List<T> findAll();
11 }
12 通用实现:
13 /**
14  * 持久层通用实现
15  *
16  */
17 public class BaseDaoImpl<T> extends HibernateDaoSupport implements IBaseDao<T>{
18     //实体类型
19     private Class<T> entityClass;
20     //使用注解方式进行依赖注入
21     @Resource
22     public void setMySessionFactory(SessionFactory sessionFactory){
23         super.setSessionFactory(sessionFactory);
24     }
25     
26     /**
27      * 在构造方法中动态获得操作的实体类型
28      */
29     public BaseDaoImpl() {
30         //获得父类(BaseDaoImpl<T>)类型,需要好好理解
31         ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGenericSuperclass();
32         //获得父类上的泛型数组,这个是在子类中传递进来的。
33         Type[] actualTypeArguments = genericSuperclass.getActualTypeArguments();
34         entityClass = (Class<T>) actualTypeArguments[0];//获取第一个数据类型
35     }
36     
37     public void save(T entity) {
38         this.getHibernateTemplate().save(entity);
39     }
40 
41     public void delete(T entity) {
42         this.getHibernateTemplate().delete(entity);
43     }
44 
45     public void update(T entity) {
46         this.getHibernateTemplate().update(entity);
47     }
48 
49     public T findById(Serializable id) {
50         return this.getHibernateTemplate().get(entityClass, id);
51     }
52 
53     public List<T> findAll() {//FROM User
54         String hql = "FROM  " + entityClass.getSimpleName();
55         return this.getHibernateTemplate().find(hql);
56     }
57 }

 

三层架构设计理念

1、持久层:完成内存数据和磁盘数据的转换,设计原则,一个实体类,一个持久接口,一次数据库操作,一个持久方法2、业务层:完成业务处理,将表现层提供数据处理后,交由持久层完成数据的保存,设计原则,一个实体类... 查看详情

自定义持久层框架设计实现思路(代码片段)

传统的jdbc代码:packagecom;importjava.sql.*;/***@authorliuyj*@Title:JdbcTest*@create2020-05-2717:31*@ProjectNamealgorithm-Exercise*@Description:TODO*/publicclassJdbcTestpublicstaticvoidmain(String[]args)C 查看详情

三层架构

三层架构分为持久层,业务层,表现层;其中持久层主要完成内存数据与磁盘数据的转换,采用DAO模式,建立实体类和数据库表映射,持久层设计原则是一个实体类一个持久接口,一次数据库操作一个实体方法;业务层主要完成... 查看详情

spring中的dao的用处?

...中,业务组件通常使用JDBCAPI访问和改变关系数据库中的持久化数据。这样经常导致将持久化代码和业务逻辑混合在一起---abadidea.DataAccessObject(DAO)设计模式通过把持久化逻辑分离到数据访问类中从而解决了这个问题。本篇文章有... 查看详情

ssm框架目录结构详解

...到已定义的DAO层的接口,封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性,程序显得非常简洁。表现层:Controller层(Handler层)Controller层:Controller层负责具体的业务模块流程的控制, 在此层里面要调用Ser... 查看详情

day382.持久层整合-spring5(代码片段)

持久层整合一、持久层整合1.Spring框架为什么要与持久层技术进⾏整合JavaEE开发需要持久层进⾏数据库的访问操作。JDBCHibernateMyBatis进⾏持久开发过程存在⼤量的代码冗余Spring基于模板设计模式对于上述的持久层技术进⾏了封装2.... 查看详情

JDBC持久层? [关闭]

】JDBC持久层?[关闭]【英文标题】:JDBCpersistencelayer?[closed]【发布时间】:2012-07-2406:43:44【问题描述】:我环顾四周,找不到任何好的示例或方法来制作JDBC持久层。我会使用框架,但我没有时间修复错误等。那么,我应该如何在... 查看详情

hibernate小章总结

...一种Java语言下的对象关系映射解决方案。它是使用GNU宽通用公共许可证发行的自由、开源的软件。它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。Hibernate也是目前Java开发中最为流行的数据... 查看详情

持久层框架jpa与mybatis该如何选型

一、现状描述目前java持久层ORM框架应用最广泛的就是JPA和Mybatis。JPA只是一个ORM框架的规范,对该规范的实现比较完整就是SpringDataJPA(底层基于Hibernate实现),是基于Spring的数据持久层框架,也就是说它只能用在Spring环境内。Mybat... 查看详情

深入浅出hibernate1-持久层概述

1.持久层概述持久的概念理解容易,层说明了需要解耦合,2.持久层设计  2.1解耦合 解耦合的演变过程过程1.完成一个功能时在action中完成1.连接,statement,statement设值,获取resultset 这个阶段持久化的代码嵌套在业... 查看详情

如何使用 ZIO(具有持久层)创建具有“传统”接口的小型库

】如何使用ZIO(具有持久层)创建具有“传统”接口的小型库【英文标题】:Howtocreateasmalllibrarywitha"legacy"interfaceusingZIO(havingpersistentlayers)【发布时间】:2021-07-0305:14:04【问题描述】:我们希望创建一个具有基于未来接口... 查看详情

mybatis第一章

学习过的持久层框架:DBUtils,Hibernate Mybatis就是类似于hibernate的orm持久层框架。 为什么学Mybatis?目前最主流的持久层框架为hibernate与mybatis,而且国内目前情况使用Mybatis的公司比hibernate要多。Hibernate学习门槛不低,要精通... 查看详情

spring持久层框架的使用中遇到的一些问题解决方案汇总

1、解决Mybatis有查询结果,但存不进实体类的问题(通用Mapper也是一样的) 查看详情

数据访问层应该如何构建?

...的是,我没有使用NHibernate)。基本思想是,对于需要与持久层通信的每个域对象,您将在不同的库中拥有相应的数据访问对象。每个数据访问对象都实现一个 查看详情

如何在 C++ 中实现强大的数据持久层?

】如何在C++中实现强大的数据持久层?【英文标题】:HowdoIimplementarobustDataPersistenceLayerinC++?【发布时间】:2016-07-2506:51:56【问题描述】:我第一次用C++为我的公司创建一个巨大的程序,我想创建一个很好的模式来连接到我的MySql... 查看详情

不是吧,都2022年了你别说你还不会springmvc基本应用(代码片段)

...,系统标准的三层架构包括:表现层、业务层、持久层。三层架构在我们的实际开发中使用得非常多,接下来我们详细了解下这三层架构。表现层:也就是我们常说的web层。它负责接收客户端请求,向客户端... 查看详情

javawebmybatis

...久层3.框架框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型在框架的基础之上构建软件编写更加高效、规范、通用、可扩展二.MyBatis简化1.JDBC缺点1.硬编码注册驱动,获取连接SQL语句2.操作繁琐手动设置参... 查看详情

javacruddao持久性设计(代码片段)

...持久性可能都是JsonORXml所以我这样实现它:我创建了一个通用DAO:publicinterfaceGenericDao<T>publicbooleanadd(Ttype);publicbooleanchange(Ttyp 查看详情