Integração da primavera de vários ORM

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. 

 

 

 

 

Publicado 203 artigos originais · ganhou elogios 6 · vista 4497

Acho que você gosta

Origin blog.csdn.net/weixin_42073629/article/details/105335806
Recomendado
Clasificación