Struts2+Spring+Hibernate

在前面demo的基础上再整合Hibernate,首先导入需要的jar包。注意jar包之间的冲突会使项目启动报错。

用的是本机的mysql数据库,在src下建立jdbc.properties文件,内容如下:

jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jiesuanoa?characterEncoding=utf8

jdbc.username=root
jdbc.password=




cpool.checkoutTimeout=30000
cpool.minPoolSize=1
cpool.maxPoolSize=5
cpool.maxIdleTime=7200
cpool.maxIdleTimeExcessConnections=1800
cpool.acquireIncrement=3

#org.hibernate.dialect.MySQL5Dialect
#org.hibernate.dialect.OracleDialect

hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

#hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
#hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.show_sql=true
hibernate.format_sql=true
hibernate.query.substitutions=true 1, false 0
hibernate.jdbc.batch_size=20
hibernate.hbm2ddl.auto=update
hibernate.cache.use_query_cache=true
hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory
#hibernate.query.factory_class=org.hibernate.hql.classic.ClassicQueryTranslatorFactory
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
hibernate.cache.provider_configuration_file_resource_path=/ehcache-hibernate.xml

然后在spring配置文件applicationContext.xml中增加内容:

View Code
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee
="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context
="http://www.springframework.org/schema/context"
xmlns:aop
="http://www.springframework.org/schema/aop"
xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"

default-lazy-init
="true">

<!-- 扫描注解类 -->
<context:component-scan base-package="com.jiesuanoa">
</context:component-scan>

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:jdbc.properties</value>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<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>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingLocations">
<list>
<!--核心实体-->
<!--作用是找到并处理/com/jiesuanoa/core/entity路径下的所有.hbm.xml文件-->
<value>classpath:/com/jiesuanoa/core/entity/*.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.query.substitutions">${hibernate.query.substitutions}</prop>
<prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
<prop key="hibernate.query.factory_class">${hibernate.query.factory_class}</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">${hibernate.cache.provider_configuration_file_resource_path}</prop>
</props>
</property>
</bean>


<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!--使用注解的方式配置事务-->
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>

接着为实体类User建立对应的hbm.xml文件。

User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.jiesuanoa.core.entity">
<class name="User" table="CORE_USER">
<id name="id" type="long" column="ID"><generator class="native"/></id>
<property name="username" column="USER_NAME"/>
<property name="password" column="PASSWORD"/>
</class>
</hibernate-mapping>

然后就是建立持久层的Dao级Dao实现:

UserDao
import com.jiesuanoa.core.entity.User;

public interface UserDao {

public User save(User user);

public User findUser(User user);

public User delUser(User user);

public User updUser(User user);
/**
* 功能:根据用户名密码验证用户
* 作者: hbx
* 修改时间:2011-12-13 下午05:53:19
*
@param user
*
@return
*/
public User vldeByUP(User user);

}
UserDaoImpl
package com.jiesuanoa.core.dao.impl;


import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.jiesuanoa.core.dao.UserDao;
import com.jiesuanoa.core.entity.User;

@Repository
public class UserDaoImpl implements UserDao {

protected SessionFactory sessionFactory;

@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
protected Session getSession() {
Session session = sessionFactory.openSession();
return session;
}

public User delUser(User user) {
this.getSession().delete(user);
return user;
}

public User findUser(User user) {
return (User) this.getSession().get(User.class, user.getId());
}

public User save(User user) {
this.getSession().save(user);
return user;
}

public User updUser(User user) {
this.getSession().update(user);
return user;
}
public User vldeByUP(User user) {
return (User) this.getSession().createQuery("from User u where u.username=? and u.password=?").setParameter(0, user.getUsername()).setParameter(1, user.getPassword()).uniqueResult();
}

}

现在我们可以在业务层添加一个插入数据的方法:

UserMng
package com.jiesuanoa.core.manager;

import com.jiesuanoa.core.entity.User;

public interface UserMng {

public User validateUser(User user);

public User save(User user);
}
UserMngImpl
package com.jiesuanoa.core.manager.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jiesuanoa.core.dao.UserDao;
import com.jiesuanoa.core.entity.User;
import com.jiesuanoa.core.manager.UserMng;

@Service
public class UserMngImpl implements UserMng {

private UserDao userDao;

@Autowired
public void setUserDao(UserDao dao) {
this.userDao=dao;
}

public UserDao getUserDao() {
return this.userDao;

}
public User validateUser(User user) {
return this.getUserDao().vldeByUP(user);
}

public User save(User user) {
return this.getUserDao().save(user);
}
}

然后在项目下建立测试类:

View Code
package com.jiesuanoa.core.manager.test;

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.transaction.TransactionConfiguration;

import com.jiesuanoa.core.entity.User;
import com.jiesuanoa.core.manager.UserMng;


@TransactionConfiguration(transactionManager="transactionManager",defaultRollback=false)
@ContextConfiguration(value={"/applicationContext.xml","/coreContext.xml"})
public class UserMngTest extends AbstractTransactionalJUnit4SpringContextTests {

@Autowired
private UserMng userMng;

@Test
public void saveTest() {
User u=new User();
u.setPassword("1234");
u.setUsername("1234");
userMng.save(u);
}
@Test
public void vilidateUserTest() {
User u = new User();
u.setUsername("abc");
u.setPassword("123");
User user = userMng.validateUser(u);
System.out.println(user);
}
}

在上面的UserDaoImpl类里我们使用的getSession方法是用sessionFactory调用的openSession方法。但这并不可取,因为如果一个方法调用它并且里面有多个操作的话,每一个操作都需要打开一个新的session,我们可以修改成一个方法调用只打开一次session等方法结束的时候再关闭。1:

protected Session getSession() {
Session session = sessionFactory.getCurrentSession();
return session;
}

2:在业务层的UserMngImpl类加入@Transactional

View Code
package com.jiesuanoa.core.manager.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jiesuanoa.core.dao.UserDao;
import com.jiesuanoa.core.entity.User;
import com.jiesuanoa.core.manager.UserMng;

@Service
@Transactional
public class UserMngImpl implements UserMng {

private UserDao userDao;

@Autowired
public void setUserDao(UserDao dao) {
this.userDao=dao;
}

public UserDao getUserDao() {
return this.userDao;

}
public User validateUser(User user) {
return this.getUserDao().vldeByUP(user);
}

public User save(User user) {
return this.getUserDao().save(user);
}
}

用测试类进行测试,如果通过,那么就可以整合web页面添加业务方法了。






 

转载于:https://www.cnblogs.com/hubingxu/archive/2011/12/14/2287744.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值