spring
与mybatis
的结合确定不会陌生,可是回想起来mybatis的使用与原理彷佛有些模糊了,故从新搭建操做理一下思路。java
虽然没有按着官方文档上的来,可是没有发现任何的问题,有问题望指正。
![]()
mybatis-config.xml
使用mybatis最基本的全局配置,单个使用mybatis时
须要配置最基本的数据源(DataSource)、事务管理器(TransactionManager)和映射器(mapper),再在本身的代码中建立SqlSessionFactoryBuilder构建SqlSessionFactory,再获取session执行自定义映射文件中包含的sql方法spring
可是在spring-mybatis的整合时
,要配置的不多,最简单的配置一个实体类包名便可,其他内容能够在spring部分配置。sql
interface xxxMapper
就是单纯的包含一组有关xxx实体类的相关CRUD方法。数据库
xxxMapper.xml
是针对各自的实体类进行单独的sql语句配置,其中最关键的当属namespace
标签,由于靠它来找到须要执行的sql。其中接口的全限名,就是映射文件中的namespace的值;接口的方法名,就是映射文件中MappedStatement的id值(在Mybatis中,每个<select>、<insert>、<update>、<delete>标签,都会被解析为一个MappedStatement对象);接口方法内的参数,就是传递给sql的参数。session
Mapper接口是没有实现类的,当调用接口方法时,接口全限名+Mapper接口里的方法,是不能重载的,由于是全限名+方法名方法名
拼接字符串做为key值,可惟必定位一个MappedStatement,举例:com.mybatis.mapper.UserMapper.selectUser
,能够惟一找到namespace为com.mybatis.mapper.UserMapper
下面id为selectUser
的MappedStatement。mybatis
Mapper接口的工做原理是JDK动态代理
,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所表明的sql,而后将sql执行结果返回。app
Mapper接口里的方法,是不能重载的,由于是全限名+方法名的保存和寻找策略。
org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
类,其中locations属性可用于加载该文件中key-value做该xml中变量使用。如: ${username}com.mchange.v2.c3p0.ComboPooledDataSource
数据库链接beanorg.mybatis.spring.SqlSessionFactoryBean
bean,做用同mybatis中sqlSessionFactory,用做建立sqlsession,该bean中需配置三个属性: dataSource
(引用上面配置的链接池)、configLocation
(mybatis主配置文件类路径)、mapperLocations
(映射文件对应的包路径)org.mybatis.spring.mapper.MapperScannerConfigurer
下属性basePackage配置便可org.springframework.jdbc.datasource.DataSourceTransactionManager
温故而知新,写个文章更加新,在路上。ui