从 Spring 集成 MyBatis 到浅析 Java 动态代理

本文介绍了Spring如何集成MyBatis,并详细解析了Java动态代理的原理及其实现,包括在Spring-Mybatis中的应用。通过配置XML文件,创建数据访问对象,并利用动态代理简化DAO操作。此外,文章探讨了Java动态代理的InvocationHandler接口和Proxy类,展示了动态代理在日志、事务管理等场景的应用。
摘要由CSDN通过智能技术生成

前言

因为 MyBatis 的易上手性和可控性,使得它成为了 ORM框架中的首选。近日新起了一个项目,所以重新搭建了一下 Spring-mybatis, 下面是搭建笔记和从 Spring-mybatis源码分析其如何使用 Java动态代理,希望对大家有帮助。

Spring 集成 Mybatis

Spring 集成 Mybatis的方式有很多种,大家耳熟能详的 xml配置方式或者本文的采用的方式:
首先需要添加 MyBatis的和 MyBatis-Spring的依赖,本文使用的 Spring-mybatis版本是1.3.1。在 mvnrepository里面我们可以找到当前 Spring-mybatis依赖的 springmybatis版本,最好是选择匹配的版本以避免处理不必要的兼容性问题。因为 MyBatis-Spring中对 mybatis的依赖选择了 provided模式,所以我们不得不额外添加 mybatis依赖,依赖配置如下。

 
  1. <dependency>

  2.    <groupId>org.mybatis</groupId>

  3.    <artifactId>mybatis-spring</artifactId>

  4.    <version>1.3.1</version>

  5. </dependency>

  6. <dependency>

  7.      <groupId>org.mybatis</groupId>

  8.      <artifactId>mybatis</artifactId>

  9.      <version>3.4.1</version>

  10. </dependency>

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

 
  1. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

  2.  <property name="dataSource" ref="dataSource" />

  3. </bean>

 

这个工厂需要一个 DataSource,就是我们熟知的数据源了。这里我们选择了阿里的 Druid,同样我们需要引入两个配置

 
  1. <dependency>

  2. <groupId>mysql</groupId>

  3. <artifactId>mysql-connector-java</artifactId>

  4. <version>5.1.41</version>

  5. </dependency>

  6. <dependency>

  7. <groupId>com.alibaba</groupId>

  8. <artifactId>druid</artifactId>

  9. <version>1.1.2</version>

  10. </dependency>

 
  1.        

添加 Spring配置如下

 
  1. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">

  2.        <!-- 基本属性 url、user、password -->

  3.        <property name="url">

  4.            <value><![CDATA[${db.url}]]></value>

  5.        </property>

  6.        <property name="username" value="${db.username}"/>

  7.        <property name="password" value="${db.password}"/>      

  8.        <!-- 省略其他配置 -->  

  9. </bean>

接下来我们要编写数据库访问对象,大多数人会把它叫做 DAO或者 Repository,在这里其被称为

 

Mapper,也是因为它的实现方式所决定。要注意的是所指定的映射器类必须是一个接口,而不是具体的实现类。这便因为 Mybatis的内部实现使用的是 Java动态代理,而 Java动态代理只支持接口,关于 动态代理我们下文有更详细的描述。

 
  1. public interface UserMapper {

  2.  @Select("SELECT * FROM users WHERE id = #{userId}")

  3.  User getUser(@Param("userId") String userId);

  4. }

接下来可以使用 MapperFactoryBean,像下面这样来把接口加入到 Spring 中,这样就把 UserMapperSessionFactory关联到一起了,原来使用 xml配置的时候还需要Dao继承 SqlSessionDaoSupport才能注入 SessionFactory,这种方式直接通过 Java动态代理SqlSessionFactory代理给了 UserMapper,使得我们直接使用 UserMapper即可。配置如下。

 
  1. <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">

  2.  <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />

  3.  <property name="sqlSessionFactory" ref="sqlSessionFactory" />

  4. </bean>

这样我们已经完成了90%,就差调用了,前提是你 Spring环境是OK的。调用 MyBatis 数据方法现在只需一行代码:

 
  1. public class FooServiceImpl implements FooService {

  2.  

  3. private UserMapper userMapper;

  4.  

  5. public void setUserMapper(UserMapper userMapper) {

  6.  this.userMapper = userMapper;

  7. }

  8.  

  9. public User doSomeBusinessStuff(String userId) {

  10.  return this.userMapper.getUser(userId);

  11. }

那么问题又来了,每次写一个DAO都需要为其写一个 Bean配置,那不是累死?于是我们又寻找另一种方案,代替手动声明 *MapperMapperScannerConfigurer的出现解决了这个问题, 它会根据你配置的包路径自动的扫描类文件并自动将它们创建成 MapperFactoryBean,可以在 Spring 的配置中添加如下代码:

 
  1. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

  2.  <property name="basePackage" v

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值