A estrutura Spring fornece suporte integrado para ORM, incluindo Hibernate, Mybatis, JDO, JPA e Toplink da Oracle. A abordagem da Spring para a integração é quase a mesma. No entanto, a abordagem integrada do Spring não significa que todas as soluções ORM sejam iguais. Devemos decidir qual solução ORM usar com base no cenário específico. A seguir, explicaremos a integração das duas soluções ORM populares, Hibernate e Mybatis, por meio do Spring. Finalmente, a integração de outras soluções ORM será resumida para facilitar como obter suporte do Spring ao usar a solução ORM no futuro.
Primeiro, a integração do Hibernate no Spring
Em vista do uso da API do Hibernate, no processo prático de projetos específicos, também existem problemas comuns semelhantes ao gerenciamento de recursos e tratamento de exceções no uso da API do JDBC. O conceito bem-sucedido de Spring do JDBCTemplate encapsula o uso do Hibernate da mesma maneira, para que não seja necessário investir muita energia no gerenciamento de recursos e no tratamento de exceções. Ao mesmo tempo, o Spring também retira todas as transações relacionadas ao gerenciamento de tecnologia relacionada a dados através do AOP, o que evita ainda mais o emaranhamento de muitos aspectos.
1. O nascimento do HibernateTemplate
- Gerenciamento de recursos da sessão com base no HibernateTemplate
O SessionFactory do Hibernate, assim como o DataSource do JDBC, é o berço de todos os recursos de acesso a dados. Somente após a obtenção do suporte ao SessionFactory, o acesso subsequente aos dados pode continuar.O objetivo do SessionFactory é manipular transações . Existem 2 maneiras de obter o SessionFactory:
Código maneira:
Configuration config = new Configuration().configure("com/pojo/hibernate.cfg.xml");
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Injeção de IoC xml:
1) .LocalSessionFactoryBean
<!-- 方式一 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<!--添加映射文件
<property name="mappingResources">
<list>
<value>com/hisu/bean/User.hbm.xml</value>
</list>
</property>
-->
</bean>
<!-- 方式二 -->
<bean id="dataSorce"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="org.gjt.mm.mysql.Driver">
</property>
<property name="url" value="jdbc:mysql://localhost:3306/film"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
<property name="maxActive" value="25" />
<property name="maxWait" value="25" />
</bean>
<!-- 配置hibernate的sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSorce" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/hisu/bean/User.hbm.xml</value>
</list>
</property>
</bean>
2 An .AnnotationSessionFactoryBean
3) JNDI get SessionFactory
- Exceção específica de acesso a dados do Hibernate
A classe SessionFactoryUtils fornece um método estático converHibernateAccessException para converter HibernateException em Spring
public estático DataAccessException convertHibernateAccessException (HibernateException ex)
2. Use o HibernateDaoSupport para encapsular a API do Hibernate
public class PersonDAOImpl extends HibernateDaoSupport implements PersonDAO {
public List queryAll(int currentPage, int lineSize) throws Exception {
List<Person> all = new ArrayList<Person>();
String hql = "FROM Person AS p";
Session session = this.getSession(true);
Query q = session.createQuery(hql);
q.setFirstResult((currentPage - 1) * lineSize);
q.setMaxResults(lineSize);
all = q.list();
this.releaseSession(session);
return all;
}
public void insert(Person person) throws Exception{
this.getHibernateTemplate().save(person);
}
}
Injeção de IoC de mola xml
<!-- spring对hibernate的简单封装 -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="personDAOImpl" class="com.test.dao.impl.PersonDAOImpl">
<property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>
Para evitar o estouro de memória, o SessionFactory deve liberar a sessão manualmente; o HibernateTemplate libera a sessão automaticamente após o uso
Segundo, a integração de Mybatis pela Spring
1. O nascimento de SqlSessionTemplate
- Gerenciamento de recursos do SqlSession baseado em SqlSessionTemplate
SqlSessionFactory de Mybatis, que é o berço de todos os recursos de acesso a dados. O acesso subsequente aos dados poderá continuar apenas se o suporte do SessionFactory for obtido. Existem 2 maneiras de obter o SessionFactory:
Código maneira:
//加载mybatis的配置文件(它也加载关联的映射文件)
Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml");
//构建sqlSession的工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
reader.close();
Injeção de IoC xml: SqlSessionFactoryBean
<!-- spring集成mybatis集中管理session -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 引入数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 加载mybatis核心配置文件-->
<property name="configlocation" value="classpath:config/mybatis.cfg.xml"/>
<!-- 批量别名定义,自动扫描包,自动定义别名,别名就是类名(首字母大写或小写都可以) -->
<!-- <property name="typeAliasesPackage" value="com.huayuan.bean"></property> -->
<!-- 扫描sql配置文件,mapper.xml -->
<!-- <property name="mapperLocations" value="classpath:com/huayuan/mapper/*.xml"></property> -->
</bean>
- Acesso a dados anormais de Mybatis específicos
A classe SqlSessionUtils fornece conversão de exceção e processamento de transações
2.SqlSessionDaoSupport
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
private SqlSessionFactory sqlSessionFactory;
public SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public User selectUserById(int id) {
SqlSession session = this.getSqlSessionFactory().openSession();
User user = session.selectOne("user.selectUserById", id);
return user;
}
public int insertUser(User user) {
// TODO Auto-generated method stub
int result = 0;
SqlSession session = this.getSqlSessionFactory().openSession();
result = session.insert("user.insertUser", user);
session.commit();
return result;
}
}
Injeção de IoC de mola xml
<!-- 原始dao接口注入 -->
<bean id="userDao" class="cn.itcast.ssm.dao.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
Terceiro, a visão geral de integração do Spring de outras soluções ORM
Recordando a integração da Spring de várias tecnologias de acesso a dados, o foco principal está nos três pontos a seguir:
1. Gerenciamento de recursos de acesso a dados, envolvendo principalmente dois objetos de gerenciamento
- Fábrica de conexão (ConnectionFactory). O connection factory representa o conceito unificado de criar recursos da sessão de acesso a dados, que geralmente podem ser criados diretamente com o suporte de tecnologias específicas de acesso a dados ou por meio do JNDI e outros serviços para obter instâncias já criadas e configuradas. Para JDBC, a entidade correspondente ao conceito de connection factory é DataSource, Hibernate é SessionFactory, Mybatis é SqlSessionFactory ...
- Conexão (Conexão) ou recursos da sessão. A conexão é o link entre o cliente e o suporte de dados para comunicação de dados. Toda vez que o acesso aos dados é realizado, uma conexão deve ser obtida no connection factory especificado para concluir a operação de acesso a dados. Após a conclusão da operação, o recurso de conexão atual é fechado. Para JDBC, a conexão corresponde a java.sql.Connection, para Hibernate, corresponde a Session e, para Mybatis, é SqlSession ...
2. Traduza exceções específicas de acesso a dados, traduza essas exceções específicas no sistema de exceção unificado de acesso a dados do Spring, para que os clientes possam usar um método unificado para lidar de maneira transparente com as exceções de acesso a dados
3. O gerenciamento de transações específico da tecnologia de acesso a dados é unificado na camada de abstração do gerenciamento de transações do Spring, para que possamos gerenciar as transações de maneira unificada.