入门

安装

在pom.xml中导入mybatis-spring.jar包

快速入门

要把spring和mybatis一起使用,需要定义两样东西:SqlsessionFactory 和 至少一个数据库映射器类。

SqlSessionFactoryBean 是用于创建 SqlSessionFactory 的,需要一个Datasource参数。

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

假如定义了一个如下的mapper接口:

public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{userId}")User getUser(@Param("userId") String userId);
}

可以使用MapperFactoryBean,把接口加入到Spring中:

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" /><property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

注意:所指定的映射器类必须是一个接口,而不是具体的实现类。上面例子用的是注解,也可以用xml配置的形式。

一旦配置好,可以用相同的方式直接注入映射器到 business/service 对象中。MapperFactoryBean 处理 SqlSession 的创建和关闭它。如果使用 了 Spring 的事务,那么当事务完成时,session 将会提交或回滚。最终,任何异常都会被翻 译成 Spring 的 DataAccessException 异常。

最后调用Mybatis数据方法只需一行代码:

public class FooServiceImpl implements FooService {private UserMapper userMapper;public void setUserMapper(UserMapper userMapper) {this.userMapper = userMapper;
}public User doSomeBusinessStuff(String userId) {return this.userMapper.getUser(userId);
}

SqlSessionFactoryBean

要创建工厂 bean,放置下面的代码在 Spring 的 XML 配置文件中:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="mapperLocations" value="classpath*:sample/config/mappers/**/*.xml" />
</bean>

属性

SqlSessionFactory 有一个单独的必须属性— JDBC 的 DataSource。

一个通用的属性是 configLocation,它是用来指定 MyBatis 的 XML 配置文件路径的。 如果基本的 MyBatis 配置需要改变, 那么这就是一个需要配置文件的地方。

和spring结合的mybatis配置文件不需要一个完整的 MyBatis 配置。任意环境,数据源 和 MyBatis 的事务管理器都会被忽略。SqlSessionFactoryBean 会创建它自己的 sqlSessionFactory。

另一个需要配置文件的地方,是mybatis映射器xml文件和映射器类不在同一路径。有两个选择:第一是手动在 MyBatis 的 XML 配 置文件中使用部分来指定类路径。第二是使用工厂 bean 的 mapperLocations 属 性。

mapperLocations 属性使用一个资源位置的 list。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="mapperLocations" value="classpath*:sample/config/mappers/**/*.xml" />
</bean>

这会从类路径下加载在 sample.config.mappers 包和它的子包中所有的 映射器 文件。

从1.3.0后,configuration 属性加入。它规定不用xml配置文件直接插入configuration标签。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="configuration"><bean class="org.apache.ibatis.session.Configuration"><property name="mapUnderscoreToCamelCase" value="true"/></bean></property>
</bean>

事务

一个使用 MyBatis-Spring 的主要原因是它允许 MyBatis 参与到 Spring 的事务管理中。MyBatis-Spring 利用了存在于 Spring 中的 DataSourceTransactionManager。

可以通过配置Spring的PlatformTransaction,来配置自己的事务。

在事务处理期间,一个单独的 SqlSession 对象将被创建和使用。当事务完成时,这个 session 会以合适的方式提交或回滚。

标准配置

开启Spring事务处理, 创建一个 DataSourceTransactionManager 对象。

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" />
</bean>

要注意, 为事务管理器指定的 DataSource 必须和用来创建 SqlSessionFactoryBean 的 是同一个数据源,否则事务管理器就无法工作了。

容器管理事务

如果你想让 Spring 参与到容器管理事务(CMT)中,那么 Spring 应该使用 JtaTransactionManager 或它的容 器指定的子类来配置

<tx:jta-transaction-manager />

如果你想使用CMT , 而不想使用Spring的事务管理。 必须配置SQLSessionFactory来使用MyBatis 的 ManagedTransactionFactory 。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="transactionFactory"><bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory" /></property>
</bean>

编程式事务管理

你 不 能 在 Spring 管 理 的 SqlSession 上 调 用 SqlSession.commit() , SqlSession.rollback() 或 SqlSession.close() 方 法 。 如 果 这 样 做 了 , 就 会 抛 出 UnsupportedOperationException 异常。注意在使用注入的映射器时不能访问那些方法。

如果你想编程式地控制事务,这段代码展示了使用 PlatformTransactionManager 来处理事务

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);TransactionStatus status = txManager.getTransaction(def);
try {userMapper.insertUser(user);
}
catch (MyException ex) {txManager.rollback(status);throw ex;
}
txManager.commit(status);

