一、什么是Mybatis
Mybatis是一个对象关系映射持久型框架,mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射以java对象返回。
二、Mybatis工作流程
mybatis工作流程:加载mybatis全局配置,解析配置文件,基于xml配置生成Configuration和一个个MapperStatement(对应crud标签),SqlSessionFactoryBuilder通过Configuration生成SqlSessionFatory对象,SqlSessionFactory生成SqlSeesion对象,SqlSession对象完成和数据的交互
程序通过SqlSession调用找到对应MapperStatement对象,然后通过Executor将MapperStatement对象进行解析,sql参数转化、sql动态拼接、生成jdbc statement对象,jdbc执行sql,执行结果通过MapperStatement映射返回
SqlSession对象是单线程对象,是非线程安全
三、Spring-mybatis整合
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<bean id="multipleDataSource" class="com.db.dataSource.MultipleDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="mainDataSource" value-ref="mainDataSource"/>
<entry key="redDataSource" value-ref="backDataSource"/>
<entry key="redTwoDataSource" value-ref="backTwoDataSource"/>
</map>
</property>
</bean>
<bean id="sqlSessionFactoryMaster" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="mapperLocations" value="classpath:mybatis/*Mapper.xml"></property>
<property name="typeAliasesPackage" value="com.db.vo"/>
<property name="dataSource" ref="multipleDataSource"></property>
</bean>
<bean id="masterGzsjDbMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.db.mapper.master.MasterGzsjDbMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactoryMaster" />
</bean>
<bean id="slaveOneGzsjDbMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.db.mapper.master.SlaveOneGzsjDbMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactoryMaster" />
</bean>
<bean id="mjTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="multipleDataSource" />
</bean>
<tx:advice id="mjtxjdbcAdvice" transaction-manager="mjTransactionManager">
<tx:attributes>
<!-- 传播行为 -->
<tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
<tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
<tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
<tx:method name="create*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
<tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
<tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
<tx:method name="batch*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
<tx:method name="query*" propagation="SUPPORTS" read-only="true" />
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 切面 -->
<aop:config>
<aop:pointcut id="service" expression="execution(* com.db.service.*.*(..))" />
<aop:advisor pointcut-ref="service" advice-ref="mjtxjdbcAdvice" order="2" />
<aop:advisor pointcut-ref="service" advice-ref="dataSourceMethodInterceptor" order="1" />
</aop:config>
多数据源配置通过AbstractRoutingDataSource动态数据源切换
通过aop切面动态切换数据源
通过实现MethodInterceptor类编写切面
spring与mybatis整合配置MapperFactoryBean 与 MapperScannerConfigurer区别
MapperFactory需要与Mapper接口一个个对应起来
MapperScannerConfigurer可以通过扫描包注入
四、ResultMap使用
resultmap可以处理复杂的关系映射,能处理一对多、多对一的处理
<!-- 1.type 对应类型,可以是javabean, 也可以是其它
2.id 必须唯一, 用于标示这个resultMap的唯一性,在使用resultMap的时候,就是通过id指定-->
<resultMap type="" id="">
<!-- id, 唯一性,注意啦,这个id用于标示这个javabean对象的唯一性, 不一定会是数据库的主键(不要把它理解为数据库对应表的主键) property属性对应javabean的属性名,column对应数据库表的列名(这样,当javabean的属性与数据库对应表的列名不一致的时候,就能通过指定这个保持正常映射了)-->
<id property="" column=""/>
<!-- result与id相比, 对应普通属性 -->
<result property="" column=""/>
<!--
constructor对应javabean中的构造方法
-->
<constructor>
<!-- idArg 对应构造方法中的id参数 -->
<idArg column=""/>
<!-- arg 对应构造方法中的普通参数 -->
<arg column=""/>
</constructor>
<!--
collection,对应javabean中容器类型, 是实现一对多的关键
property 为javabean中容器对应字段名
column 为体现在数据库中列名
ofType 就是指定javabean中容器指定的类型
-->
<collection property="" column="" ofType=""></collection>
<!--
association 为关联关系,是实现N对一的关键。
property 为javabean中容器对应字段名
column 为体现在数据库中列名
javaType 指定关联的类型
-->
<association property="" column="" javaType=""></association>
</resultMap>