<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xmlns:aop="http://www.springframework.org/schema/aop"
     xmlns:tx="http://www.springframework.org/schema/tx"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd
            http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop.xsd
           http://www.springframework.org/schema/tx
         http://www.springframework.org/schema/tx/spring-tx.xsd">

   <!--1, 打开Spring的annotation -->
   <context:annotation-config/>
   <!-- 2, 设定Spring去那些包中找annotation -->
   <context:component-scan base-package="com.yangw.spring" />

   <!--
           使用dbcp没有成功, 加的是commons-dbcp-1.4.jar
        class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    -->
   <bean id="dataSource"

               class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <context:property-placeholder location="jdbc.properties"/> 

    <!--创建sessionFactory -->
  <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" >
       <!-- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" -->
    <property name="dataSource" ref="dataSource"/>
    <!--  基于XML配置文件的形式
    <property name="mappingResources">
      <list>
        <value>product.hbm.xml</value>
      </list>
    </property>
    -->
    <!-- 自动去包中找hbm文件或者设置了annotation的类-->
    <property name="packagesToScan" value="com.yangw.spring.model" />
    <!-- 将hibernate配置文件放到单独的配置文件中的方式-->
    <!--
    <property name="configLocation" value="classpath:hibernate.cfg.xml" />
    -->
    <property name="hibernateProperties">
      <value>
        hibernate.dialect=org.hibernate.dialect.MySQLDialect
        hibernate.show_sql=true
        hibernate.hbm2ddl.auto=update
        hibernate.format_sql=false
      </value>
    </property>
  </bean>

    <!-- 配置Spring事务处理 -->
    <!-- 1,创建事务管理器 -->
      <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <!-- 2, 配置AOP,Spring是通过AOP进行事务管理的-->
   <aop:config>
       <!-- 设置PointCut表示哪些方法要加入事务-->
    <aop:pointcut id="allMethods"
            expression="execution(* com.yangw.spring.dao.*.*(..))"/>
    <!-- 通过advisor来确定具体加入事务控制的方法 -->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods"/>
  </aop:config>
    <!--3, 配置哪些方法要加入事务 -->

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="get*" read-only="true" />
            <tx:method name="count*" read-only="true" />
            <tx:method name="is*" read-only="true" />
            <tx:method name="has*" read-only="true" />
            <!-- 所有方法都加入事务 -->
            <tx:method name="*"  />
        </tx:attributes>
    </tx:advice>
</beans>
package com.yangw.spring.dao;

import java.util.List;
/**
 * IBaseDao接口是所有Dao公共的操作
 * @author Administrator
 * @param <T>
 */
public interface IBaseDao<T> {

    public void add(T t);

    public void update(T t);

    public void delete(int id);

    public T load(int id);

    public List<T> list(String hql,Object[] args);

}
package com.yangw.spring.dao;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
 *
 * 把所有公共方法都写到BaseDao,所有Dao都继承 BaseDao即可,这样就实现了大量的基础方法
 * 如果Dao中有特殊的方法,再次具体的Dao中进行实现
 * @author Administrator
 *
 * @param <T>
 */
public class BaseDao<T> extends HibernateDaoSupport implements IBaseDao<T> {

    //注入SessionFactory
    @Resource(name="sessionFactory")
    public void setSuperSessionFactory(SessionFactory sessionFactory){
        super.setSessionFactory(sessionFactory);
    }

    private Class<T> entityClass;
   /**
    * 获取T对象的Class
    * @return
    */
    @SuppressWarnings({ "unused", "unchecked" })
    private Class<T> getEntityClass(){
        if(entityClass==null){
            entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        }
        return entityClass;

    }

    @Override
    public void add(T t) {
        super.getHibernateTemplate().save(t);
    }

    @Override
    public void update(T t) {
        super.getHibernateTemplate().update(t);
    }

    @Override
    public void delete(int id) {
        //先加载对象再删除
        super.getHibernateTemplate().delete(this.load(id));
    }

    @Override
    public T load(int id) {
        return super.getHibernateTemplate().get(getEntityClass(), id);

    }