使用SQLSession

在 MyBatis 中,你可以使用 SqlSessionFactory 来创建 SqlSession。一旦你获得一个 session 之后,你可以使用它来执行映射语句,提交或回滚连接,最后,当不再需要它的时 候, 你可以关闭 session。 使用 MyBatis-Spring 之后, 你不再需要直接使用 SqlSessionFactory 了,因为你的 bean 可以通过一个线程安全的 SqlSession 来注入,基于 Spring 的事务配置 来自动提交,回滚,关闭 session。

SqlSessionTemplate

SqlSessionTemplate 是 MyBatis-Spring 的核心。
这个类负责管理 MyBatis 的 SqlSession, 调用 MyBatis 的 SQL 方法, 翻译异常。 SqlSessionTemplate 是线程安全的, 可以被多个 DAO 所共享使用。它管理 session 的生命 周期,包含必要的关闭,提交或回滚操作。

SqlSessionTemplate 实现了 SqlSession 接口,在代码中无需对 MyBatis 的 SqlSession 替换。SqlSessionTemplate 通常是被用来替代默认的 MyBatis 实现的 DefaultSqlSession。

SqlSessionTemplate 对象可以使用 SqlSessionFactory 作为构造方法的参数来创建。

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

1、这个 bean 现在可以直接注入到 DAO bean 中。你需要在 bean 中添加一个 SqlSession 属性。

public class UserDaoImpl implements UserDao {private SqlSession sqlSession;public void setSqlSession(SqlSession sqlSession) {this.sqlSession = sqlSession;}public User getUser(String userId) {return (User) sqlSession.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);}
}

注入SqlSessionTemplate:

<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl"><property name="sqlSession" ref="sqlSession" />
</bean>

2、SqlSessionTemplate 有一个使用 ExecutorType 作为参数的构造方法。这允许你用来 创建对象。

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"><constructor-arg index="0" ref="sqlSessionFactory" /><constructor-arg index="1" value="BATCH" />
</bean>

现在你所有语句都可以批量操作。

public void insertUsers(User[] users) {for (User user : users) {sqlSession.insert("org.mybatis.spring.sample.mapper.UserMapper.insertUser", user);}}

SqlSessionDaoSupport

SqlSessionDaoSupport 是 一 个 抽象 的支 持 类, 用来 为你 提供 SqlSession 。 调用getSqlSession()方法你会得到一个 SqlSessionTemplate,之后可以用于执行 SQL 方法。

public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {public User getUser(String userId) {return (User) getSqlSession().selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);}
}

通常 MapperFactoryBean 是这个类的首选,因为它不需要额外的代码。 但是,你要在dao中做其他事情,那么这个类就很有用。

SqlSessionDaoSupport 需要一个 sqlSessionFactory 或 sqlSessionTemplate 属性来 设 置 。

假设类 UserMapperImpl 是 SqlSessionDaoSupport 的子类,它可以在 Spring 中进行如 下的配置:

<bean id="userMapper" class="org.mybatis.spring.sample.mapper.UserDaoImpl"><property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

五 注入映射器

为了代替手工使用 SqlSessionDaoSupport 或 SqlSessionTemplate 编写数据访问对象 (DAO)的代码,MyBatis-Spring 提供了一个动态代理的实现:MapperFactoryBean这个类 可以让你直接注入数据映射器接口到你的 service 层 bean 中。当使用映射器时,你仅仅如调 用你的 DAO 一样调用它们就可以了,但是你不需要编写任何 DAO 实现的代码,因为 MyBatis-Spring 将会为你创建代理。

使用注入的映射器代码,在 MyBatis,Spring 或 MyBatis-Spring 上面不会有直接的依赖。 MapperFactoryBean 创建的代理控制开放和关闭 session翻译任意的异常到 Spring 的 DataAccessException 异常中。此外,如果需要或参与到一个已经存在活动事务中,代理将 会开启一个新的 Spring 事务。

MapperFactoryBean

