`

spring日记(九):整合其他ORM框架

阅读更多

>> 在spring中使用myBatis

mybatis没有特殊的事务策略,除了JDBC Connection外,也没有特殊的事务资源。它和spring JDBC事务管理方式完全一致,采用和spring JDBC相同的DataSourceTransactionManager事务管理器。

第一种方式:

先看一下myBatisConfig.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="lazyLoadingEnabled" value="false" />
    </settings>
    <typeAliases>
        <typeAlias alias="Forum" type="com.baobaotao.domain.Forum" />
        <typeAlias alias="Topic" type="com.baobaotao.domain.Topic" />
        <typeAlias alias="Post" type="com.baobaotao.domain.Post" />
    </typeAliases>
     
    <mappers>
        <mapper resource="com/baobaotao/domain/mybatis/Forum.xml" />
        <mapper resource="com/baobaotao/domain/mybatis/Topic.xml" />
        <mapper resource="com/baobaotao/domain/mybatis/Post.xml" />
    </mappers>
</configuration>

再看下单个DAO的sql语句映射文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.baobaotao.dao.mybatis.ForumMybatisDao">
    <select id="getForum" resultType="Forum" parameterType="int" >
        SELECT 
         forum_id  forumId,
         forum_name  forumName,
         forum_desc  forumDesc
        FROM t_forum 
        WHERE forum_id = #{forumId}
   </select>
    <select id="getForumNum" resultType="int">
        SELECT COUNT(forum_id) FROM t_forum f
  </select>
    <select id="findForumByName" resultType="Forum" parameterType="string">
        SELECT 
         forum_id  forumId,
         forum_name  forumName,
         forum_desc  forumDesc
        FROM t_forum f
        WHERE f.forum_name LIKE #{forumName}
  </select>
 <insert id="addForum" parameterType="Forum">
        INSERT INTO t_forum(forum_id,forum_name,forum_desc)
        VALUES(#{forumId},#{forumName}, #{forumDesc})
  </insert>
  <update id="updateForum" parameterType="Forum">
        UPDATE t_forum f
        SET forum_name=#{forumName},forum_desc=#{forumDesc}
        WHERE f.forum_id = #{forumId}
  </update>
</mapper>

接下来引入mabatis-spring的依赖jar包,然后配置spring的配置文件:

<?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:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    //http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    //http://www.springframework.org/schema/context
    //http://www.springframework.org/schema/context/spring-context-3.0.xsd
    //http://www.springframework.org/schema/tx
    //http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
    <context:component-scan base-package="com.baobaotao.dao.mybatis" />
    <context:component-scan base-package="com.baobaotao.service.mybatis" />
    <context:property-placeholder location="classpath:jdbc.properties" />
    <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close"
        p:driverClassName="com.mysql.jdbc.Driver"
        p:url="jdbc:mysql://localhost:3306/sampledb"
        p:username="root"
        p:password="123456" />
         
    <bean id="sqlSessionFactory"
      class="org.mybatis.spring.SqlSessionFactoryBean"
      p:dataSource-ref="dataSource"
      p:configLocation="classpath:myBatisConfig.xml"
      p:mapperLocations="classpath:com/baobaotao/domain/mybatis/*.xml"/>
     
   <bean class="org.mybatis.spring.SqlSessionTemplate">
      <constructor-arg ref="sqlSessionFactory"/>
   </bean> 
       
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
          p:sqlSessionFactory-ref="sqlSessionFactory"
          p:basePackage="com.baobaotao.dao.mybatis"/>
      
     <bean id="transactionManager"
         class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
         p:dataSource-ref="dataSource"/>
          
     <tx:annotation-driven transaction-manager="transactionManager"/>     
</beans>

使用SqlSessionTemplate模板类编写mybatis的DAO:

第一步是在spring中配置好SqlSessionTemplate 这个Bean:

<bean class="org.mybatis.spring.SqlSessionTemplate">
   <constructor-arg ref="sqlSessionFactory"/>
</bean>

接下来编写DAO:

package com.baobaotao.dao.mybatis;
 
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
 
import com.baobaotao.domain.Forum;
 
@Repository
public class ForumMybatisTemplateDao{
    
   @Autowired
   private SqlSessionTemplate sessionTemplate;
    
   public Forum getForum(int forumId){
       return (Forum)sessionTemplate.selectOne(
               "com.baobaotao.dao.mybatis.ForumMybatisDao.getForum",
               forumId);  
   }
}

第二种方式:

实际上,在上面使用SqlSessionTemplate直接去调用SQL映射项的时候必须要使用com.baobaotao.dao.mybatis.ForumMybatisDao.getFrum这个字符串去定位statement。这个字符串是很容易出错的,而且编译器不会报错。

下面使用映射接口,非常强大,非常方便:

mybatis特别提供了一种可将SQL映射文件中的映射项通过名称匹配接口进行调用的方法:接口的名称和映射命名空间相同,接口方法和映射的ID相同。

下面我们为Forum.xml定义一个调用接口:

package com.baobaotao.dao.mybatis;
 
import java.util.List;
 
import com.baobaotao.domain.Forum;
 
public interface ForumMybatisDao{
    void addForum(Forum forum); 
    void updateForum(Forum forum) ;
    Forum getForum(int forumId) ;
    long getForumNum() ;
    List<Forum> findForumByName(String forumName);
}

类名为:com.baobaotao.dao.mybatis.ForumMybatisDao,Forum.xml中的每个映射项对应一个接口方法,接口方法的签名和映射项的声明匹配。

定义好了这个DAO接口后,下面通过SqlSessionTemplate获取接口实例:

public Forum getForum2(int forumId){
    ForumMybatisDao forumMybatisDao =
        sessionTemplate.getMapper(ForumMybatisDao.class);
    return forumMybatisDao.getForum(forumId);
}

这种方法也有缺点,就是必须要比之前直接用字符串多写几个接口,每个Sql Mapper的xml文件都要写个接口。比较安全,不过通过getMapper方法(Class<T> type)这个还不是最优的方法。对于spring应用来讲,我们更希望在Service类中通过@Autowired的方法直接注入接口实例,而非每次都通过getMapper(Class<T> type)来获取DAO的实例。

第三种方式:

mybatis-spring提供了一个神奇的转换器MapperScannerConfigurer,它可以将映射接口直接装换为spring容器中的bean,这样你就可以在service类中直接注入映射接口的bean了。

假设我们已经为三个SQL映射文件分别定义了对应的接口类,使用如下配置可以将接口装换为Bean:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
      p:sqlSessionFactoryBeanName="sqlSessionFactory"
      p:basePackage="com.baobaotao.dao.mybatis"/>

然后我们就可以在service里面直接注入DAO了,尼玛整个DAO层就几个SQL Mapper配置文件夹外加几个接口类了。

import java.util.List;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import com.baobaotao.dao.mybatis.ForumMybatisDao;
import com.baobaotao.dao.mybatis.PostMybatisDao;
import com.baobaotao.dao.mybatis.TopicMybatisDao;
import com.baobaotao.domain.Forum;
import com.baobaotao.domain.Post;
import com.baobaotao.domain.Topic;
 
@Transactional
@Service
public class BbtForumSerive{
     
    @Autowired
    private ForumMybatisDao forumDao;
     
    @Autowired
    private TopicMybatisDao topicDao;
     
    @Autowired
    private PostMybatisDao postDao;
     
    public void addForum(Forum forum) {
        forumDao.addForum(forum);
    }
    public void addTopic(Topic topic) {
        topicDao.addTopic(topic);
    }
        ......
 
}

注意上面的@Transactional注解,可以在spring配置文件中声明式事务,直接扫描注解,非常强大,这个之前的spring事务章节已经讲过了,不多说鸟 –

总结:以上三个使用方式,一个比一个方便安全,所以第三种spring方式的最优,优先使用第三种方式。

>> 谈谈DAO层的设计:

对于使用Hibernate的应用来讲,可以定义一个BaseDao的泛型类,在其中实现泛型参数化查找更新操作等,可以极大的提高效率:

package com.baobaotao.dao;
 
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
 
public class BaseDao<T> { 
     
   @Autowired  
   private HibernateTemplate hibernateTemplate;
   private Class entityClass;
    
   public BaseDao(){
        Type genType = getClass().getGenericSuperclass();
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
        entityClass = (Class) params[0];
    }
    
    public T get(Serializable id){
        return (T)hibernateTemplate.get(entityClass, id);
    }
     
    public void save(T entity){
        hibernateTemplate.save(entity);
    }
     
    public void update(T entity){
        hibernateTemplate.update(entity);
    }
 
    public HibernateTemplate getHibernateTemplate() {
        return hibernateTemplate;
    }
     
}

最后,关于参数传递的方法:最佳实践是使用Map parms的形式:

List<Order> findOrder(String sql, Map params)

>> 分页查询接口设计

分页技术大致可以分成三种:

* 客户端分页:直接将全部多页结果一次性返回客户端,客户端通过展览细件前台js实现分页

* 数据库分页:每次查询数据只有一页数据

* 服务器端分页:从数据库返回全部数据,在服务器端缓冲起来,但只返回一页给客户端

第三种服务器分页既能够提高系统交互性,又能有效减小数据库访问次数,因此最优,但是又要涉及到数据缓冲、同步等问题,因此复杂性比较高。但俗话说的好,不入虎穴不得虎子(⊙o⊙),最终的王道还是钻研技术,才能做出高可靠高可用高性能的应用了来。

 

本人博客已搬家,新地址为:http://yidao620c.github.io/

分享到:
评论
1 楼 mohaowen1989 2014-04-24  
总体上还行吧,勉勉强强

相关推荐

    Spring整合其他ORM框架

    整合 Spring 与其他 ORM 框架,需要理解 Spring 的核心概念,如 Bean 容器、依赖注入以及 AOP 等,同时也需熟悉 ORM 框架自身的特性和使用方式。正确配置相关 jar 包,如 `spring-orm-3.2.0.RELEASE.jar`,是确保...

    spring-orm-5.0.8.RELEASE-API文档-中英对照版.zip

    赠送jar包:spring-orm-5.0.8.RELEASE.jar; 赠送原API文档:spring-orm-5.0.8.RELEASE-javadoc.jar; 赠送源代码:spring-orm-5.0.8.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-orm-5.0.8.RELEASE.pom;...

    02-01-11-基于Spring JDBC手写定制自己的ORM框架1

    在本课程"02-01-11-基于Spring JDBC手写定制自己的ORM框架1"中,我们将探讨如何利用Spring的JdbcTemplate设计理念,来构建一个自定义的ORM(对象关系映射)框架。ORM框架的主要目的是简化Java应用程序与数据库之间的...

    spring-orm-4.2.2.RELEASE-API文档-中文版.zip

    赠送jar包:spring-orm-4.2.2.RELEASE.jar; 赠送原API文档:spring-orm-4.2.2.RELEASE-javadoc.jar; 赠送源代码:spring-orm-4.2.2.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-orm-4.2.2.RELEASE.pom;...

    spring-orm-5.0.8.RELEASE-API文档-中文版.zip

    赠送jar包:spring-orm-5.0.8.RELEASE.jar; 赠送原API文档:spring-orm-5.0.8.RELEASE-javadoc.jar; 赠送源代码:spring-orm-5.0.8.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-orm-5.0.8.RELEASE.pom;...

    spring整合其他框架

    本篇文章将详细讲解Spring如何与其他知名框架进行整合,以实现更高效的应用开发。 1. Spring与ActiveMQ整合:ActiveMQ是Apache出品的一款开源消息中间件,用于处理异步通信和消息传递。Spring通过JMS(Java消息服务...

    Spring数据库访问之ORM(三)

    本篇文章将深入探讨Spring如何实现ORM,主要以JPA(Java Persistence API)和Hibernate为例,同时也会涉及MyBatis等其他ORM框架。 一、Spring与ORM简介 ORM技术的主要目的是简化数据库操作,通过将数据库表映射为...

    spring-orm-4.2.2.RELEASE-API文档-中英对照版.zip

    赠送jar包:spring-orm-4.2.2.RELEASE.jar; 赠送原API文档:spring-orm-4.2.2.RELEASE-javadoc.jar; 赠送源代码:spring-orm-4.2.2.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-orm-4.2.2.RELEASE.pom;...

    spring-orm.jar

    4. 对象/关系映射工具:Spring ORM为不同的ORM框架提供统一的API,减少学习成本,同时提高了代码的可移植性。 三、Spring与Hibernate的集成 Spring与Hibernate的集成是Spring ORM的一个典型应用场景。Spring通过...

    "Spring框架3.2版本的JAR包"

    spring-orm: 整合ORM框架,如Hibernate、JPA,优化数据库操作。 spring-aop: 支持AOP切面定义与执行,处理日志、事务等横切关注点。 spring-tx: 提供透明的事务管理,兼容编程式与声明式策略。 spring-jms: JMS支持...

    三大框架整合所需要的jar包

    在Java Web开发中,"三大框架"通常指的是Spring、Hibernate和Struts,它们分别负责不同的职责:Spring作为全面的应用框架,提供了依赖注入、AOP(面向切面编程)、任务调度等核心功能;Hibernate是一个强大的ORM...

    开发者突击:Java Web主流框架整合开发:J2EE+Struts+Hibernate+Spring 部分例子源代码 及数据库

    在这个体系中,Struts、Hibernate和Spring是三个非常重要的开源框架,它们分别在MVC(Model-View-Controller)架构、对象关系映射(ORM)以及依赖注入(DI)和面向切面编程(AOP)方面发挥着关键作用。这些框架的...

    spring学习:hibernate orm集成

    Spring和Hibernate是两个非常流行的Java开发框架,Spring提供了全面的企业级应用开发解决方案,而Hibernate则是Java领域中最著名的ORM框架之一。本文将详细介绍如何在Spring项目中集成Hibernate,实现高效的数据库...

    examination_system-:基于SSM + Bootstrap的教务查询系统,是一个简单的教务查询系统,起初用于熟悉SSM的集成开发,使用技术。IOC容器:Spring Web框架:SpringMVC ORM框架:Mybatis数据源:C3P0日志:log4j前端框架: Bootstrap运行环境jdk8 + tomcat8 + mysql + Eclipse + maven项目技术(必填)spring + spring mvc + mybatis + bootstrap + jquery,系

    IOC容器:Spring Web框架:SpringMVC ORM框架:Mybatis数据源:C3P0日志:log4j前端框架:Bootstrap运行环境jdk8 + tomcat8 + mysql + Eclipse + maven项目技术:spring + spring mvc + mybatis + bootstrap + ...

    开发者突击:Java Web主流框架整合开发源代码

    【开发者突击:Java Web主流框架整合开发源代码】是一份专为Java Web开发人员准备的实践教程,旨在帮助他们深入理解和应用J2EE、Struts、Hibernate和Spring四大主流框架进行整合开发。这个资源包包含了丰富的源代码...

    Java Spring框架依赖包

    9. spring-webmvc:Spring MVC模块,用于构建Web应用。 10. spring-orm:支持各种ORM框架,如Hibernate和JPA。 在实际开发中,根据项目需求,可能还需要引入其他Spring相关的模块,例如spring-security用于安全控制...

    (最新)spring+spring mvc+mybatis 整合需要的jar包

    它可以与任何Java ORM框架集成,如Spring,以实现更高级的功能。 **整合SSM**: 整合SSM涉及到以下步骤: 1. **配置Spring**:设置Spring的配置文件,声明bean并进行依赖注入,包括数据源、SqlSessionFactory、...

    ZK+spring+hibernate的整合

    《ZK+Spring+Hibernate整合详解》 ZK、Spring和Hibernate是Java开发中的三大重要框架,它们分别在用户界面、依赖注入与事务管理、持久层操作方面发挥着关键作用。将这三者进行整合,可以构建出高效、稳定且易于维护...

    sqltoy-orm是比JPA+MyBatis更加贴合项目的orm框架(依赖spring)

    7. **良好的扩展性**:SqlToy-ORM设计时考虑了扩展性,可以方便地与其他框架和组件进行集成。 综上所述,SqlToy-ORM是针对Java项目的一款优秀ORM解决方案,尤其适合那些期望在Spring环境下拥有高效率和便捷性的数据...

    spring.zip

    6. **Spring ORM**:这一模块为整合流行ORM框架提供支持,如Hibernate、JPA、iBatis等,使得在Spring中使用这些框架更加方便。 7. **Spring Aspects**:提供了对AspectJ的集成,使得可以在Spring应用中使用更强大的...

Global site tag (gtag.js) - Google Analytics