一个通用的数据访问层实现类

java商城开发中以及人事系统开发中我们知道会涉及到很多的数据表,如果每一个数据库都按照我们开发人员所定义的那样一个表,一个实现类,然后是一个数据访问层接口,数据访问层实现类,业务逻辑层接口,业务逻辑层实现类...这样写下去,代码量无疑是很大的。

下面我们就介绍一个基本的数据访问层实现类,至于接口的定义,我想只要明白实现类,接口的定义应该很简单。

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

package
cn.com.bochy.crm.dao.impl;

import java.io.Serializable;

import java.sql.SQLException;

import java.util.Iterator;

import java.util.LinkedHashMap;

import java.util.List;

import javax.annotation.Resource;

import
org.apache.commons.lang.StringUtils;

import
org.hibernate.HibernateException;

import
org.hibernate.Query;

import
org.hibernate.Session;

import
org.springframework.orm.hibernate3.HibernateCallback;

import
org.springframework.orm.hibernate3.HibernateTemplate;

import
org.springframework.stereotype.Repository;

import
org.springframework.transaction.annotation.Isolation;

import
org.springframework.transaction.annotation.Propagation;

import
org.springframework.transaction.annotation.Transactional;

import
cn.com.bochy.crm.dao.BaseDao;

import
cn.com.bochy.crm.util.QueryResult;

@SuppressWarnings("rawtypes")

@Transactional(readOnly=true)

@Repository(BaseDao.SERVER_NAME)

public
class BaseDaoImpl implements
BaseDao {

    /*

     * 注入sessionfactory

     * save(Object entity):保存实体

     * update(Object entity):修改实体方法

     *  queryById(Class entity, Serializable id):根据id查询实体

     *

     * (non-Javadoc)

     * @see cn.com.bochy.crm.dao.BaseDao#save(java.lang.Object)

     */

    

    

    @Resource(name="hibernateTemplate")

    private
HibernateTemplate hibernateTemplate;

    

    @Override

    public
Object queryById(Class entity, Serializable id) {

        // TODO Auto-generated method stub

        return
hibernateTemplate.get(entity, id);

    }

    

    @Override

    @Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,readOnly=false)

    public
void save(Object entity) {

        // TODO Auto-generated method stub

        hibernateTemplate.save(entity);

    }

    @Override

    @Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,readOnly=false)

    public
void update(Object entity) {

        // TODO Auto-generated method stub

        hibernateTemplate.update(entity);

    }

    

    

    //删除数据(实体)

    @Override

    @Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,readOnly=false)

    public
void delete(Class entity, Serializable... id) {

        // TODO Auto-generated method stub

        //判断id存在

        if(id.length>0&&id!=null){

            //通过for循环来判断id的实体是否存在,存在删除,不存在抛出异常

            for(Serializable ids:id){

           Object entityclass=hibernateTemplate.load(entity, ids);

           if(entityclass==null){

              throw
new RuntimeException("实体不存在");  

           }

           hibernateTemplate.delete(entityclass);

           }

        }

    }

    

    @Override

    /*

     * 无分页的查询

     * queryListWithNoPage(Class entityClass,String wherehql,Object[] params)

     * String hql="select s from sysusergroup s where 1=1 and s.name like ?"

     * 拼出上面的hql语句需要获得类名,和参数

     * 通过java反射机制获得类名

     */

    public
List queryListWithNoPage(Class entityClass, String wherehql,

             final
Object[] params,LinkedHashMap<String, String> orderby) {

        // TODO Auto-generated method stub

        

        //通过java反射机制获得类名

        String entityName=entityClass.getSimpleName();

        String hql="select s from "+entityName+" s where 1=1";

         if(StringUtils.isNotBlank(wherehql)){//判断wherehql的返回值是不是为空

             hql=hql+wherehql;

         }

         

         //处理map类型的orderby

          String order=getOrderBy(orderby);

         final
String shql=hql+order;

         System.out.println(shql);

         List list=(List)hibernateTemplate.execute(

                 //拟名内部类,在拟名内部类中所有的参数为最终参数

                 new
HibernateCallback() {

            @Override

            public
Object doInHibernate(Session session) throws
HibernateException,

                    SQLException {

                // TODO Auto-generated method stub

                

                Query query=session.createQuery(shql);

                

                setQuery(query,params);

                

                return
query.list();

            }

        });

         

        return
list;

    }

    

    

    

    //放置参数的方法

    protected
void setQuery(Query query, Object[] params) {

        // TODO Auto-generated method stub

        if(params!=null&&params.length>0){

            for(int
i=0;i<params.length;i++){

                query.setParameter(i, params[i]);

            }

        }

    }

    

    protected
String getOrderBy(LinkedHashMap<String, String> orderby) {

        // TODO Auto-generated method stub

         StringBuffer sf=new
StringBuffer(" order by ");

        

        if(orderby!=null&&!orderby.isEmpty()){

            Iterator<String> items=orderby.keySet().iterator();

            if(items.hasNext()){

                String key=items.next();

                String val=orderby.get(key);

                sf.append(key);

                sf.append(" "+val);

                

            }

        }

        String order=sf.toString();

        System.out.println("排序:"+order);

        return
order;

    }

    @Override

    public