加入到Spring

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" /><property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

mapperInterface说明 MapperFactoryBean 创建的代理类实现了 UserMapper 接口,并且注入到应用程序中。

如果 XML 文件在类路径的 位置和映射器类相同时, 它会被 MapperFactoryBean 自动解析。不需要再mybatis的配置文件中指定映射器路径,除非在不同目录。

可以直接在 business/service 对象中以注入Spring bean 的方式直接注入映 射器:

<bean id="fooService" class="org.mybatis.spring.sample.mapper.FooServiceImpl"><property name="userMapper" ref="userMapper" />
</bean>

这个 bean 可以直接在应用程序逻辑中使用:

public class FooServiceImpl implements FooService {private UserMapper userMapper;public void setUserMapper(UserMapper userMapper) {this.userMapper = userMapper;}public User doSomeBusinessStuff(String userId) {return this.userMapper.getUser(userId);}
}

注意,上面没有Session的引用,打开或 关闭 session 的代码,MyBatis-Spring 会来关心它的。

MapperScannerConfigurer

没有必要在 Spring 的 XML 配置文件中注册所有的映射器。相反,你可以使用一个 MapperScannerConfigurer , 它 将 会 查 找 类 路 径 下 的 映 射 器 并 自 动 将 它 们 创 建 成 MapperFactoryBean。

创建 MapperScannerConfigurer

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="org.mybatis.spring.sample.mapper" />
</bean>

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

注 意 , 没有必要去指定 SqlSessionFactory 或 SqlSessionTemplate , 因 为 MapperScannerConfigurer 将会创建 MapperFactoryBean,之后自动装配。但是,如果你使 用了一个 以上的 DataSource ,那 么自动 装配可 能会失效。 这种 情况下 ,你可 以使用 sqlSessionFactoryBeanName 或 sqlSessionTemplateBeanName 属性来设置正确的 bean 名 称来使用。

bean 的名称是必须的,而不是 bean 的引用,因 此,value 属性在这里替代通常的 ref:

<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />

六 使用Mybatis API

使用 MyBatis-Spring,你可以继续直接使用 MyBatis 的 API。仅仅在代码中使用 Spring 中 的 SqlSessionFactoryBean 来创建一个 SqlSessionFactory。

public class UserMapperSqlSessionImpl implements UserMapper {// SqlSessionFactory would normally be set by SqlSessionDaoSupportprivate SqlSessionFactory sqlSessionFactory;public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;}public User getUser(String userId) {// note standard MyBatis API usage - opening and closing the session manuallySqlSession session = sqlSessionFactory.openSession();try {return (User) session.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);} finally {session.close();}}
}

小心使用此选项, 因为错误的使用会产生运行时错误, 或者更糟糕的数据一致性的问题。 这些是告诫:
1.它不会参与到 Spring 的事务之中。
2.如果 SqlSession 使用 DataSource,它也会被 Spring 事务管理器使用,而且当前 有事务在进行时,这段代码会抛出异常。
3.MyBatis 的 DefaultSqlSession 是线程不安全的。如果在 bean 中注入了它,就会 发生错误。
使用 DefaultSqlSession 创建的映射器也不是线程安全的。如果你将它们注入到 bean 中,是会发生错误的。
4.你必须保证在 finally 块中来关闭 SqlSession。

实例代码

https://github.com/mybatis/spring/tree/master/src/test/java/org/mybatis/spring/sample

Spring单元测试

