Spring-hibernate-BaseDao
<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的更多相关文章
- Struts2 + Spring + Hibernate 通用 Service 和 DAO
我在 Struts2 + Spring + Hibernate 项目开发中总结出了一个Service 和 DAO ,可以用于处理任何的pojo(bean).使用这两个Service 和 DAO 可以 ...
- Strut2 spring hibernate 整合
一.创建web项目工程 wzz 点击finish 2.添加spring Jar包 AOP,Core,Persistence Core ,web jar 点击next 点击Finish 3.配置Da ...
- SpringMVC+Spring+Hibernate整合开发
最近突然想认真研究下java web常用框架,虽然现在一直在用,但实现的整体流程不是很了解,就在网上搜索资料,尝试自己搭建,以下是自己的搭建及测试过程. 一.准备工作: 1/安装并配置java运行环境 ...
- 整合struts2+spring+hibernate
一.准备struts2+spring+hibernate所须要的jar包: 新建web项目并将jar包引入到project项目中. 二.搭建struts2环境 a.在 ...
- 软件架构期末复习(Struts2+Spring+Hibernate)
Struts2+Spring+Hibernate The Model-ViewController pattern in Struts2 is implemented with the followi ...
- Struts+Spring+Hibernate项目的启动线程
在Java Web项目中,经常要在项目开始运行时启动一个线程,每隔一定的时间就运行一定的代码,比如扫描数据库的变化等等.要实现这个功能,可以现在web.xml文件中定义一个Listener,然后在这个 ...
- SSH面试题(struts2+Spring+hibernate)
struts2 + Spring +hibernate Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory ...
- SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>
此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...
- Struts,spring,hibernate三大框架的面试
Struts,spring,hibernate三大框架的面试 1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3 ...
- struts2+spring+hibernate(SSH)框架的搭建和总结
SSH框架:struts2+spring+hibernate,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. struts2+spring+hibernat ...
随机推荐
- 【Ubuntu 16】显示管理器lightdm
lightdm是一个全新的轻量级的显示管理器,在Ubuntu16.04上面已经使用. 从图形界面进入到命令行界面 systemctl disable lightdm.service 从命令行进入到图形 ...
- Mikit前端框架,轻量级CSS&JS前端框架
Mikit CSS Framework Mikit介绍 Mikit是前端开发人员和前端设计师所喜爱的Web框架.Mikit的创建和设计旨在为前端社区提供最灵活而强大的CSS框架. 与许多其他网络框架不 ...
- 转每天一个linux命令(2):cd命令
Linux cd 命令可以说是Linux中最基本的命令语句,其他的命令语句要进行操作,都是建立在使用 cd 命令上的. 所以,学习Linux 常用命令,首先就要学好 cd 命令的使用方法技巧. 1 ...
- 201671010133 2016-2017-2 《java程序设计》 初学java!
新学期伊始,我心中既充满了期待和希望,又有些许激动和感慨.期待的是即将接触许多新的知识,期待未来比过去过的更加踏实有趣,期待遇到更好的人和事等等.当然,面对从未了解过的新事物时,我想每个人的想法都大致 ...
- Django 后台支持中文方法
今天遇到的一个问题,mark一下: django后台可以支持中文界面,一开始一直纠结于settings.py 中 LANGUAGE_CODE = 'en-us'中的'en-us'该更改成什么.zh-c ...
- linux(十四)之linux NFS服务管理
学到这里差不多就结束了linux的基础学习了,其实linux的内容并不难,我们要经常的反复的去操作它,多多和它去联络感情才能很好的掌握这个linux. 加油!今天是星期二.没有什么比努力让人更加热血沸 ...
- centos 7 mariadb 启动问题
安装完了 mariadb 后 有一天重启机器发现 启动不了 mariadb.service systemctl start mariadb.service //然后发现下面的问题 job for ma ...
- TC358749XBG:HDMI转MIPI CSI芯片简介
TC358749XBG是一颗HDMI转MIPI CSI功能的视频转换芯片,分辨率:1920*1080,电源3.3/1.8/1.2,通信方式:IIC,封装形式BGA80
- 边看MHA源码边学Perl语言之一开篇
边看MHA源码边学Perl语言之一开篇 自我简介 先简单介绍一下自己,到目前为此我已经做了7年左右的JAVA和3年左右php开发与管理,做java时主要开发物流行业的相关软件,对台湾快递,国际快递,国 ...
- poj 1523求割点
题意:给出一个无向图,求割点以及去除这个点后图分为几部分: 思路:割点定义:去掉该点后图将分成几个部分.割点:(1)当k为根节点且有>1个分支,则去除该点后图便被分成几个分支.(2)DFN[v] ...