1、hibernate与spring整合
在我的理解力spring与hibernate的整合,无非是sessionfactory由spring创建。
配置文件如下
<!-- 3:spring整合hibernate的核心 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource">
</property>
<property name="configLocation">
<value>
classpath:hibernate.cfg.xml
</value>
</property>
</bean>
在这里我们还需要掌握hibernate的另一个知识点,如下一段代码很重要
HibernateDaoSupport这个类是hibernate与spring整合是才有的。非常重要。
public class CommonDaoImpl<T> extends HibernateDaoSupport implements CommonDao<T> {
/**T型转换*/
Class entityClass = TUtil.getActualType(this.getClass());
@Resource(name="sessionFactory")
public void setDi(SessionFactory sessionFactory){
this.setSessionFactory(sessionFactory);
}
下面这段代码在写基类时,貌似百分百用到
public static Class getActualType(Class entity) {
ParameterizedType parameterizedType = (ParameterizedType) entity.getGenericSuperclass();
Class entityClass = (Class) parameterizedType.getActualTypeArguments()[0];
return entityClass;
}
下面给几个方法吧,掌握这些基本上spring与hibernate的整合也就没啥了
public void save(T entity) {
this.getHibernateTemplate().save(entity);
}
/**更新*/
public void update(T entity) {
this.getHibernateTemplate().update(entity);
}
/**使用主键ID,查询对象*/
public T findObjectByID(Serializable id) {
return (T) this.getHibernateTemplate().get(entityClass, id);
}
public T findObjectBySno(Serializable sno) {
return (T) this.getHibernateTemplate().get(entityClass, sno);
}
/**删除(使用主键ID删除)*/
public void deleteObjectByIds(Serializable... ids) {
if(ids!=null && ids.length>0){
for(Serializable id:ids){
//先查询
Object entity = this.findObjectBySno(id);
//再删除
this.getHibernateTemplate().delete(entity);
}
}
}
接下来讲解spring与struts2的整合
这个整合其实就是struts动作类的对象由spring创建,更重要的是它是javaweb的集合,已启动容器,我们所说的启动tomcat,spring就要工作起来,
如果要实现struts的对象由spring创建,那么我们要做哪些配置呢。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:beans.xml</param-value>
</context-param>
<filter>
<display-name>SystemUtils</display-name>
<filter-name>SystemUtils</filter-name>
<filter-class>jsu.java.ld.utls.SystemUtils</filter-class>
</filter>
<filter-mapping>
<filter-name>SystemUtils</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>SystemUtils</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.do</url-pattern>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
其实这个注解就两层含义,已启动tomcat,spring就工作起来,创建对象,通过监听器实现,
下面还有一个注解是告诉struts,动作类的对象由spring创建。
下面我们来学习一下spring 和mybatis整合把
首先sqlsesion由spring来创建,看配置文件
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置SqlMapConfig.xml -->
<property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"/>
</bean><pre name="code" class="html"><bean id="userDao" class="cn.itcast.ssm.dao.old.UserDaoImpl">
注入会话工厂
<property name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
</bean>
同时dao层编写案例
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
@Override
public User findUserById(int id) throws Exception {
//创建SqlSession
SqlSession sqlSession = this.getSqlSession();
return sqlSession.selectOne("test.findUserById", id);
}
}
mybatis还提供了我们一个更好的东西,动态代理
我们只需要写dao层接口就可以了
首先配置mybatis文件
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!--mybatis sessionFactory配置-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 读取配置文件,在xml中需要用classpath,如果是指明哪个包,或哪个类,就如同import一样 -->
<!-- <property name="mapperLocations" value="classpath:jsu/java/ld/core/dao/*.xml"/> -->
<!--别名 -->
<property name="typeAliasesPackage" value="jsu.java.ld.core.bean"/>
</bean>
<!-- 扫包 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="jsu.java.ld.core.dao"/>
</bean>
</beans>
但是这里要注意,xml文件和dao接口前缀名相同,并且在相同目录下,原因下段配置。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="jsu.java.ld.core.dao"/>
</bean>