使用Spring IoC可以有效管理各类Java资源,达到即插即拔功能;通过AOP框架,数据库事务可以委托给Spring处理,消除很大一部分的事务代码,配合MyBatis的高灵活、可配置、可优化SQL等特性,完全可以构建高性能的大型网站。
  MyBatis和Spring两大框架已经成了Java互联网技术主流框架组合,它们经受住了大数据量和大批量请求的考验,在互联网系统中得到了广泛的应用。使用MyBatis-Spring使得业务层和模型层得到了更好的分离,与此同时,在Spring环境中使用MyBatis也更加简单,节省了不少代码,甚至可以不用SqlSessionFactory、SqlSession等对象。因为MyBatis-Spring为我们封装了它们。

  配置MyBatis-Spring项目需要这么几步:
  •配置数据源。
  •配置SqlSessionFactory。
  •可以选择的配置有SqlSessionTemplate,在同时配置SqlSessionTemplate和SqlSessionFactory的情况下,优先采用SqlSessionTemplate。
  •配置Mapper,可以配置单个Mapper,也可以通过扫描的方法生成Mapper,比较灵活。此时Spring IoC会生成对应接口的实例,这样就可以通过注入的方式来获取资源了。

配置SqlSessionFactoryBean

  从MyBatis的介绍中,可以知道SqlSessionFactory是产生SqlSession的基础,因此配置SqlSessionFactory十分关键。在MyBatis-Spring项目中提供了SqlSessionFactoryBean去支持SqlSessionFactory的配置
  几乎可以配置所有关于MyBatis的组件,并且它也提供了对应的setter方法让Spring设置它们,所以完全可以通过Spring IoC容器的规则去配置它们。由于使用了第三方的包,一般而言,我们更倾向于XML的配置。

  代码清单:配置SqlSessionFactoryBean

<!--配置SqlSessionFactoryBean-->
<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:ssm/chapter12/sqlMapConfig.xml"/>
</bean>

  这里配置了SqlSesionFactoryBean,但是只是配置了数据源,然后引入一个MyBatis配置文件,当然如果你所配置的内容很简单,是可以完全不引入MyBatis配置文件的,只需要通过Spring IoC容器注入即可,但是一般而言,较为复杂的配置,笔者还是推荐你使用MyBatis的配置文件,这样的好处在于不至于使得SqlSessionFactoryBean的配置全部依赖于Spring提供的规则,导致配置的复杂性。

  代码清单:MyBatis配置文件——sqlMapConfig.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="cacheEnabled" value="true"/>
<!-- 允许 JDBC 支持生成的键。需要适当的驱动。如果设置为 true,则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如 Derby) -->
<setting name="useGeneratedKeys" value="true"/>
<!-- 配置默认的执行器。SIMPLE 执行器没有什么特别之处。REUSE 执行器重用预处理语句。BATCH 执行器重用语句和批量更新 -->
<setting name="defaultExecutorType" value="REUSE"/>
<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 设置超时时间,它决定驱动等待一个数据库响应的时间 -->
<setting name="defaultStatementTimeout" value="25000"/>
</settings>
<!-- 别名配置 -->
<typeAliases>
<typeAlias alias="role" type="com.ssm.chapter12.pojo.Role"/>
</typeAliases>
<!-- 指定映射器路径 -->
<mappers>
<mapper resource="ssm/chapter12/mapper/RoleMapper.xml"/>
</mappers>
</configuration>

  代码清单:RoleMapper.xml

