mybatis-spring 入门到实例
入门
安装
在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 入门到实例相关推荐
- Spring、Mybatis、Spring MVC整合实例
Spring.Mybatis.Spring MVC整合实例笔记 源码地址:https://gitee.com/name168/SSM_Demo 1.Maven web项目创建(IDEA) 2.SSM整 ...
- spring mvc mysql 实例_Spring+Mybatis+SpringMVC+Maven+MySql搭建实例
一.准备工作 1. 首先创建一个表: CREATE TABLE `t_user` ( `USER_ID` int(11) NOT NULL AUTO_INCREMENT, `USER_NAME` ch ...
- 第十篇:Spring Boot整合mybatis+Mysql 入门试炼02
前言: 1.(SprigBoot整合SpringMVC+Mybatis) 2.以thymeleaf作为视图层技术整合 3.springboot版本2.0.5.RELEASE 创建项目 1.添加依赖及启 ...
- Spring+SpringMVC+Mybatis 整合入门
文章目录 整体结构 结构图 Spring 整合SpringMVC web.xml SpringMvc.xml Spring整合Mybatis applicationContext.xml 代理接口的配 ...
- Spring入门(包括spring整合mybatis的spring-mybatis)
Spring 一.背景介绍 1.spring理念 使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架 Spring是一个轻量级控制反转(lOC)和面向切面(AOP)的容器框架 2.轮子理 ...
- c++框架有哪些_Java Mybatis框架入门教程_v20200726
MyBatis 的前身是 Apache 的开源项目 iBatis.MyBatis 几乎可以代替 JDBC,是一个支持普通 SQL 查询,存储过程和高级映射的基于 Java 的优秀持久层框架.MyBat ...
- Spring入门自学
学习目标: Spring入门自学(持续更新) 学习方式: 知识的浏览者,网页的搬运工. 学习内容: 1.项目目录结构 2.使用框架的版本 3.Spring 概述 4.入门实例代码 5.数据库 6.GE ...
- Mybatis从入门到精通二(入门详解)
Mybatis从入门到精通二(想学Mybatis,看了这一篇你就不需要其他的了) 本课程分为两天第一天的请参考: https://blog.csdn.net/weixin_43564627/artic ...
- mybatis spring springMVC
unit10-mybatis框架 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ZIyKRxA-1611577268155)(第二阶段讲义04.assets/a0a2 ...
最新文章
- 我,谷歌AI编舞师,能根据音乐来10种freestyle,想看霹雳还是爵士芭蕾?
- 解決yum [Errno -1] Metadata file does not match checksum
- Go简单的Goroutine示例
- 04-JDBC连接MySQL数据库【修改数据】
- Tar打包、压缩与解压缩到指定目录的方法
- hdu 1429 胜利大逃亡(续) bfs+状态压缩
- java is alphabetic_JDK之Pattern类探索(一)
- 计算机网络 | 数据链路层 :ARP协议、以太网协议、MTU
- 微信小程序|开发实战篇之七-steps进度条组件
- BarnBridge更新路线图计划或于Q2推出SMART Alpha
- ISP 和摄像头基本知识
- python将注释写入xml_向xml文档添加注释
- MATLAB符号计算相关函数
- html中增加一个播放器,从零实现一个自定义 HTML5 播放器
- 分析日志太麻烦?看看如何在在真格量化中使用MySQL记录数据
- ansys分析遇到的几个问题解决方案【文件保存】【网格划分】【steps controls】【应力应变动画】【力负载】【干涉】【part打散】【merge合并】【分析计算量】
- js判断页面第一次加载或者是否执行了刷新操作
- c语言二进制转换方式,c语言二进制怎么转换十进制
- 正确介绍自己的项目,终于不用害怕面试了
- matlab 改变数据,MATLAb怎么实现对表格数据的修改
热门文章
- LOJ#2145. 「SHOI2017」分手是祝愿
- 牛客题霸 [	验证IP地址] C++题解/答案
- P6295-有标号 DAG 计数【多项式求逆,多项式ln】
- AT2667-[AGC017D]Game on Tree【SG函数】
- AT2164-[AGC006C]Rabbit Exercise【差分,倍增,数学期望】
- nssl1478-题【dp】
- jzoj6287-扭动的树【区间dp】
- P1282-多米诺骨牌【dp,背包】
- 【线段树】蝴蝶与花(P6859)
- 【dfs】无穷迷宫(jzoj 3924)