MyBatis无缝对接Spring的方法

1.为什么会出现MyBatis-Spring

Spring框架与MyBatis框架是Java互联网技术的主流框架。但是如何将MyBatis无缝整合到Spring框架中呢?这时候就诞生了MyBatis-Spring。使用这个类库中得类,Spring将会加载必要的MyBatis工厂类和session类。

Spring3.0也仅仅支持ibatis2.0。本来将MyBatis3的支持添加到Spring3.0中。而不幸,Spring3.0的开发在MyBatis3.0官方发布前就结束了。因为Spring开发团队不想发布一个非发布版的MyBatis的整合支持。就放弃了对MyBatis的支持。

随着Spring越来越成为java事实标准的技术框架。Spring 4.0 移除了对iBatis的直接支持。MyBatis团队开发出来了基于Spring的MyBatis整合Jar---MyBatis-Spring。

2.使用MyBatis-Spring的好处

1.使得业务层和模型层得到更好的分离。再Spring框架中MyBatis也更加简单,节约不少的代码

2.甚至不需要显示的使用SqlSessionFactory、SqlSessiond等对象

3.MyBatis-Spring组成部分

1.配置数据源

2.配置SqlSessionFactory

3.配置SqlSessionTemplate

4.配置Mapper

5.事务处理

MyBatis中要构建SqlSessionFactory对象,让它产生SqlSession,而在MyBatis-Spring项目中SqlSession的使用是通过SqlSessionTemplate来实现的,它提供了对SqlSession操作的封装。所以可以通过SqlSessionTemplate可以得到Mapper。

4.在Spring MVC中配置

4.1 配置SqlSessionFactoryBean

在基本的 MyBatis中,session工厂可以使用SqlSessionFactoryBuilder 来创建。而在 MyBatis-Spring 中,则使用 SqlSessionFactoryBean 来替代。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
 <property name="dataSource" ref="dataSource" />
</bean>

注意点

SqlSessionFactory 有一个单独的必须属性,就是 JDBC 的 DataSource

在SqlSessionFactoryBean的返回getObject的时候,有个验证。

@Override
 public SqlSessionFactory getObject() throws Exception {
  if (this.sqlSessionFactory == null) {
   afterPropertiesSet();
  }

  return this.sqlSessionFactory;
 }
 @Override
 public void afterPropertiesSet() throws Exception {
  notNull(dataSource, "Property 'dataSource' is required");
  notNull(sqlSessionFactoryBuilder, "Property 'sqlSessionFactoryBuilder' is required");
  state((configuration == null && configLocation == null) || !(configuration != null && configLocation != null),
       "Property 'configuration' and 'configLocation' can not specified with together");
  this.sqlSessionFactory = buildSqlSessionFactory();
 }

4.2配置datasource

这里我们使用的是阿里巴巴的数据库连接池。https://github.com/alibaba/druid

compile group: 'com.alibaba', name: 'druid', version: '1.1.2'
<!--阿里巴巴的数据库连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  <!-- 基本属性 url、user、password -->
  <property name="url" value="${jdbc_url}"/>
  <property name="username" value="${jdbc_user}"/>
  <property name="password" value="${jdbc_password}"/>
</bean>

4.3配置数据库链接属性

在resource目录下创建properties文件夹,并创建datasource.properties

jdbc_url=jdbc:mysql://localhost:3306/cnblogs?serverTimezone=Asia/Shanghai&characterEncoding=utf8
jdbc_user=root
jdbc_password=root

使用阿里巴巴的数据库连接池是无需配置数据库驱动。是根据url的前缀来判断的

4.4配置Spring加载配置属性及配置替换动态标签

<!--加载配置文件路径-->
<bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="location" value="classpath:properties/datasource.properties"></property>
</bean>
<!--获取配置属性之后动态替换标签-->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
  <property name="properties" ref="configProperties"/>
</bean>

4.5配置Spring自动创建Mapper接口的bean

MyBatis-Spring提供了一个转换器MapperScannerConfigurer,可以将映射接口转换为Spring容器中Bean。这样就可以在代码中注入映射的bean

<!--采用自动扫描方式创建Mapper Bean-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  <property name="basePackage" value="com.cnblogs.dao"></property>
</bean>

basePackage属性是让你为映射器接口文件设置基本的包路径。 你可以使用分号或逗号作为分隔符设置多于一个的包路径。每个映射器将会在指定的包路径中递归地被搜索到。

4.6配置事务

MyBatis和Spring结合后是使用Spring AOP去管理事务的,使用Spring AOP是相当的简单的,它分为声明式事务和编程性事务。大部分场景下使用声明式事务就可以了。

引入Jar包

compile group: 'org.springframework', name: 'spring-tx', version: '4.3.10.RELEASE'
compile group: 'org.springframework', name: 'spring-jdbc', version: '4.3.10.RELEASE'
<!--事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource" />
</bean>
<!--使用声明式事务管理方式-->
<tx:annotation-driven transaction-manager="transactionManager"/>

5.完整的Spring xml配置及引用的Jar包

引入的Jar列表