<?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.ssm.chapter12.mapper.RoleMapper"> <insert id="insertRole" useGeneratedKeys="true" keyProperty="id">
insert into t_role (role_name, note)
values (#{roleName}, #{note})
</insert> <delete id="deleteRole" parameterType="long">
delete
from t_role
where id = #{id}
</delete> <select id="getRole" parameterType="long" resultType="role">
select id, role_name as roleName, note
from t_role
where id = #{id}
</select> <update id="updateRole" parameterType="role">
update t_role
set role_name = #{roleName},
note = #{note}
where id = #{id}
</update> </mapper>

  定义了一个命名空间(namespace)——com.ssm.chapter12.mapper.RoleMapper,并且提供了对角色的增、删、查、改方法。按照MyBatis的规则需要定义一个接口RoleMapper.java,才能够调用它

  代码清单:RoleMapper.java

package com.ssm.chapter12.mapper;

import com.ssm.chapter12.pojo.Role;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository; @Repository
public interface RoleMapper {
public int insertRole(Role role); public Role getRole(@Param("id") Long id); public int updateRole(Role role); public int deleteRole(@Param("id") Long id);
}

  到这里就完成了关于MyBatis框架的主要代码,由于RoleMapper是一个接口,而不是一个类,它没有办法产生实例,那么应该如何配置它呢

SqlSessionTemplate组件

  严格来说,SqlSessionTemplate并不是一个必须配置的组件,但是它也存在一定的价值。首先,它是线程安全的类,也就是确保每个线程使用的SqlSession唯一且不互相冲突。其次,它提供了一系列的功能,比如增、删、查、改等常用功能
  代码清单:配置SqlSessionTemplate

<!--配置SqlSessionTemplate-->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="SqlSessionFactory"/>
<!-- <constructor-arg value="BATCH"/> -->
</bean>

  SqlSessionTemplate要通过带有参数的构造方法去创建对象,常用的参数是SqlSessionFactory和MyBatis执行器(Ex-ecutor)类型,取值范围是SIMPLE、REUSE、BATCH,这是我们之前论述过的执行器的3种类型。

  代码清单:SqlSessionTemplate的应用

ApplicationContext ctx = new ClassPathXmlApplicationContext("ssm/chapter12/spring-cfg.xml");//ctx为Spring IoC容器

SqlSessionTemplate sqlSessionTemplate = ctx.getBean(SqlSessionTemplate.class);
Role role = new Role();
role.setRoleName("role_name_sqlSessionTemplate");
role.setNote("note_sqlSessionTemplate");
sqlSessionTemplate.insert("com.ssm.chapter12.mapper.RoleMapper.insertRole", role);
Long id = role.getId();
sqlSessionTemplate.selectOne("com.ssm.chapter12.mapper.RoleMapper.getRole", id);
role.setNote("update_sqlSessionTemplate");
sqlSessionTemplate.update("com.ssm.chapter12.mapper.RoleMapper.updateRole", role);
sqlSessionTemplate.delete("com.ssm.chapter12.mapper.RoleMapper.deleteRole", id);

  当运行一个SqlSessionTemplate时,它就会重新获取一个新的SqlSession,也就是说每一个SqlSession-Template运行的时候会产生新的SqlSession,所以每一个方法都是独立的SqlSession,这意味着它是安全的线程。
  关于SqlSessionTemplate,目前运用已经不多,正如代码清单一样所示,它需要使用字符串表明运行哪个SQL,字符串不包含业务含义,只是功能性代码,并不符合面向对象的规范。与此同时,使用字符串时,IDE无法检查代码逻辑的正确性,所以这样的用法渐渐被人们抛弃了。注意,SqlSessionTemplate允许配置执行器的类型,当同时配置SqlSessionFactory和SqlSessionTemplate的时候,SqlSessionTemplate的优先级大于SqlSessionFactory。

配置MapperFactoryBean

  MyBatis的运行只需要提供类似于RoleMapper.java的接口,而无须提供一个实现类。通过学习MyBatis运行原理,可以知道它是由MyBatis体系创建的动态代理对象运行的,所以Spring也没有办法为其生成实现类。为了解决这个问题,MyBatis-Spring团队提供了一个MapperFactoryBean类作为中介,我们可以通过配置它来实现我们想要的Mapper。使用了Mapper接口编程方式可以有效地在你的逻辑代码中擦除SqlSessionTemplate,这样代码就按照面向对象的规范进行编写了,这是人们乐于采用的形式。
  代码清单:配置RoleMapper对象

<!--配置RoleMapper对象-->
<bean id="roleMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!--RoleMapper接口将被扫描为Mapper -->
<property name="mapperInterface" value="com.ssm.chapter12.mapper.RoleMapper"/>
<property name="SqlSessionFactory" ref="SqlSessionFactory"/>
<!--如果同时注入 sqlSessionTemplate 和 SqlSessionFactory,则只会启用sqlSessionTemplate -->
<!-- <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/> -->
</bean>

  这里可以看到MapperFactoryBean存在3个属性可以配置,分别是mapperInterface、sqlSessionTemplate和SqlSessionFac-tory,其中:
  •mapperInterface是映射器的接口。
  •如果同时配置sqlSessionTemplate和SqlSessionFactory,那么它就会启用sqlSessionTemplate,而SqlSessionFac-tory作废。当我们配置这样的一个Bean,那么我们就可以使用下面的代码去获取映射器了。
  

RoleMapper roleMapper = ctx.getBean(RoleMapper.class);

配置MapperScannerConfigurer

  这是一个通过扫描的形式进行配置Mapper的类,如果一个个去配置Mapper,显然工作量大,并且导致配置泛滥,有了它只需要给予一些简单的配置,它就能够生成大量的Mapper,从而减少工作量。首先我们需要知道它能够配置哪些属性,对于MapperScannerConfigurer它的主要配置项有以下几个:
  •basePackage,指定让Spring自动扫描什么包,它会逐层深入扫描,如果遇到多个包可以使用半角逗号分隔。
  •annotationClass,表示如果类被这个注解标识的时候,才进行扫描。对于开发而言,笔者建议使用这个方式进行注册对应的Mapper。在Spring中往往使用注解@Repository表示数据访问层(DAO,Data Access Object),所以本书的例子也是以此方式为主进行介绍的。
  •SqlSessionFactoryBeanName,指定在Spring中定义SqlSessionFactory的Bean名称。如果sqlSessionTemplateBeanName被定义,那么它将失去作用。
  •markerInterface,指定实现了什么接口就认为它是Mapper。我们需要提供一个公共的接口去标记。

  代码清单:通过扫描的方式配置RoleMapper

<!--通过扫描的方式配置RoleMapper-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ssm.chapter12.mapper"/>
<property name="SqlSessionFactoryBeanName" value="SqlSessionFactory"/>
<!--使用sqlSessionTemplateBeanName将覆盖SqlSessionFactoryBeanName的配置-->
<!--<property name="sqlSessionTemplateBeanName" value="SqlSessionFactory"/>-->
<!--指定标注才扫描成为Mapper-->
<property name="annotationClass" value="org.springframework.stereotype.Repository"/>
</bean>

MyBatis-Spring项目的更多相关文章

  1. spring boot+mybatis+quartz项目的搭建完整版

    1. 利用spring boot提供的工具(http://start.spring.io/)自动生成一个标准的spring boot项目架构 2. 因为这里我们是搭建spring boot+mybat ...

  2. spring springmvc mybatis maven 项目整合示例-导航页面

    spring原理 实践解析-简单的helloworld spring原理案例-基本项目搭建 01 spring framework 下载 官网下载spring jar包 spring原理案例-基本项目 ...

  3. IntelliJ IDEA 创建Spring+SpringMVC+mybatis+maven项目

    参考自:https://www.cnblogs.com/hackyo/p/6646051.html 第一步: 创建maven项目 输入项目名和工程id 选择maven 默认就可以了 刚开始时间比较长, ...

  4. springmvc+spring+mybatis+maven项目构建

    1.首先在myeclipse10中安装maven的插件,将插件放入D:\Program Files (x86)\myEclipse10\MyEclipse Blue Edition 10\dropin ...

  5. 一键生成Spring MVC + MyBatis + maven项目

    首先创建一个新的maven项目,在src/main/java创建一个类Test 然后在Test复制以下代码: import java.io.*; import java.sql.Connection; ...

  6. spring Boot + MyBatis + Maven 项目,日志开启打印 sql

    在 spring Boot + MyBatis + Maven 项目中,日志开启打印 sql 的最简单方法,就是在文件 application.properties 中新增: logging.leve ...

  7. myEclipse 搭建 Spring boot+myBatis+maven 项目流程

    1.新建一个工程 new-->maven project-->next-->next-->在filter中搜索webapp-->group id.Artifact id- ...

  8. 最详细的SSM(Spring+Spring MVC+MyBatis)项目搭建

    速览 使用Spring+Spring MVC+MyBatis搭建项目 开发工具IDEA(Ecplise步骤类似,代码完全一样) 项目类型Maven工程 数据库MySQL8.0 数据库连接池:Druid ...

  9. spring boot+mybatis搭建项目

    一.创建spring boot项目 1.File->New->Project 2.选择 Spring Initializr ,然后选择默认的 url 点击[Next]: 3.修改项目信息 ...

  10. Maven搭建Spring+SpringMVC+Mybatis+Shiro项目详解

    一. 环境搭建: 1. 开发工具:myeclipse 2014 / IDEA: 2. maven管理版本:apache-maven-3.0+: 3. jdk 1.7.0+4. Tomcat8.0 二: ...

随机推荐

  1. YAML_11 when条件判断

    当系统负载超过0.7时,则关掉httpd ansible]# vim when.yml --- - hosts: cache   remote_user: root   tasks:     - sh ...

  2. IP地址与Mac地址绑定错误

    有个application,有时候可以正常访问,有时候又返回404错误,百思不得其解.刚开始以为是文件夹权限问题,折腾了好久. 后来没在服务器上monitor到包,所以猜想是到了错误的mac地址,用a ...

  3. P1453 城市环路

    题目背景 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域——城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环路之内便是B市中心. 题 ...

  4. GSS4 D - Can you answer these queries IV

    //给你一个序列,有两种操作: //1.给定x和y,将区间[x,y]内的数开方 //2.询问区间和 // // 因为一个longlong类型的数最多开6次方就变成了1,所以对于1操作,我们暴力修改, ...

  5. AtCoder Grand Contest 005题解

    传送门 \(A\) 咕咕 const int N=5e5+5; char s[N];int res,n,sum; int main(){ scanf("%s",s+1),res=n ...

  6. Reed-Solomon纠错码的译码

    其中用到了等比数列展开:1/(1-\alpha).  此时,似乎应该将\alpha视为模远小于1的复数. 只有这样,\alpha^i 才能作为一个有限域中的元素展开.它在一个半径小于1的圆上,由若干具 ...

  7. kubernetes架构和组件

    一.Kubernetes整体架构 Kubernetes属于主从分布式架构,主要由Master Node和Worker Node组成,以及包括客户端命令行工具kubectl和其它附加项. Master ...

  8. Flink(一) —— 启动与基本使用

    一.Flink概念 lambda架构 将离线计算和实时计算结合在一起,发挥离线计算准确率高.实时计算响应速度快的优势.缺点是,同一套逻辑要分别在两个模式下实现,存在代码冗余的问题. Flink特点 ( ...

  9. Perl深度优先迷宫算法

    迷宫求解,可以用穷举法,将每个点的方向都穷举完:由于在求解过程中会遇到某一方向不可通过,此时就必须按原路返回. 想到用Perl数组来保存路径,记录每次所探索的方向,方便原路返回时得到上一步的方向,再退 ...

  10. Python 画 直方图/条形图/柱状图

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u011489887/article/de ...