整合初步______SH
什么是框架
在的J2EE开发中,经常会提到“框架”这个词汇,例如Spring,Struts,Webx等等都称之为J2EE开发框架。那么,什么是框架呢?
框架的英文为Framework,带有骨骼,支架的含义。
在软件工程中,框架被定义为整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。
一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间协作的方法,它为构件复用提供了上下文(Context)关系。
框架是实现了某应用领域通用功能的底层服务。使用这种框架的编程人员可以在一个通用功能已经实现的基础上开始具体的系统开发。框架提供了所有应用期望的默认行为的类集合。具体的应用通过重写子类或组装对象来支持应用专用的行为。
通俗的说,框架是完成是某种应用的半成品,提供了一些常用的工具类和一些基础通用化的组件,可以供开发人员在此基础上,更便捷的完成各自特有的系统。
Spring是一个综合型框架,致力于J2EE应用的各层的解决方案,而不是仅仅专注于某一层的方案。可以说Spring可以作为应用开发的“一站式”选择,并贯穿表现层、业务层及持久层。然而,Spring并不想取代那些已有的框架,它可以与其他框架无缝地整合。
考虑到面向的领域,以及实现编码实现,我们可以将将框架至少分为三类。
第一类是基础类库,主要包含多数项目所需要的类库。(开发人员将其作为一个类库使用,可以简化一些常用的算法逻辑。)
第二类是基础框架,该框架应该整合或者实现J2EE开发所需要的常用功能。(此框架可以为各类WEB项目开发提供基础支持。)
第三类是平台框架,针对于某种特定领域,实现特定领域所需要的常用功能。(这个框架需要实现具体领域的业务的逻辑。并且应该支持各类扩展)
为什么需要整合呢?
使用spring ,主要是使用它的ioc(可以理解成管理bean的一个容器) ,aop(面向切面编程:持久化管理(Persistent)、事务管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和调试管理(Debugging)等) ,jdbcTemplate(封装操作数据库,不用再自己建立关闭连接了,挺方便的。)
当然还有一部分是工作需要, spring的IOC可以降低对象的耦合度,方便用junit做自动化测试.
以上的部分只是自己摘抄的个人理解。
接下来开始真正进入代码的世界,我们来实现一个添加图书和查询图书信息的功能。使用Spring和Hibernate整合
创建实体类:
package cn.books.beans; /**
* Created by accp on 2017/3/30.
*/
public class Book {
private Integer id;
private String name;
private String price; public Book() {
} public Book(String name, String price) {
this.name = name;
this.price = price;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPrice() {
return price;
} public void setPrice(String price) {
this.price = price;
}
}
小配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.books.beans">
<class name="Book" table="Book">
<id name="id"><generator class="native"></generator></id>
<property name="name"/>
<property name="price"/>
</class>
</hibernate-mapping>
dao:
package cn.books.dao; import cn.books.beans.Book; /**
* Created by accp on 2017/3/30.
*/
public interface BookDao {
int add(Book book);
}
dao层的实现(implements):
package cn.books.dao.impl; import cn.books.beans.Book;
import cn.books.dao.BookDao;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; /**
* Created by accp on 2017/3/30.
*/
public class BookDaoImpl implements BookDao { private SessionFactory sessionFactory;
@Transactional
public int add(Book book) {
Serializable count = sessionFactory.getCurrentSession().save(book);
return (Integer) count;
} public SessionFactory getSessionFactory() {
return sessionFactory;
} public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
}
biz层(业务逻辑):
package cn.books.biz; import cn.books.beans.Book; /**
* Created by accp on 2017/3/30.
*/
public interface BookBiz {
int add(Book book);
}
biz的实现层:
package cn.books.biz.impl; import cn.books.beans.Book;
import cn.books.biz.BookBiz;
import cn.books.dao.BookDao; /**
* Created by accp on 2017/3/30.
*/
public class BookBizImpl implements BookBiz{ private BookDao dao;
public int add(Book book) {
return dao.add(book);
} public BookDao getDao() {
return dao;
} public void setDao(BookDao dao) {
this.dao = dao;
}
}
这些类创建完成了,接下我们就改配置applicationContext.xml了。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.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
">
<!--注入jdbc.properties-->
<context:property-placeholder location="classpath:jdbcmysql.properties"></context:property-placeholder>
<!--数据源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean> <!--sessionFactory配置-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<!--方言-->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<!--获取当前线程中的session-->
<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate5.SpringSessionContext</prop>
</props>
</property>
<!--关联小配置-->
<property name="mappingDirectoryLocations" value="classpath:cn/books/beans"></property>
</bean> <!--dao-->
<bean id="bookDao" class="cn.books.dao.impl.BookDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean> <!--biz-->
<bean id="bookBiz" class="cn.books.biz.impl.BookBizImpl">
<property name="dao" ref="bookDao"></property>
</bean> <!--事务管理器-->
<bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean> <tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven> </beans>
支持我们项目的一系列的jar包节点
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.3</version>
</dependency> <!--jta的jar包-->
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency> <!--mysql数据库驱动-->
<dependency>
<groupId>org.wisdom-framework</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34_1</version>
</dependency> <dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0..Final</version>
</dependency> <!--以上是HIbernate的jar包配置--> <!--下面是Spring相关的jar包配置-->
<!--c3p0-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency> <!--AOP的相关jar-->
<dependency>
<groupId> org.aspectj</groupId >
<artifactId> aspectjweaver</artifactId >
<version> 1.8.</version >
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2..RELEASE</version>
</dependency> <!--Spring-ORM-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version> 4.2..RELEASE</version>
</dependency> </dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
前期准备工作完成,最后进入测试阶段:
package cn.books.test; import cn.books.beans.Book;
import cn.books.biz.BookBiz;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* Created by accp on 2017/3/29.
*/
public class FirstTest {
@Test
public void findTwo(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContextbase.xml");
BookBiz proxy=(BookBiz) ctx.getBean("bookBiz");
int count = proxy.add(new Book("天空之城", ""));
System.out.println(count);
} }
结果:
DEBUG SQL: -
insert
into
Book
(name, price)
values
(?, ?)
Hibernate:
insert
into
Book
(name, price)
values
(?, ?)
DEBUG EntityPrinter: - cn.books.beans.Book{id=, price=, name=天空之城}
7
数据库数据:
使用查询功能:
添加方法:List<Book> selectAll();--------------->dao
private SessionFactory sessionFacctory;
@Transcational
public List<Book> selectAll() {
List<Book> list=sessionFactory.getCurrentSession().createCriteria(Book.class).list();
return list;
}
-------------------->dao.impl
List<Book> selectAll();--------------->biz
private BookDao dao;
public List<Book> selectAll(){
return dao.selectAll();
}
-------------------->biz.impl
applicationContext.xml配置文件不需要修改和添加,书写测试类即可。
@Test
public void findOne(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContextbase.xml");
BookBiz proxy=(BookBiz) ctx.getBean("bookBiz");
List<Book> list = proxy.selectAll();
for (Book item : list) {
System.out.println("名称:"+item.getName()+"\t价格:"+item.getPrice());
}
}
控制台上的数据显示:
DEBUG SQL: -
select
this_.id as id1_0_0_,
this_.name as name2_0_0_,
this_.price as price3_0_0_
from
Book this_
Hibernate:
select
this_.id as id1_0_0_,
this_.name as name2_0_0_,
this_.price as price3_0_0_
from
Book this_
::, DEBUG EntityPrinter: - Listing entities:
::, DEBUG EntityPrinter: - cn.books.beans.Book{id=, price=, name=天空}
::, DEBUG EntityPrinter: - cn.books.beans.Book{id=, price=, name=天空}
::, DEBUG EntityPrinter: - cn.books.beans.Book{id=, price=, name=天空}
::, DEBUG EntityPrinter: - cn.books.beans.Book{id=, price=, name=你好吗?天空}
::, DEBUG EntityPrinter: - cn.books.beans.Book{id=, price=, name=图书第二次}
::, DEBUG EntityPrinter: - cn.books.beans.Book{id=, price=, name=图书}
::, DEBUG EntityPrinter: - cn.books.beans.Book{id=, price=, name=天空之城}
::, DEBUG HibernateTransactionManager: - Closing Hibernate Session [SessionImpl(PersistenceContext[entityKeys=[EntityKey[cn.books.beans.Book#], EntityKey[cn.books.beans.Book#], EntityKey[cn.books.beans.Book#], EntityKey[cn.books.beans.Book#], EntityKey[cn.books.beans.Book#], EntityKey[cn.books.beans.Book#], EntityKey[cn.books.beans.Book#]],collectionKeys=[]];ActionQueue[insertions=ExecutableList{size=} updates=ExecutableList{size=} deletions=ExecutableList{size=} orphanRemovals=ExecutableList{size=} collectionCreations=ExecutableList{size=} collectionRemovals=ExecutableList{size=} collectionUpdates=ExecutableList{size=} collectionQueuedOps=ExecutableList{size=} unresolvedInsertDependencies=null])] after transaction
名称:图书 价格:
名称:图书第二次 价格:
名称:你好吗?天空 价格:
名称:天空 价格:
名称:天空 价格:
名称:天空 价格:
名称:天空之城 价格:
在整合Spring和Hibernate时候遇到的问题最多的就是:
Could not obtain transaction-synchronized Session for current thread
提示无法获取当前线程的事务同步session,略微奇怪,这和事务有什么关系..然后百度一下有人说改成用openSession方法就好了,那我又百度了一下这2个方法的区别:
(1)openSession每次打开都是新的Session,所以多次获取的Session实例是不同的,并且需要人为的调用close方法进行Session关闭。
(2)getCurrentSession是从当前上下文中获取Session并且会绑定到当前线程,第一次调用时会创建一个Session实例,如果该Session未关闭,后续多次获取的是同一个Session实例;事务提交或者回滚时会自动关闭Sesison,无需人工关闭。
现在我们所做的测试都是在控制台上打印输出的,还没涉及到在页面上显示数据,当我们在页面上获得数据时要在保证在同一个会话中完成,所以当我们使用openSession()方法时不会出现错误,但是当我们在当前线程内获取session时会出现上述的错误。。
解决办法:
在dao层的方法上面加上@Transcational注解,在applicationContext.xml中添加上:
<!--事务管理器-->
<bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean> <tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven>
或者换一种别的配置方法:
Aop方法
<!--事务管理器-->
<bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="select*" isolation="DEFAULT" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="point" expression="execution(* *..biz.*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="txAdvice" pointcut-ref="point"></aop:advisor>
</aop:config>
以上两种办法都可以解决上述的问题。。。。
整合初步______SH的更多相关文章
- 整合初步--------->SSH(注解版)
上面的一篇博客已经介绍了 Spring和Hibernate之间的整合,没看过的童鞋可以去看看,这篇博客讲解Spring+Hibernate+Struts2注解版......... 个人觉得使用注解可能 ...
- SSH环境搭建,配置整合初步(一)
1,新Webproject.并把编码设为utf-8(全部的都是uft8数据库也是,就不会乱码了)2.加入框架环境JunitStruts2Hibernate Spring3,整合SSHStruts2与S ...
- Ucenter整合Thinkphp 双向同步登录退出
1.整合初步工作: 1,安装Ucenter,完成后添加应用,填写要对接的网站地址 2,api , uc_client目录放置对接项目的根目录 3,通信对接,新建Ucenter组,confi文件填写在u ...
- Redis进阶实践之七Redis和Lua初步整合使用(转载 7)
Redis进阶实践之七Redis和Lua初步整合使用 一.引言 Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运 ...
- Redis进阶实践之七Redis和Lua初步整合使用
一.引言 Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入到大多数语言当 ...
- ssh整合思想初步 struts2与Spring的整合 struts2-spring-plugin-2.3.4.1.jar下载地址 自动加载Spring中的XML配置文件 Struts2下载地址
首先需要JAR包 Spring整合Structs2的JAR包 struts2-spring-plugin-2.3.4.1.jar 下载地址 链接: https://pan.baidu.com/s/1o ...
- ssh整合思想初步 structs2 Spring Hibernate三大框架各自要点
Web层用Structs2的action Service层用Spring的IoC和aop以及JdbcTemplate或者Transaction事务(创建对象及维护对象间的关系) Dao层用Hibern ...
- Spring Data初步--整合Hibernate
Spring Data课程中的技术介绍 Hibernate: Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,它将 pojo 与数据库表建立映射关系 ...
- liunx 安装ActiveMQ 及 spring boot 初步整合 activemq
源码地址: https://gitee.com/kevin9401/microservice.git 一.安装 ActiveMQ: 1. 下载 ActiveMQ wget https://arch ...
随机推荐
- .net是最牛逼的开发平台没有之一
.net是最牛逼的开发平台没有之一 .net是最牛逼的开发平台没有之一 .net是最牛逼的开发平台没有之一 .net是最牛逼的开发平台没有之一 .net是最牛逼的开发平台没有之一 .net是最牛逼的开 ...
- Python简单爬虫记录
为了避免自己忘了Python的爬虫相关知识和流程,下面简单的记录一下爬虫的基本要求和编程问题!! 简单了解了一下,爬虫的方法很多,我简单的使用了已经做好的库requests来获取网页信息和Beauti ...
- WC2015 k小割(k短路+暴力+搜索)
首先这道题不是非同一般的恶心,三个数据层次对应三个程序= = PROBLEM:http://uoj.ac/problems解法: 1~2直接暴力枚举边的选择与否+判断就行了 7~14可以发现是一个平面 ...
- BZOJ 1009 :[HNOI2008]GT考试(KPM算法+dp+矩阵快速幂)
这道到是不用看题解,不过太经典了,早就被剧透一脸了 这道题很像ac自动机上的dp(其实就是) 然后注意到n很大,节点很小,于是就可以用矩阵快速幂优化了 时间复杂度为o(m^3 *log n); 蒟蒻k ...
- TCP详解
1. 数据进入协议栈的封装过程 2. TCP连接的三次握手 3. TCP连接的三次握手和关闭时的四次握手 各个状态的意义如下: LISTEN - 侦听来自远方TCP端口的连接请求: SYN-SENT ...
- 深度神经网络(DNN)的正则化
和普通的机器学习算法一样,DNN也会遇到过拟合的问题,需要考虑泛化,这里我们就对DNN的正则化方法做一个总结. 1. DNN的L1&L2正则化 想到正则化,我们首先想到的就是L1正则化和L2正 ...
- 架构师之路——单一职责原则SRP (我单纯,我快乐)
定义: 不要存在多于一个导致类变更的原因.通俗地讲,一个类只做一件事情. 单一职责原则的好处: 1.类的复杂性降低,实现什么职责都有清晰明确的定义: 2.可读性提高,复杂性降低,那当然可读性提高了 ...
- 【Unity优化】我所理解的IL指令
版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 指令格式 英文单词全写 指令解释 nop no operation perform ...
- 视频直播SDK-ios版
IOS视频直播接入说明 一.名词解释 分辨率:用于计算机视频处理的图像,以水平和垂直方向上所能显示的像素数来表示分辨率.常见视频分辨率的有1080P即1920x1080,720P即1080x720,6 ...
- vs2017 .net core WebApp 去掉ApplicationInsights
vs2017新建的 .net core WebApp都内置了这个遥测中间件进去,嗯,用AZURE的话是不错能无缝支持.但不用AZURE就没什么用了. 为了不占地方和提高一点点初始启动的速度,对新建的项 ...