序
spring
与mybatis
的结合肯定不会陌生,但是回想起来mybatis的使用与原理似乎有些模糊了,故重新搭建操作理一下思路。
始
使用的版本:
- mybatis-spring-2.0.3
- mybatis-3.4.5
- spring-5.0.2
- java-8
虽然没有按着官方文档上的来,但是没有发现任何的问题,有问题望指正。
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其余配置
- jdbc.properties: 提供了
org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
类,其中locations属性可用于加载该文件中key-value作该xml中变量使用。如: ${username} - c3p0连接池: 配置
com.mchange.v2.c3p0.ComboPooledDataSource
数据库连接bean - SqlSessionFactory: 在spring中配置需要
org.mybatis.spring.SqlSessionFactoryBean
bean,作用同mybatis中sqlSessionFactory,用作创建sqlsession,该bean中需配置三个属性:dataSource
(引用上面配置的连接池)、configLocation
(mybatis主配置文件类路径)、mapperLocations
(映射文件对应的包路径) - mapper接口扫描:有多种配置方法,使用bean
org.mybatis.spring.mapper.MapperScannerConfigurer
下属性basePackage配置即可 - 配置spring事务管理器:
org.springframework.jdbc.datasource.DataSourceTransactionManager
结
温故而知新,写个文章更加新,在路上。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。