    /**
     * 这个方法的弊端:
     * 1, select * from User 这样的语句不行
     * 2, 查询结果是Object[],需要自己额外处理
     */
    @SuppressWarnings("unchecked")
    @Override
    public List<T> list(String hql, Object[] args) {

        //select * 的处理,可以利用反射来做

        Query query=this.getSession().createQuery(hql);
        for(int i=0;i<args.length;i++){
            query.setParameter(i, args[i]);
        }
        return listToBean(query.list(),hql);
    //    return query.list();
    }

    /**
     * 自己写代码,作映射
     * @param list
     * @param hql
     * @return
     */
    private  List<T> listToBean(List<Object[]> list,String hql){

        //"select "占7个长度
        String[] columns=hql.substring(7, hql.indexOf("from")).split("\\s*,\\s*");
        List<T> resultList=new ArrayList<T>();

        List<Field> fields=new ArrayList<Field>();
        //测试发现:getDeclaredField(column)获取的是基本类型值
        //测试发现:getField(column)获取的是非基本类型值
        Field[] fieldsTemp=getEntityClass().getDeclaredFields(); //获取所有的列

        //得到每次需要的列

        for(int i=0;i<fieldsTemp.length;i++){
            String temp=fieldsTemp[i].getName(); //属性名
            boolean flag=false; //假设当前这个不是要或者的属性名
            for(String column:columns){
                if(column.equals(temp)){
                    flag=true;
                    break;
                }
            }
            if(flag){
                fields.add(fieldsTemp[i]);
            }
        }

        try {
                for(int i=0;i<list.size();i++){
                    Object[] objs=list.get(i);
                    T tclass=getEntityClass().newInstance();
                    for(int j=0;j<fields.size();j++){
                        fields.get(j).setAccessible(true);
                        fields.get(j).set(tclass,objs[j]);
                    }
                    resultList.add(tclass);
                }
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return resultList;
    }

}
package com.yangw.spring.dao;

import com.yangw.spring.model.User;

public interface IUserDao extends IBaseDao<User>{

    //此时的IUserDao只需要写特殊的一些方法,让子类去实现
    //假设下面这个是IUserDao中的特殊方法
    public void add(User user,int gid);
}
package com.yangw.spring.dao;

import org.springframework.stereotype.Repository;

import com.yangw.spring.model.User;

@Repository("userDao")
public class UserDao extends BaseDao<User> implements IUserDao {

    @Override
    public void add(User user, int gid) {

        System.out.println("cccc");
    }

}
package com.yangw.spring.test;

import java.util.List;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.yangw.spring.dao.IUserDao;
import com.yangw.spring.model.User;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/beans.xml")
/**
 * 当使用了@RunWith,@ContextConfiguration注解之后,就可以直接在Test中进行依赖注入
 * @author Administrator
 */
public class TestHibernate {

    @Resource(name="userDao")
    private IUserDao userDao;

    @Test
    public void testAdd(){

       User user=new User();
       user.setName("zhaoliu");
       user.setAge(22);
       userDao.add(user);
    }

    @Test
    public void testLoad(){

      User user = (User) userDao.load(4);
      System.out.println(user);
    }

    @Test
    public void testList(){

      List<User> lists = userDao.list("select age, name from User where name=?", new  Object[]{"wangwu"});

      for(int i=0;i<lists.size();i++){
          System.out.println("-->"+lists.get(i).getAge());
      }
    }

}

Spring-hibernate-BaseDao的更多相关文章

  1. Struts2 + Spring + Hibernate 通用 Service 和 DAO

    我在 Struts2 + Spring + Hibernate  项目开发中总结出了一个Service 和 DAO ,可以用于处理任何的pojo(bean).使用这两个Service 和 DAO 可以 ...

  2. Strut2 spring hibernate 整合

    一.创建web项目工程 wzz 点击finish 2.添加spring Jar包   AOP,Core,Persistence Core ,web jar 点击next 点击Finish 3.配置Da ...

  3. SpringMVC+Spring+Hibernate整合开发

