Spring整合Hibernate方式一
持久层+业务层的整合
- 搭建环境,导入Spring和Hibernate的依赖包
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.10.Final</version>
</dependency>
<!-- for JPA, use hibernate-entitymanager instead of hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.2.10.Final</version>
</dependency>
<!-- optional -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-osgi</artifactId>
<version>5.2.10.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
<version>5.2.10.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>5.2.10.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-proxool</artifactId>
<version>5.2.10.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-infinispan</artifactId>
<version>5.2.10.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.2.10.Final</version>
</dependency>
<!-- 添加Spring包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<!-- 为了方便进行单元测试,添加spring-test包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<!--添加aspectjweaver包 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
-
根据需求做设计
数据库设计
文档:
概要设计:功能点列出来。
详细设计,接口层面(定义的类,方法,参数)
...
创建一个汽车表t_car
DROP TABLE IF EXISTS `t_car`;
CREATE TABLE `t_car` (
`cid` bigint(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`color` varchar(10) NOT NULL,
`description` varchar(100) NOT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
INSERT INTO `t_car` VALUES ('1', '兰博基尼', '绿色', '无限拉风的车子,无限装逼的车子');
INSERT INTO `t_car` VALUES ('3', '玛莎拉蒂', '蓝色', '千里马常有,而伯乐不常有');
INSERT INTO `t_car` VALUES ('4', '大众', '黑色', '千里马常有,而伯乐不常有');
-
创建Hibernate核心配置文件
下面介绍一下怎么使用Hibernate Tools插件生成Hibernate的配置文件,映射文件以及实体类
-
安装Hibernate Tools插件
到eclipse的商店里面安装jboss插件,jboss是很多插件整合在一起,我们只使用Hibernate Tools就可以了,所以在安装的时候记得只勾选Hibernate就行了
Hibernate Tools -
创建Hibernate核心配置文件(hibernate.cfg.xml)
把四大属性和方言配置好,其他属性按需要配置
hibernate.cfg.xml -
创建hiberenate的映射文件和实体类POJO
因为数据库的表已经创建好了,我们可以根据表来反转创建映射文件和实体类,具体操作如下:-
先创建反转文件
reveng.xml -
进行反转配置界面
Go
-
上面那个点击的图标可能没有,点击Window-Perspective-Custormize Perspective...-Action Set Availability勾选上Hibernate Code Generation即可
+ 配置
配置
配置
配置完成点击Run,自动生成映射文件和实体类
实体类:
public class TCar implements Serializable {
private Long cid;
private String name;
private String color;
private String description;
//getter setter方法
}
映射文件:(注意将映射文件注册到hibernate核心配置文件中去)
<hibernate-mapping auto-import="true" default-access="property" default-cascade="none" default-lazy="true">
<class catalog="spring" dynamic-insert="false" dynamic-update="false" mutable="true" name="com.cx.model.TCar" optimistic-lock="version" polymorphism="implicit" select-before-update="false" table="t_car">
<id name="cid" type="java.lang.Long">
<column name="cid"/>
<generator class="identity"/>
</id>
<property generated="never" lazy="false" name="name" optimistic-lock="true" type="string" unique="false">
<column length="20" name="name" not-null="true"/>
</property>
<property generated="never" lazy="false" name="color" optimistic-lock="true" type="string" unique="false">
<column length="10" name="color" not-null="true"/>
</property>
<property generated="never" lazy="false" name="description" optimistic-lock="true" type="string" unique="false">
<column length="100" name="description" not-null="true"/>
</property>
</class>
</hibernate-mapping>
- 创建持久层的接口和实现类
接口:
public interface CarDao {
void addCar(TCar car);
void deleteCar(Long id);
void updateCar(Long id,String color);
TCar findById(Long id);
}
实现类:
使用 Spring提供的模板类来整合持久层
不用写工具类:先得到SessionFactory再得到session
交给Spring.
使用了HibernateTemplate,本质上还是使用了Session.
public class CarDaoImpl implements CarDao {
private HibernateTemplate ht;
public void setHt(HibernateTemplate ht) {
this.ht = ht;
}
@Override
public void addCar(TCar car) {
ht.save(car);
}
@Override
public void deleteCar(Long id) {
ht.delete(ht.get(TCar.class, id));
}
@Override
public void updateCar(Long id, String color) {
TCar car = ht.get(TCar.class, id);
car.setColor(color);
ht.update(car);
}
@Override
public TCar findById(Long id) {
return ht.get(TCar.class, id);
}
}
- 开发业务层接口和实现类
接口:
public interface CarService {
void addCar(TCar car);
void deleteCar(Long id);
void updateCar(Long id,String color);
TCar findById(Long id);
}
实现类:
public class CarServiceImpl implements CarService {
private CarDao carDao;
public void setCarDao(CarDao carDao) {
this.carDao = carDao;
}
@Override
public void addCar(TCar car) {
carDao.addCar(car);
}
@Override
public void deleteCar(Long id) {
carDao.deleteCar(id);
}
@Override
public void updateCar(Long id, String color) {
carDao.updateCar(id, color);
}
@Override
public TCar findById(Long id) {
return carDao.findById(id);
}
}
-
Spring整合持久层Hibernate配置
Spring提供创建SessionFactory的Bean.(以前我们是使用工具类来创建的。)
Spring-Hibernate
<!-- 1. 由Spring来创建SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" >
<!-- 读取配置文件 -->
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>
<!-- 2.创建Spring提供的HiberanteTemplate模板对象,同时注入sessionFactory -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate" >
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 3.创建DAO对象,注入hibernateTemplate dao就具备session能力 -->
<bean id="carDao" class="com.cx.dao.impl.CarDaoImpl" >
<property name="ht" ref="hibernateTemplate"></property>
</bean>
<!-- 4.创建服务层对象,注入dao -->
<bean id="carService" class="com.cx.service.impl.CarServiceImpl" >
<property name="carDao" ref="carDao"></property>
</bean>
经过上面的配置,可以进行测试,但是只能进行查询的操作,因为增、删、改的操作必须要在事务环境下才能执行,所以下面通过AOP编程配置事务
配置事务
需要数据源对象
image.png
在上面配置的基础上添加下面的配置(事务配置)
<!-- 0.创建ComboPooledDataSource对象 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"></bean>
<!-- 5.创建Spring提供的事务管理通知对象 -->
<bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager" >
<property name="sessionFactory" ref="sessionFactory"></property>
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 6.配置Spring提供的事务通知切面 -->
<tx:advice id="txAdvice" transaction-manager="txManager" >
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 7.AOP编程 -->
<aop:config>
<aop:pointcut expression="execution(* com.cx.service.*.*(..))" id="shpoint"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="shpoint"/>
</aop:config>
事务配置也可使用注解配置,只需将上面配置的6,7去掉,添加
<!-- 6,7配置注解的AOP驱动,关联事务管理通知类 -->
<tx:annotation-driven transaction-manager="txManager"/>
在需要事务的类上添加注解:
@Transactional(value="txManager")
public class CarDaoImpl implements CarDao {...}
测试类如下:
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext2.xml");
CarService carService = ac.getBean("carService",CarService.class);
//查询
/*TCar car = carService.findById(1L);
System.out.println(car.getName()+"\t"+car.getColor()+"\t"+car.getDescription());*/
//增加
TCar car = new TCar();
car.setName("大众");
car.setColor("黑色");
car.setDescription("千里马常有,而伯乐不常有");
carService.addCar(car);
//修改
//carService.updateCar(3L, "蓝色");
//删除
//carService.deleteCar(2L);
}
}
网友评论