QueryResult PageList(Class entityClass, String wherehql,

            Object[] param, LinkedHashMap<String, String> orderby) {

        // TODO Auto-generated method stub

        

        //利用类反射机制获取类名

        String entityName=entityClass.getSimpleName();

        String hql="select s from "+entityName+" s where 1=1";

        String chql="select count(*) from "+entityName+"s where 1=1";

        if(StringUtils.isNotBlank(wherehql)){

            hql=hql+wherehql;

        }

        

        String order=getOrderBy(orderby);

        final
String shql=hql+order;

        

        

        return
null;

    }

    

    

}

  

时间: 2024-08-08 09:29:31

一个通用的数据访问层实现类的相关文章

系统架构师-基础到企业应用架构-数据访问层

一.上章回顾 上篇我们简单讲述了服务层架构模式中的几种,并且讲解了服务层的作用及相关的设计规范,其实我们应该知道,在业务逻辑层中使用领域模型中使用服务层才 能发挥出最大的优势,如果说我们在业务逻辑层还是使用非领域模型的模式话,服务层的作用仅体现在解耦作用.其实在业务逻辑层采用领域模型时,我们前面说的持 久化透明的技术,其实我们可以通过服务层来做,我们在服务层中处理领域对象信息的持久化操作.当然本篇可能不会深入讨论持久化透明的具体实现,后面会单独开 篇来讲述,我们先来回顾下上篇讲解的内容:  上图

企业级应用框架(三)三层架构之数据访问层的改进以及测试DOM的发布

在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.net,EF,linq To Sql,这一点我们实现的不是很完美,仍有很大的改进空间,本文将加以改进. 在此之前我们来看一下我们最新的dom(PS:经过两天的赶工,我们的dom已经相对成熟,其中BLL层已经被我高度抽象化了,并且引进了业务上文文的概念:DAL层除了具体的技术实现尚为完成,其他方面已经相

winform中利用反射实现泛型数据访问对象基类

考虑到软件使用在客户端,同时想简化代码的实现,就写了一个泛型的数据访问对象基类,并不是特别健全,按道理应该参数化的方式实现insert和update,暂未使用参数化,抽时间改进. /// <summary> /// DAO基类 实体名必须要与数据表字段名一致 /// </summary> /// <typeparam name="T"></typeparam> public class BaseDao<T> where T :

14、抽象工厂获取数据访问层的实例,缓存的使用和反射的使用

工厂类的代码: namespace Shop.DALFactory { /// <summary> /// 抽象工厂.完成数据层中对象的创建(反射对象) /// </summary> public class AbstractFactory { //获取程序集的名称 private static string DalAssemblyPath = ConfigurationManager.AppSettings["DalAssemblyPath"]; //获取程序

数据访问层及EntityFramework

数据访问层(Data Access Layer)负责与数据储存设备打交道,为业务层提供数据服务(一般指增.删.改.查).一个好的数据访问层可在不影响其他逻辑的情况下,替换数据访问技术.数据据库. 数据访问层的常见模式与原则 工作单元(Unit of Work) 维护一系列操作的事务性(Transaction),一系列操作要么都成功,如果有一个操作失败,则事务回滚.这里也主要用于对数据库的操作. 如果通过sql脚本直接访问数据库,可以直接用sql调用相应数据库的事务. 如果采用自己写的ORM,则可

Java通用数据访问层Fastser-DAL推荐

本着不重复造轮子的原则,基于mybatis.spring jdbc.hibernate等ORM的通用数据访问层,支持基于datasource的读写分离.主备自动切换和故障转移,支持简单的负载均衡. 源码地址:http://git.oschina.net/fastser/fastser-dal-all 特性: 基于mybatis.spring jdbc.hibernate等各大orm框架实现通用dal层功能,并可以与已有项目完全兼容.同时也可以在已经实现的orm框架之间任意切换,不需要对代码作任何

【2017-04-20】Ado.Net与面向对象结合架构中的数据访问层(实体类,数据访问类)

开发项目三层架构:界面层.业务逻辑层.数据访问层 今天学习一下数据访问层,分为实体类和数据访问类 所有的类放在App_Code这个文件夹下边.养成一个好的习惯. 一.实体类 数据库中的表映射为一个类,类名与表名一致.表中的每一列,都为该类下的成员变量和属性也就是最简单的封装 把数据库中的表名变为类的类名. 把数据库中的每一个列,变为实体类中的成员变量和属性 列名与属性名一致.成员变量名:在列名前边加上下划线.因为在外部访问只能访问到属性,为了看起来一致. using System; using

ssh通用数据访问层接口及实现

package org.dao; import java.io.Serializable;import java.util.LinkedHashMap;import java.util.List;import java.util.Map; /** * 通用数据访问层 */ public interface BaseDao<T> { /** * 保存单个实体 * @param entity */ public void save(T entity); /** * 级联保存单个实体对象 * @pa

关于面对对象过程中的三大架构以及数据访问层(实体类、数据操作类)

面向对象开发项目三层架构: 界面层.业务逻辑层.数据访问层 数据访问层,分为实体类和数据访问类 在项目的下面添加一个App_Code文件夹把所有的类放在App_Code这个文件夹下边. 一.实体类 数据库中的表映射为一个类,类名与表名一致.表中的每一列,都为该类下的成员变量和属性也就是最简单的封装 把数据库中的表名变为类的类名. 把数据库中的每一个列,变为实体类中的成员变量和属性(也就是对每个数据库中的字段封装) 列名与属性名一致.成员变量名:在列名前边加上下划线.因为在外部访问只能访问到属性,