zoukankan      html  css  js  c++  java
  • Mybatis实战之TypeHandler高级进阶

                    <input type="hidden" class="isFancy">
                    
                        
                            <header class="article-header">
                                
    
    <h1 class="article-title" itemprop="name">
      Mybatis实战之TypeHandler高级进阶
    </h1>
    
    
    
                            </header>
                            
                                <div class="article-info article-info-post">
                                    
    <div class="article-tag tagcloud">
    	<ul class="article-tag-list"><li class="article-tag-list-item"><a class="color5" href="/tags/java/" style="font-size: 12px;">java</a></li><li class="article-tag-list-item"><a class="color3" href="/tags/mybatis/" style="font-size: 12px;">mybatis</a></li></ul>
    </div>
    
    
                                        
    <div class="article-category tagcloud">
    <a class="color5" href="/categories/后端技术/" style="font-size: 12px;">后端技术</a>
    </div>
    
    
                                            <div class="clearfix"></div>
                                </div>
                                
                                    
    
                                        <div class="article-entry" itemprop="articleBody">
                                           <!--
                                            
    
                                                    <p class="toc-button">目录</p>
    
  • 实战
    1. 1. SqlSessionFactoryBean
    2. 2. DefaultSqlSessionFactoryBean
    3. 3. 最后
                                        -->
                                        
                                                 <p>上篇文章分享了在项目实战中自定义Mybatis的TypeHandler来处理枚举类型。文章结尾也指出了美中不足之处,那就是每次都需要指定我们自定义的枚举TypeHandler。 随着项目枚举类型的增多,每次都要写一遍这个会令人很反感。那么,本次我们就来解决这一痛点。<br><a id="more"></a></p>

思路分析

  1. 上篇文章讲到, mybatis有默认的处理枚举类型的TypeHandler,因此,我们要将我们自定义的枚举TypeHandler注册进入Mybatis。

  2. 注册完我们自定义的TypeHandler后,还得告诉Mybatis只要一遇到我们指定的枚举类型(上篇的DisplayedEnum)就用自定义的枚举TypeHandler(上篇为EnumTypeHandler)进行转换。由于Mybatis在启动时就会通过TypeHandlerRegistry进行注册,即建立JdbcType, JavaType, TypeHandler三者之间的关系, 因此,这意味着在Mybatis启动时我们也需要通过TypeHandlerRegistry将我们的所有的枚举类型(JavaType)与自定义的枚举TypeHandler(EnumTypeHandler)建立联系。

为了方便大家理解, 贴上Mybatis中的TypeHandlerRegistry的相关部分源码:

实战

SqlSessionFactoryBean

由于我们项目使用了Spring, 是用Spring集成的Mybatis(废话,大家都是这么干的)。Spring通过SqlSessionFactoryBean来初始化启动Mybatis。 因此,我们应该在它身上下手,然而,一切并不是那么顺利。

查看了一下SqlSessionFactoryBean的源码,发现SqlSessionFactoryBean并没有任何地方可以让我们切入, 进而来调用TypeHandlerRegistry进行注册我们的枚举。 更令人蛋疼的是其所有属性全是private, 这下不仅AOP切入不行,连通过继承偷懒都不行了。

作罢,咱只有老老实实的重写一遍SqlSessionFactoryBean的代码了(copy还不简单)。

DefaultSqlSessionFactoryBean

代码量比较多,就只贴关键代码了。步骤如下:

  1. DefaultSqlSessionFactoryBean继承SqlSessionFactoryBean。
  2. 将SqlSessionFactoryBean中的代码全部copy到DefaultSqlSessionFactoryBean。
  3. 调用以下方法。

切记, 以上代码要在这个代码之前执行:

因为, xmlMapperBuilder.parse()方法会开始解析我们所有的所有mapper.xml的配置文件了,这时候会把resultMap也解析了,这就会导致我们自定义的TypeHandler不生效。
切记! 切记

最后

以上,代码算是完工了,记得在Spring的配置文件中, 将SqlSessionFactoryBean替换为我们的DefaultSqlSessionFactoryBean。 不然我们的活就是白干了。

接下来,就可以开始浪了, 之前我们需要这样写:

<resultMap>
    ...
    <result column="status" jdbcType="TINYINT" property="status" typeHandler="xxx.xxx.EnumTypeHandler" />
    ...
</resultMap>

而现在,我们可以不写typeHandler了。

<resultMap>
    ...
    <result column="status" jdbcType="TINYINT" property="status" />
    ...
</resultMap>

好啦,本次就写到这儿。

                                    </div>

                                    
        </div>
查看全文
  • 相关阅读:
    静态连接库
    03数据的增删改查
    02MySQL中的数据类型
    01MySQL的 库、表初步认识
    Python 函数
    Linux系统目录结构
    Linux系统启动过程
    第三章 Web页面建设
    《第二章:深入了解超文本》
    《HTML与CSS 第一章 认识HTML》读书笔记
  • 原文地址:https://www.cnblogs.com/zhuhui-site/p/10090852.html
  • Copyright © 2011-2022 走看看