compile group: 'org.springframework', name: 'spring-webmvc', version: '4.3.10.RELEASE'
compile group: 'org.springframework', name: 'spring-tx', version: '4.3.10.RELEASE'
compile group: 'org.springframework', name: 'spring-jdbc', version: '4.3.10.RELEASE'
compile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
compile group: 'org.mybatis', name: 'mybatis-spring', version: '1.3.1'
compile group: 'org.mybatis', name: 'mybatis', version: '3.4.5'
compile group: 'mysql', name: 'mysql-connector-java', version: '6.0.6'
compile group: 'com.alibaba', name: 'druid', version: '1.1.2'

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:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
  <!--spring可以自动去扫描base-pack下面的包或者子包下面的Java文件-->
  <context:component-scan base-package="com.cnblogs.controller,com.cnblogs.service,com.cnblogs.dao"/>
  <!--自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdpter-->
  <mvc:annotation-driven/>
  <!-- 对静态资源文件的访问-->
  <mvc:default-servlet-handler/>
  <!--加载配置文件路径-->
  <bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="location" value="classpath:properties/datasource.properties"></property>
  </bean>
  <!--获取配置属性之后动态替换标签-->
  <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
    <property name="properties" ref="configProperties"/>
  </bean>
  <!--阿里巴巴的数据库连接池-->
  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
    <!-- 基本属性 url、user、password -->
    <property name="url" value="${jdbc_url}"/>
    <property name="username" value="${jdbc_user}"/>
    <property name="password" value="${jdbc_password}"/>
  </bean>
  <!--构建SqlSessionFactory-->
  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:config/mybatis-config.xml"/>
    <property name="mapperLocations" value="classpath:mappers/*.xml"/>
  </bean>
  <!--采用自动扫描方式创建Mapper Bean-->
  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.cnblogs.dao"></property>
  </bean>
  <!--事务管理器-->
  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
  </bean>
  <!--使用声明式事务管理方式-->
  <tx:annotation-driven transaction-manager="transactionManager"/>
  <!--视图解析器-->
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/content"></property>
    <property name="suffix" value=".jsp"></property>
  </bean>
</beans>

总结

