mybatis框架及原理分析

本文详细介绍了MyBatis框架的工作原理,包括其作为对象关系映射持久型框架的角色,如何通过XML或注解配置各种statement,以及如何整合到Spring环境中。文章还探讨了多数据源配置、MapperFactoryBean与MapperScannerConfigurer的区别,以及resultMap的高级用法。

转载于:https://www.talktop.cn/?p=371

什么是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>
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值