    最近突然想认真研究下java web常用框架,虽然现在一直在用,但实现的整体流程不是很了解,就在网上搜索资料,尝试自己搭建,以下是自己的搭建及测试过程. 一.准备工作: 1/安装并配置java运行环境 ...

  4. 整合struts2+spring+hibernate

     一.准备struts2+spring+hibernate所须要的jar包:        新建web项目并将jar包引入到project项目中. 二.搭建struts2环境        a.在 ...

  5. 软件架构期末复习(Struts2+Spring+Hibernate)

    Struts2+Spring+Hibernate The Model-ViewController pattern in Struts2 is implemented with the followi ...

  6. Struts+Spring+Hibernate项目的启动线程

    在Java Web项目中,经常要在项目开始运行时启动一个线程,每隔一定的时间就运行一定的代码,比如扫描数据库的变化等等.要实现这个功能,可以现在web.xml文件中定义一个Listener,然后在这个 ...

  7. SSH面试题(struts2+Spring+hibernate)

    struts2 + Spring +hibernate Hibernate工作原理及为什么要用?   原理:   1.读取并解析配置文件   2.读取并解析映射信息,创建SessionFactory ...

  8. SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>

    此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...

  9. Struts,spring,hibernate三大框架的面试

    Struts,spring,hibernate三大框架的面试 1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3 ...

  10. struts2+spring+hibernate(SSH)框架的搭建和总结

    SSH框架:struts2+spring+hibernate,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. struts2+spring+hibernat ...

随机推荐

  1. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——解码篇:(一)用ffmpeg解码视频

    一.概述 myRTSPClient(RTSPClient)获取音视频数据之后,接下来的工作便是将音视频数据交给解码器去解码(ffmpeg),ffmpeg解码之后于是便有了呈现在终端用户(USER)面前 ...

  2. 第3天:CSS浮动、定位、表格、表单总结

    今天学的是浮动.定位.表格.表单等内容,这些是CSS中最容易混淆的知识,有许多小技巧在写代码过程中需要注意.下面是主要知识点: 一.float浮动1.块元素在一行显示2.内联元素支持宽高3.默认内容撑 ...

  3. Eclipse自动生成返回值对象的快捷键是什么?

    如下代码 List<ShareholderEntity> shareList = fetch.parseShareHolder(data); 如何自动生成 List<Sharehol ...

  4. 怎么检测JDK环境变量是否配置正确

    怎么检测JDK环境变量是否配置正确.. 点击开始--运行--输入cmd,点击确定. 在命令行窗口输入java  然后Enter.没有出现java既不是内部命令也不是外部命令.说明配置是正确的. 在命令 ...

  5. 基本元件库(Basic)

  6. MAC 上传文件到github

    在IOS中,经常需要上传文件到github.以桌面上的一个文件夹为例: 步骤1: cd 到该文件夹下,建立POD文件. $ cd /Users/andy/Desktop/openinstallSDK ...

  7. MyBatis从入门到放弃七:二级缓存原理分析

    前言 说起mybatis的一级缓存和二级缓存我特意问了几个身边的朋友他们平时会不会用,结果没有一个人平时业务场景中用. 好吧,那我暂且用来学习源码吧.一级缓存我个人认为也确实有些鸡肋,mybatis默 ...

  8. 题目1522:包含min函数的栈

    #include <iostream> #include <cstdio> #include <stack> using namespace std; int ma ...

  9. 201671010133 2016-2017-2 《java程序设计》 初学java!

    新学期伊始,我心中既充满了期待和希望,又有些许激动和感慨.期待的是即将接触许多新的知识,期待未来比过去过的更加踏实有趣,期待遇到更好的人和事等等.当然,面对从未了解过的新事物时,我想每个人的想法都大致 ...

  10. [2014-08-18]Mac OSX 命令行快捷键

    系统:OSX 10.9.4 将光标移动到行首:ctrl + a 将光标移动到行尾:ctrl + e 清除屏幕: ctrl + l 搜索以前使用命令:ctrl + r 清除当前行: ctrl + u 清 ...