一、什么是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>

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注