以上所述是小编给大家介绍的MyBatis无缝对接Spring的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 基于SpringBoot与Mybatis实现SpringMVC Web项目

    一.热身 一个现实的场景是:当我们开发一个Web工程时,架构师和开发工程师可能更关心项目技术结构上的设计.而几乎所有结构良好的软件(项目)都使用了分层设计.分层设计是将项目按技术职能分为几个内聚的部分,从而将技术或接口的实现细节隐藏起来. 从另一个角度上来看,结构上的分层往往也能促进了技术人员的分工,可以使开发人员更专注于某一层业务与功能的实现,比如前端工程师只关心页面的展示与交互效果(例如专注于HTML,JS等),而后端工程师只关心数据和业务逻辑的处理(专注于Java,Mysql等).两者之间

  • 详解Spring Boot整合Mybatis实现 Druid多数据源配置

    一.多数据源的应用场景 目前,业界流行的数据操作框架是 Mybatis,那 Druid 是什么呢? Druid 是 Java 的数据库连接池组件.Druid 能够提供强大的监控和扩展功能.比如可以监控 SQL ,在监控业务可以查询慢查询 SQL 列表等.Druid 核心主要包括三部分: 1. DruidDriver 代理 Driver,能够提供基于 Filter-Chain 模式的插件体系. 2. DruidDataSource 高效可管理的数据库连接池 3. SQLParser 当业务数据量达

  • SpringMVC与Mybatis集合实现调用存储过程、事务控制实例

    在SSM框架中经常会用到调用数据库中的存储过程.以及事务控制,下面以保存某单据为例,介绍一下: 1.Oracle中存储过程代码如下(主要逻辑将单据编码自动加1,并将该单据编码返回): CREATE OR REPLACE PROCEDURE "UPDATE_DJBHZT" (p_GSID in varchar2, p_TBLNAME in varchar2, NewRecNo out Number) as begin update BHDJ set BHDJ02 = BHDJ02+1 w

  • Spring Boot MyBatis 连接数据库配置示例

    最近比较忙,没来得及抽时间把MyBatis的集成发出来,其实mybatis官网在2015年11月底就已经发布了对SpringBoot集成的Release版本,示例代码:spring-boot_jb51.rar 前面对JPA和JDBC连接数据库做了说明,本文也是参考官方的代码做个总结. 先说个题外话,SpringBoot默认使用 org.apache.tomcat.jdbc.pool.DataSource 现在有个叫 HikariCP 的JDBC连接池组件,据说其性能比常用的 c3p0.tomca

  • SpringMvc+Mybatis+Pagehelper分页详解

    最近公司需要做一个告警页面的功能,需要分页,查了很多资料发现PageHelper比较合适 故写一篇从零开始的PageHelper使用的教程,也记录下忙活一天的东西 1.首先需要在项目中添加PageHelper的依赖,这里我用的Maven添加 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>

  • springboot + mybatis配置多数据源示例

    在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1)DatabaseType列出所有的数据源的key---key 2)DatabaseContextHolder是一个线程安全的DatabaseType容器,并提供了向其中设置和获取DatabaseType的方法 3)DynamicDataSource继承AbstractRoutingDataSource并重写其中的方法determineCurrentLookupKey(),在该方法中使用Da

  • MyBatis无缝对接Spring的方法

    1.为什么会出现MyBatis-Spring Spring框架与MyBatis框架是Java互联网技术的主流框架.但是如何将MyBatis无缝整合到Spring框架中呢?这时候就诞生了MyBatis-Spring.使用这个类库中得类,Spring将会加载必要的MyBatis工厂类和session类. Spring3.0也仅仅支持ibatis2.0.本来将MyBatis3的支持添加到Spring3.0中.而不幸,Spring3.0的开发在MyBatis3.0官方发布前就结束了.因为Spring开发

  • Mybatis MapperScannerConfigurer自动扫描Mapper接口生成代理注入到Spring的方法

    前言 Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring Mybatis在与Spring集成的时候可以配置 MapperFactoryBean来生成Mapper接口的代理. 例如: <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mappe

  • spring中使用mybatis plus连接sqlserver的方法实现

    本文主要关注如何使用mybatis/mybatis plus连接SQL Server数据库,因此将省略其他项目配置.代码. 框架选择 应用框架:spring boot ORM框架:mybatis plus(对于连接数据库而言,mybatis和mybatis plus其实都一样) 数据库连接池:druid pom依赖 此处仅给出我的配置,mybatis/druid请依据自己项目的需要进行选择. 方便起见我用的是mybatis plus <!--mybatis plus --> <depen

  • 使用XSD校验Mybatis的SqlMapper配置文件的方法(2)

    在上篇文章给大家介绍了使用XSD校验Mybatis的SqlMapper配置文件的方法(1),需要的朋友可以参考下. 编写好XSD文件,然后来看怎么使用XSD文件校验,并解析SqlMapper文件,也就是实现doParseSqlMapperResourceWithSchema()方法. 为了实现这个功能,有两个基本要求: (1)兼容性:需要兼容mybatis的原生配置,兼容有两种层级,一种是使用DTD校验,这个前面已经说了,走原来的流程,兼容性没有问题:另一种就是走XSD校验,但也需要兼容myba

  • 详解Java的MyBatis框架和Spring框架的整合运用

    单独使用mybatis是有很多限制的(比如无法实现跨越多个session的事务),而且很多业务系统本来就是使用spring来管理的事务,因此mybatis最好与spring集成起来使用. 版本要求 项目 版本 下载地址 说明 mybatis 3.0及以上 https://github.com/mybatis/mybatis-3/releases spring 3.0及以上 http://projects.spring.io/spring-framework/ mybatis-spring 1.0

  • mybatis 加载配置文件的方法(两种方式)

    一. 使用sqlSessionFactory 的 mapperLocations 进行加载, <!-- SessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" scope="singleton"> <property name="dataSource" ref=

  • Mybatis的Mapper中的方法为什么不能重载

    前言 在初入门Mybatis的时候可能都犯过一个错误,那就是在写Mapper接口的时候都重载过其中的方法,但是运行起来总是报错,那时候真的挺郁闷的,但是自己也查不出来原因,只能默默的改了方法名,哈哈,多么卑微的操作. 今天就写一篇文章从源码角度为大家解惑为什么Mybatis中的方法不能重载? 环境配置 本篇文章讲的一切内容都是基于Mybatis3.5和SpringBoot-2.3.3.RELEASE. 错误示范 举个栗子:假设现在有两个需求,一个是根据用户的id筛选用户,一个是根据用户的性别筛选

  • MyBatis控制台显示SQL语句的方法实现

    一.单独使用MyBatis (1)在mybatis.xml配置文件中添加如下配置 <setting name="logImpl" value="STDOUT_LOGGING" /> (2)使用slf4j输出 因此要先添加slf4j的依赖 <dependency>    <groupId>org.slf4j</groupId>    <artifactId>slf4j-log4j12</artifact

  • SpringBoot使用Mybatis&Mybatis-plus文件映射配置方法

    简介: Springboot使用Mybatis&Mybatis-plus 两者文件映射配置略有不同,之前我用的是Mybatis,但公司用Mybatis-plus:自己新建了一个Springboot项目,代码运行时一直报错not found not found,明明配置了mybatis相关信息的扫描路径,但是就是not found:检查修改了很多地方但都是无用功,最终发现是Plus惹的祸. 1.使用Mybatis <dependency> <groupId>org.mybat

  • SpringBoot项目将mybatis升级为mybatis-plus的方法

    最近做的项目是用的开源的一个项目改造得来的,而且项目是19年就已经停止维护了,项目的年龄比我工作经验还长,而且我们要在原来的接口上进行改动,但为了兼容前端,所以很多接口改起来很麻烦,新写的话还要写很多sql,于是就想将mybatis升级成mybatis-plus,简化一下开发 第一步,引入maven依赖 <!-- 注释掉原来的mybatis,否则可能会报错 --> <!-- <dependency>--> <!-- <groupId>org.mybat

随机推荐