springmybatis的结合肯定不会陌生,但是回想起来mybatis的使用与原理似乎有些模糊了,故重新搭建操作理一下思路。


使用的版本:

  • mybatis-spring-2.0.3
  • mybatis-3.4.5
  • spring-5.0.2
  • java-8
虽然没有按着官方文档上的来,但是没有发现任何的问题,有问题望指正。
image.png

mybatis 部分

全局配置文件

mybatis-config.xml 使用mybatis最基本的全局配置,单个使用mybatis时需要配置最基本的数据源(DataSource)、事务管理器(TransactionManager)和映射器(mapper),再在自己的代码中创建SqlSessionFactoryBuilder构建SqlSessionFactory,再获取session执行自定义映射文件中包含的sql方法

但是在spring-mybatis的整合时,要配置的很少,最简单的配置一个实体类包名即可,其余内容可以在spring部分配置。

mapper接口与映射文件

interface xxxMapper 就是单纯的包含一组有关xxx实体类的相关CRUD方法。

xxxMapper.xml 是针对各自的实体类进行单独的sql语句配置,其中最关键的当属namespace标签,因为靠它来找到需要执行的sql。其中接口的全限名,就是映射文件中的namespace的值;接口的方法名,就是映射文件中MappedStatement的id值(在Mybatis中,每一个<select>、<insert>、<update>、<delete>标签,都会被解析为一个MappedStatement对象);接口方法内的参数,就是传递给sql的参数。

Mapper接口是没有实现类的,当调用接口方法时,接口全限名+Mapper接口里的方法,是不能重载的,因为是全限名+方法名方法名拼接字符串作为key值,可唯一定位一个MappedStatement,举例:com.mybatis.mapper.UserMapper.selectUser,可以唯一找到namespace为com.mybatis.mapper.UserMapper下面id为selectUser的MappedStatement。

Mapper接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。

Mapper接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。

spring 部分

mybatis其余配置
  1. jdbc.properties: 提供了 org.springframework.beans.factory.config.PropertyPlaceholderConfigurer类,其中locations属性可用于加载该文件中key-value作该xml中变量使用。如: ${username}
  2. c3p0连接池: 配置com.mchange.v2.c3p0.ComboPooledDataSource 数据库连接bean
  3. SqlSessionFactory: 在spring中配置需要org.mybatis.spring.SqlSessionFactoryBean bean,作用同mybatis中sqlSessionFactory,用作创建sqlsession,该bean中需配置三个属性: dataSource(引用上面配置的连接池)、configLocation(mybatis主配置文件类路径)、mapperLocations(映射文件对应的包路径)
  4. mapper接口扫描:有多种配置方法,使用bean org.mybatis.spring.mapper.MapperScannerConfigurer下属性basePackage配置即可
  5. 配置spring事务管理器: org.springframework.jdbc.datasource.DataSourceTransactionManager


温故而知新,写个文章更加新,在路上。


Suka
333 声望263 粉丝

Learning for myself.