- 浏览: 687657 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (254)
- java分布式应用架构 (22)
- SSH框架整合 (6)
- java web 学习笔记 (49)
- java 学习笔记 (56)
- struts 2 学习 (6)
- Hibernate学习 (10)
- spring 学习 (2)
- 客户端编程(javascript) (4)
- IDE使用 (13)
- 生命 人生 (6)
- 系统维护 (3)
- 技术篇 (10)
- MySql (2)
- J2ME (1)
- java网络编程 (4)
- 数据库 (5)
- C/C++ (8)
- Oracle (7)
- 软件测试 (0)
- 软件的安装和部署 (0)
- Java快讯 (1)
- swt (1)
- Flex (1)
- 软件工程 (1)
- PostgreSQL (1)
- sql server2000 (2)
- 嵌入式数据库sqlite (5)
- J2EE (1)
- XML (1)
- ibatis3(MyBatis) (6)
- Linux&Unix (1)
- velocity (1)
- 回报社会 (4)
- 软件项目管理 (3)
- android研究 (3)
- C# (2)
- Objective-C (1)
- 音乐 (0)
- webx (1)
- JMS (1)
- maven软件项目管理 (1)
- 分布式服务 (0)
- 云平台 (0)
- 分布式存储 (1)
- 分布式系统架构 (0)
- 移动互联网 (1)
- ZooKeeper (1)
最新评论
-
liyys:
楼主,可不可以发这个项目的源码工程出来分享一下,少了几个类。楼 ...
仿照Hibernate实现一个SQLite的ORM框架 -
liyys:
少了一些类的源码没有粘贴出来
仿照Hibernate实现一个SQLite的ORM框架 -
honglei0412:
我使用的是这种方式获取db文件的目录但是 URL p = Fi ...
使用sqlite注意事项 -
honglei0412:
大侠 能不能说明下DbFile您是怎么做的吗?
使用sqlite注意事项 -
ahack:
刚写完mapping才发现早就有人写好了。仔细一看还都是针对的 ...
仿照Hibernate实现一个SQLite的ORM框架
在spring+hibernate的架构中,访问数据库有几种方法,按spring依赖注入来区分有3种,在这之前先再来了解一下spring的依赖注入,spring主要的两大核心就是IOC(控制反转)和AOP(面向切面编程),控制反转就是控制转移,从以往由Bean去控制要调用的接口或其他资源转移给容器,由容器来寻找并实例化要调用的接口,也可以解释成依赖注入,即在spring配置文件中把要调用的接口、设置、构造子配置给Bean。
这边是以依赖注入来区分为sessionFactory、hibernateTemplate、jdbcTemplate,本质上划分只有 hibernateTemplate和jdbcTemplate这两种。
1、注入sessionFactory
在 spring配置文件中,对Dao注入sessionFactory,即:
<bean id="classDao" class="cn.jmu.data.dao.impl.ClassImpl">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
这边sessionFactory依赖注入的不是给Dao层中的类,而是给 HibernateDaoSupport,见spring源文件org/springframework/orm/hibernate3/support /HibernateDaoSupport.java里面,就有sessionFactory的set、get操作:
public final void setSessionFactory(SessionFactory sessionFactory) {
this.hibernateTemplate = createHibernateTemplate(sessionFactory);//通过sessionFactory来生成 hibernateTemplate
}
public final SessionFactory getSessionFactory() {
return (this.hibernateTemplate != null ? this.hibernateTemplate.getSessionFactory() : null);
}
所以在Dao层中类继承HibernateDaoSupport,即可通过this.getHibernateTemplate()来对数据库进行操作,
更新数据:this.getHibernateTemplate().update(bo);
查询数据:this.getHibernateTemplate().find(bo);
添加数据:this.getHibernateTemplate().save(bo) ;
删除数据:this.getHibernateTemplate().delete(bo);
从上面可以看出 spring+hibernate的强大威力,存取数据不用像以往jdbc那样,要写一大串try,catch语句,还要连接数据库,用完再关闭数据库连接,而用一条语句就可以搞定。
这里sessionFactory由spring自动自动连接、关闭,当然你也可以手动来连接、关闭,如下面采用的方法:
Session session=this.getHibernateTemplate().getSessionFactory().openSession();
Transaction tx=session.beginTransaction();
/*--------------查询数据 ------------------------*/
String str="hql";
Query query=session.createQuery(str);
List list=query.list();
/*-------------- 删除数据------------------------*/
session.load(bo,ID);
session.delete(bo);
/*--------------添加数据------------------------*/
session.save(bo);
/*--------------修改数据-----------------------*/
session.load(bo,ID);
session.update(bo);
/*--------------end---------------------------*/
tx.commit();
session.close();
初学Hebernate的人对这些代码应该很熟悉,没有spring提供hibernateTemplate,在单单的 Hibernate中就得用这种方面去访问存取数据了。
2、注入hibernateTemplate
这种方法本质跟上面注入sessionFactory一样,只不过再进行一层包装,这样最大的好处就是Dao中的类就不用再继承 HibernateDaoSupport(在java中是单继承的,这唯一一次的继承就被HibernateDaoSupport剥夺去就岂不可惜?)不过在这之前要先要配置好hibernateTemplate,即:
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
再对要用到hibernateTemplate的Dao进行注入依赖,即:
<bean id="ClassDao" class="cn.jmu.data.dao.impl.ClassImpl">
<property name="hibernateTemplate">
<ref bean="hibernateTemplate"/>
</property>
</bean>
在 Dao层的类就要添加hibernateTemplate对象,来对应配置文件中所注入的依赖:
private HibernateTemplate hibernateTemplate;
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
hibernateTemplate对数据的增删查给就跟上面的一样,即:
更新数据:hibernateTemplate().update(bo);
查询数据:hibernateTemplate().find(bo);
添加数据:hibernateTemplate().save(bo) ;
删除数据:hibernateTemplate().delete(bo);
3、注入jdbcTemplate
如果对以前的 jdbc的SQL还念念不忘,又对Hibernate的HQL没有好感的话,就可以采用jdbcTemplate来增删查改数据库了。在某些情况下采用 jdbcTemplate还比较方便,甚至还能提高查询效率。在这之前也要像注入hibernateTemplate那样,先配置好 jdbcTemplate,
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
如果jdbcTemplate和 hibernateTemplate配置时都指向同一个dataSource,那就可以共用同一个事务了。
再对要用到jdbcTemplate 的Dao进行注入依赖,即:
<bean id="classDao" class="cn.jmu.data.dao.impl.ClassImpl">
<property name="jdbctemplate">
<ref bean="jdbcTemplate" />
</property>
</bean>
在Dao层的类就要添加jdbctemplate对象,来对应配置文件中所注入的依赖:
protected JdbcTemplate jdbctemplate;
public JdbcTemplate getJdbctemplate() {
return jdbctemplate;
}
public void setJdbctemplate(JdbcTemplate jdbctemplate) {
this.jdbctemplate = jdbctemplate;
}
现在就可以通过jdbctemplate存取数据了:
查询数据:
/*------------查询单列-------------------*/
String SQL= "select name from table";
List list= jdbctemplate.queryForList(SQL);
/*------------查询多列 ------------------*/
Hashtable hash = new Hashtable();
jdbctemplate.query(SQL,
new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
hash.put(rs.getString(1),rs.getString(2));
}
});
/*---------- 查询后填充到vo里面-----------*/
String SQL="select * from table where id=?";
String[] obj = new String[1];
obj[0] = N;
VO vo= new VO(); //这边暂用VO来表示,VO的本质不是这样的
List list = jdbcTemplate.query(SQL,obj,vo);
VO要实现RowMapper接口中的mapRow方法,把结果集填充到bo里面:
class VO implements RowMapper{
public Object mapRow(ResultSet rs, int index) throws SQLException {
Bo bo = new Bo();
bo.setProperty(rs.getString(1));
bo.setProperty(rs.getString(2));
bo.setProperty(rs.getString(3));
return bo;
}
}
/*---------------- 更新数据------------------*/
String SQL="update table set name=?";
String[] obj=new String[1];
obj[1]="new name";
jdbcTemplate.update(SQL,obj);
/*----------------删除数据 ------------------*/
String SQL="delete from table where id='"+ID+"'";
jdbcTemplate.execute(SQL);
/*----------------添加数据 ------------------*/
String SQL="insert into table (property1,property2) values ('"+property1+"','"+property1+"')";
jdbcTemplate.execute(SQL);
这是在spring+hibernate框架中对Dao访问存取数据的方法做一个总结,由于水平有限,错误和不足之处欢迎大家批评指正。
这边是以依赖注入来区分为sessionFactory、hibernateTemplate、jdbcTemplate,本质上划分只有 hibernateTemplate和jdbcTemplate这两种。
1、注入sessionFactory
在 spring配置文件中,对Dao注入sessionFactory,即:
<bean id="classDao" class="cn.jmu.data.dao.impl.ClassImpl">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
这边sessionFactory依赖注入的不是给Dao层中的类,而是给 HibernateDaoSupport,见spring源文件org/springframework/orm/hibernate3/support /HibernateDaoSupport.java里面,就有sessionFactory的set、get操作:
public final void setSessionFactory(SessionFactory sessionFactory) {
this.hibernateTemplate = createHibernateTemplate(sessionFactory);//通过sessionFactory来生成 hibernateTemplate
}
public final SessionFactory getSessionFactory() {
return (this.hibernateTemplate != null ? this.hibernateTemplate.getSessionFactory() : null);
}
所以在Dao层中类继承HibernateDaoSupport,即可通过this.getHibernateTemplate()来对数据库进行操作,
更新数据:this.getHibernateTemplate().update(bo);
查询数据:this.getHibernateTemplate().find(bo);
添加数据:this.getHibernateTemplate().save(bo) ;
删除数据:this.getHibernateTemplate().delete(bo);
从上面可以看出 spring+hibernate的强大威力,存取数据不用像以往jdbc那样,要写一大串try,catch语句,还要连接数据库,用完再关闭数据库连接,而用一条语句就可以搞定。
这里sessionFactory由spring自动自动连接、关闭,当然你也可以手动来连接、关闭,如下面采用的方法:
Session session=this.getHibernateTemplate().getSessionFactory().openSession();
Transaction tx=session.beginTransaction();
/*--------------查询数据 ------------------------*/
String str="hql";
Query query=session.createQuery(str);
List list=query.list();
/*-------------- 删除数据------------------------*/
session.load(bo,ID);
session.delete(bo);
/*--------------添加数据------------------------*/
session.save(bo);
/*--------------修改数据-----------------------*/
session.load(bo,ID);
session.update(bo);
/*--------------end---------------------------*/
tx.commit();
session.close();
初学Hebernate的人对这些代码应该很熟悉,没有spring提供hibernateTemplate,在单单的 Hibernate中就得用这种方面去访问存取数据了。
2、注入hibernateTemplate
这种方法本质跟上面注入sessionFactory一样,只不过再进行一层包装,这样最大的好处就是Dao中的类就不用再继承 HibernateDaoSupport(在java中是单继承的,这唯一一次的继承就被HibernateDaoSupport剥夺去就岂不可惜?)不过在这之前要先要配置好hibernateTemplate,即:
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
再对要用到hibernateTemplate的Dao进行注入依赖,即:
<bean id="ClassDao" class="cn.jmu.data.dao.impl.ClassImpl">
<property name="hibernateTemplate">
<ref bean="hibernateTemplate"/>
</property>
</bean>
在 Dao层的类就要添加hibernateTemplate对象,来对应配置文件中所注入的依赖:
private HibernateTemplate hibernateTemplate;
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
hibernateTemplate对数据的增删查给就跟上面的一样,即:
更新数据:hibernateTemplate().update(bo);
查询数据:hibernateTemplate().find(bo);
添加数据:hibernateTemplate().save(bo) ;
删除数据:hibernateTemplate().delete(bo);
3、注入jdbcTemplate
如果对以前的 jdbc的SQL还念念不忘,又对Hibernate的HQL没有好感的话,就可以采用jdbcTemplate来增删查改数据库了。在某些情况下采用 jdbcTemplate还比较方便,甚至还能提高查询效率。在这之前也要像注入hibernateTemplate那样,先配置好 jdbcTemplate,
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
如果jdbcTemplate和 hibernateTemplate配置时都指向同一个dataSource,那就可以共用同一个事务了。
再对要用到jdbcTemplate 的Dao进行注入依赖,即:
<bean id="classDao" class="cn.jmu.data.dao.impl.ClassImpl">
<property name="jdbctemplate">
<ref bean="jdbcTemplate" />
</property>
</bean>
在Dao层的类就要添加jdbctemplate对象,来对应配置文件中所注入的依赖:
protected JdbcTemplate jdbctemplate;
public JdbcTemplate getJdbctemplate() {
return jdbctemplate;
}
public void setJdbctemplate(JdbcTemplate jdbctemplate) {
this.jdbctemplate = jdbctemplate;
}
现在就可以通过jdbctemplate存取数据了:
查询数据:
/*------------查询单列-------------------*/
String SQL= "select name from table";
List list= jdbctemplate.queryForList(SQL);
/*------------查询多列 ------------------*/
Hashtable hash = new Hashtable();
jdbctemplate.query(SQL,
new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
hash.put(rs.getString(1),rs.getString(2));
}
});
/*---------- 查询后填充到vo里面-----------*/
String SQL="select * from table where id=?";
String[] obj = new String[1];
obj[0] = N;
VO vo= new VO(); //这边暂用VO来表示,VO的本质不是这样的
List list = jdbcTemplate.query(SQL,obj,vo);
VO要实现RowMapper接口中的mapRow方法,把结果集填充到bo里面:
class VO implements RowMapper{
public Object mapRow(ResultSet rs, int index) throws SQLException {
Bo bo = new Bo();
bo.setProperty(rs.getString(1));
bo.setProperty(rs.getString(2));
bo.setProperty(rs.getString(3));
return bo;
}
}
/*---------------- 更新数据------------------*/
String SQL="update table set name=?";
String[] obj=new String[1];
obj[1]="new name";
jdbcTemplate.update(SQL,obj);
/*----------------删除数据 ------------------*/
String SQL="delete from table where id='"+ID+"'";
jdbcTemplate.execute(SQL);
/*----------------添加数据 ------------------*/
String SQL="insert into table (property1,property2) values ('"+property1+"','"+property1+"')";
jdbcTemplate.execute(SQL);
这是在spring+hibernate框架中对Dao访问存取数据的方法做一个总结,由于水平有限,错误和不足之处欢迎大家批评指正。
发表评论
-
Spring MVC集成velocity扩展
2013-07-23 17:18 32701、扩展velocity的视图 [code=" ... -
Java获取客户端信息
2011-09-07 14:48 1657String agent = request.getHeade ... -
获取IP地址
2011-09-07 13:41 2431public String getIpAddrByReques ... -
netty telnet 应用实例server代码
2011-09-07 12:21 1899public class TelnetServer { ... -
Netty中使用Apache Common FileUpload
2011-09-07 12:19 1288/** * 用Netty来实现上传 */ publi ... -
java管理windows进程
2011-08-29 17:34 1790package org.zzuli.xmsb; /** ... -
java反射工具
2011-08-29 17:30 5459package org.liufei.jweb.reflect ... -
java html工具
2011-08-29 17:26 1092package org.liufei.jweb.util; ... -
java将汉字转化为全拼
2011-08-29 17:24 1239package org.liufei.jweb.util; ... -
JSTL API
2011-08-29 15:13 1806JSTL API -
jdbc操作大观园
2011-08-09 17:22 1393最近公司使用jdbc和mybatis比较多,于是自己试着写了一 ... -
Java处理UTF-8带BOM的文本的读写
2011-08-01 11:28 3039什么是BOM BOM(byte-order mark),即字 ... -
Session和Cookie的区别
2011-06-27 16:34 8821、session保存在服务器,客户端不知道其中的信息;coo ... -
ajax应用时html响应生成工具
2011-05-02 19:00 1144package org.zzuli.xmsb.util; ... -
setTimeout和setInterval的使用
2011-05-01 16:00 1012这两个方法都可以用来 ... -
javasript 经典技巧
2011-03-04 21:30 14671. oncontextmenu="window.e ... -
javascript窗口
2011-03-04 16:31 1044【1、最基本的弹出窗口 ... -
get and post
2011-01-07 17:22 10061. get 是从服务器上获取数据,post 是向服务器传送数 ... -
web开发人员必学的五堂课
2010-12-20 14:42 997越来越多的Web开发人员 ... -
spring整合MyBatis
2010-11-21 15:08 10572MyBatis Spring 1.0.0-RC2 参考文档 M ...
相关推荐
SSH三大框架,即Struts、Spring和Hibernate,是Java Web开发中的常用技术组合,它们各自负责不同的职责:Struts作为MVC模式中的Controller层,处理用户请求并转发到相应的业务逻辑;Spring则作为核心容器,负责依赖...
在Spring+Hibernate的集成中,Spring可以作为Hibernate的事务管理器,处理事务的开始、提交、回滚等操作。通过SessionFactory和Session接口,Hibernate可以进行对象持久化,将Java对象转换为数据库中的记录。 **...
- 在Spring的配置文件中,配置Hibernate的SessionFactory,以及DAO层Bean的事务管理和数据源。 #### 三、整合后的优势 SSH框架的整合不仅提高了系统的可维护性和扩展性,还极大地简化了开发流程。Spring负责业务...
在 JCatalog 示例中,Spring 可能用于实现业务服务接口,提供对 Hibernate DAO 的封装,而 JSF 的 Managed Beans 作为视图与控制器的结合,负责处理用户请求并调用 Spring 服务。此外,安全控制也应纳入设计考虑,如...
4. **集成Hibernate**:配置Hibernate的SessionFactory,并将其注入到业务层的DAO(数据访问对象)中,用于数据库操作。 在项目实践中,`bankmoney`可能代表了一个银行资金管理的模块,可能包含相关的DAO、Service...
Struts2+Spring+Hibernate(SSH)是一种经典的Java Web开发框架组合,被广泛应用于企业级应用的开发中,尤其在实现数据持久化、业务逻辑控制和视图展示方面有着显著的优势。这个名为"Struts2+Spring+Hibernate_Demo...
在这个实例中,你需要创建一个名为“imti”的数据库,并将提供的数据库文件导入到这个数据库中,以便WebWork+Spring+Hibernate能够访问和操作数据。 **集成过程** 集成这三个框架的过程主要包括以下几个步骤: 1. *...
"Struts+Spring+Hibernate 整合"是Java开发中常见的一种技术栈,旨在优化开发流程,提高代码复用性,并实现松耦合。 1. **Struts**: Struts 是一个基于MVC(Model-View-Controller)设计模式的Web应用框架。它...
- **DAO(Data Access Object)**:数据访问对象,通过Hibernate接口与数据库进行交互,执行增删改查操作。 - **Service**:服务层,封装业务逻辑,是业务处理的核心,通常使用Spring进行依赖注入。 - **Action**:...
《Spring+Hibernate参考书》是一本专注于整合Spring框架与Hibernate持久化库的指南,旨在帮助开发者深入了解和熟练掌握这两种在Java开发中广泛使用的开源技术。Spring以其强大的依赖注入(DI)和面向切面编程(AOP)...
Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自处理不同的层面:Struts2专注于MVC(模型-视图-控制器)架构模式,Spring提供了依赖注入和面向切面编程,而Hibernate则作为对象关系映射工具,简化...
Spring、Hibernate和Struts是Java Web开发中的三个关键框架,它们共同构成了经典的MVC(Model-View-Controller)架构。这个实例将帮助我们深入理解这三个框架如何协同工作以构建高效、可维护的Web应用程序。 首先,...
当前,基于Struts+Spring+Hibernate架构已经成为J2EE轻量级架构开发的主流选择之一。这三个框架分别在MVC(Model-View-Controller)设计模式、依赖注入与面向切面编程、以及对象关系映射等方面提供了强大的支持。...
Struts2提供了MVC(Model-View-Controller)架构模式,Spring则是强大的依赖注入(Dependency Injection)容器,而Hibernate则是优秀的对象关系映射(ORM)工具,用于简化数据库操作。 **Struts2** 是一个基于MVC...
SSH(Struts2+Spring+Hibernate)框架整合是Java Web开发中常见的一种技术栈,能有效地提高开发效率和代码质量。 Struts2作为MVC框架,主要负责处理HTTP请求,控制应用程序的流程,提供视图和控制器的分离。它的...
在本项目中,Ajax用于前端的异步通信,Spring作为整体架构的支撑,负责管理对象和处理事务,而Hibernate则作为数据访问层,负责与数据库的交互。 项目中可能包含以下关键组件: 1. **DispatcherServlet**:Spring ...
这个"Blog"压缩包很可能包含了相关的配置文件(如struts.xml、spring配置文件、hibernate.cfg.xml等)、实体类、DAO(数据访问对象)层、Service层、Controller层以及视图(如JSP页面)等组成部分。通过研究这些文件...
Spring、Struts和Hibernate是Java开发中非常经典的三大框架,它们分别负责不同的职责:Spring作为IoC(控制反转)和AOP(面向切面编程)容器,管理着应用的组件和依赖;Struts则主要处理MVC(模型-视图-控制器)架构...
Hibernate 提供了一种透明的方式来将Java对象持久化到数据库中,大大降低了数据库操作的复杂性。 在“ssh”项目中,Struts 作为前端控制器接收HTTP请求,然后通过Spring进行业务逻辑处理和服务调用。Spring管理的...
在实际运行环境中,你需要根据你的数据库配置来修改相关的配置文件,包括Struts的配置文件(如struts-config.xml)、Spring的配置文件(如applicationContext.xml)以及Hibernate的配置文件(如hibernate.cfg.xml)...