https://blog.csdn.net/u013041642/article/details/71430293

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.zx.dao.UserDao;
import com.zx.domain.User;
import com.zx.mapper.UserMapper;/*** Example of MyBatis-Spring batch integration usage.*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:application-base.xml")
public class UserDaoTest{@Autowiredprotected UserDao userDao;@Autowiredprotected UserMapper userMapper;@Testpublic void testSelect() {User user = this.userMapper.selectOne(1);System.out.println(user);}
}

mybatis-spring 入门到实例相关推荐

  1. Spring、Mybatis、Spring MVC整合实例

    Spring.Mybatis.Spring MVC整合实例笔记 源码地址:https://gitee.com/name168/SSM_Demo 1.Maven web项目创建(IDEA) 2.SSM整 ...

  2. spring mvc mysql 实例_Spring+Mybatis+SpringMVC+Maven+MySql搭建实例

    一.准备工作 1. 首先创建一个表: CREATE TABLE `t_user` ( `USER_ID` int(11) NOT NULL AUTO_INCREMENT, `USER_NAME` ch ...

  3. 第十篇:Spring Boot整合mybatis+Mysql 入门试炼02

    前言: 1.(SprigBoot整合SpringMVC+Mybatis) 2.以thymeleaf作为视图层技术整合 3.springboot版本2.0.5.RELEASE 创建项目 1.添加依赖及启 ...

  4. Spring+SpringMVC+Mybatis 整合入门

    文章目录 整体结构 结构图 Spring 整合SpringMVC web.xml SpringMvc.xml Spring整合Mybatis applicationContext.xml 代理接口的配 ...

  5. Spring入门(包括spring整合mybatis的spring-mybatis)

    Spring 一.背景介绍 1.spring理念 使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架 Spring是一个轻量级控制反转(lOC)和面向切面(AOP)的容器框架 2.轮子理 ...

  6. c++框架有哪些_Java Mybatis框架入门教程_v20200726

    MyBatis 的前身是 Apache 的开源项目 iBatis.MyBatis 几乎可以代替 JDBC,是一个支持普通 SQL 查询,存储过程和高级映射的基于 Java 的优秀持久层框架.MyBat ...

  7. Spring入门自学

    学习目标: Spring入门自学(持续更新) 学习方式: 知识的浏览者,网页的搬运工. 学习内容: 1.项目目录结构 2.使用框架的版本 3.Spring 概述 4.入门实例代码 5.数据库 6.GE ...

  8. Mybatis从入门到精通二(入门详解)

    Mybatis从入门到精通二(想学Mybatis,看了这一篇你就不需要其他的了) 本课程分为两天第一天的请参考: https://blog.csdn.net/weixin_43564627/artic ...

  9. mybatis spring springMVC

    unit10-mybatis框架 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ZIyKRxA-1611577268155)(第二阶段讲义04.assets/a0a2 ...

最新文章

  1. 我,谷歌AI编舞师,能根据音乐来10种freestyle,想看霹雳还是爵士芭蕾?
  2. 解決yum [Errno -1] Metadata file does not match checksum
  3. Go简单的Goroutine示例
  4. 04-JDBC连接MySQL数据库【修改数据】
  5. Tar打包、压缩与解压缩到指定目录的方法
  6. hdu 1429 胜利大逃亡(续) bfs+状态压缩
  7. java is alphabetic_JDK之Pattern类探索(一)
  8. 计算机网络 | 数据链路层 :ARP协议、以太网协议、MTU
  9. 微信小程序|开发实战篇之七-steps进度条组件
  10. BarnBridge更新路线图计划或于Q2推出SMART Alpha
  11. ISP 和摄像头基本知识
  12. python将注释写入xml_向xml文档添加注释
  13. MATLAB符号计算相关函数
  14. html中增加一个播放器,从零实现一个自定义 HTML5 播放器
  15. 分析日志太麻烦?看看如何在在真格量化中使用MySQL记录数据
  16. ansys分析遇到的几个问题解决方案【文件保存】【网格划分】【steps controls】【应力应变动画】【力负载】【干涉】【part打散】【merge合并】【分析计算量】
  17. js判断页面第一次加载或者是否执行了刷新操作
  18. c语言二进制转换方式,c语言二进制怎么转换十进制
  19. 正确介绍自己的项目,终于不用害怕面试了
  20. matlab 改变数据,MATLAb怎么实现对表格数据的修改

热门文章

  1. LOJ#2145. 「SHOI2017」分手是祝愿
  2. 牛客题霸 [ 验证IP地址] C++题解/答案
  3. P6295-有标号 DAG 计数【多项式求逆,多项式ln】
  4. AT2667-[AGC017D]Game on Tree【SG函数】
  5. AT2164-[AGC006C]Rabbit Exercise【差分,倍增,数学期望】
  6. nssl1478-题【dp】
  7. jzoj6287-扭动的树【区间dp】
  8. P1282-多米诺骨牌【dp,背包】
  9. 【线段树】蝴蝶与花(P6859)
  10. 【dfs】无穷迷宫(jzoj 3924)