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 ...
随机推荐
- 初次搭建vue环境(最基础的)
一直以来觉得搭建环境是自己的短板,恰巧老大跟我说他刚才面试一个有4年工作经验的人,给那面试的人出了到机试题,给了1小时的时间连环境都没搭好.且不说那人的工作经验是否掺有水分,自己还是有点尴尬的,以前的 ...
- 如何改变Myeclipse编辑区背景色(转)
编辑窗口右键单击-->Preferences-->General加号-->Editors加号-->点Text Editors字样-->右下窗口选Backgroud col ...
- Git 初学
记录git与远成仓库建立连接日志 gitbub上创建远程仓库 https://github.com/ 创建登陆账号进入主页 , 选择右上角的加号 新建rep Repository name 为你创建的 ...
- javascript:void(0); 是什么意思
javascript:void(0); 是什么意思.. ------------------------------------------------- 常常在百度云网页版下载东西的时候网页的左下角 ...
- 一个利用pojo类从前端页面request中获取参数的小框架~
写之前不知道Spring已经实现这样的功能,所以傻傻的写了这个东西! 实现原理挺有趣的在此记录一下.从去年十月参加java开发以来自己终于有了点小进步. 好开心. 解决问题(详解):前端form表单提 ...
- Java设计模式 (转)
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- 记一次被yield return坑的历程。
事情的经过是这样的: 我用C#写了一个很简单的一个通过迭代生成序列的函数. public static IEnumerable<T> Iterate<T>(this Func& ...
- 【渗透课程】第四篇-Web安全之信息探测
Web之信息探测,从这篇开始就正式进入了Web渗透实战过程了,嗯,前面都是讲基础,下面我们来讲Web中的信息探测. 信息探测,主要的目的 收集目标服务器系统信息(IP,服务器所用系统等) 收集目标网站 ...
- JavaScript笔记之第五天
JavaScript 对象 JavaScript 中的所有事物都是对象:字符串.数值.数组.函数... 此外,JavaScript 允许自定义对象. 所有事物都是对象 JavaScript 提供多个内 ...
- jenkins 每个月1号到7号 一天执行一次
在线Crontab表达式执行时间验证 / crontab执行时间计算 - aTool在线工具验证 http://www.atool.org/crontab.php 1.Build periodic a ...