zoukankan      html  css  js  c++  java
  • Mybatis Sql片段的应用

    Markdown

    在一个查询里,针对各种不同数据库,有时候只是一部分 SQL 是不相同的,为避免相同的部分复制多次,所以将不相同的部分进行适当的隔离,再重用就可以了。

    在 MyBatis 里声明两段 片段,它们分别对应不同数据库:

    <sql databaseId="sqlserver" id="GetListByPaging-Fragment">
    </sql>
    
    <sql databaseId="postgresql" id="GetListByPaging-Fragment">
    </sql>
    

    可以发现,id 属性的值是相同的,而 databaseId 不同。在引用时将该 id 值赋给 include 的 refid,这样 MyBatis 就可以根据数据库的不同来选择相符的 Sql 片段。

    为主 SQL 先声明好 引用:

    <include refid="GetListByPaging-Fragment" />
    

    接下来完整配置步骤如下:

    为 MyBatis 准备好基础配置(mybatis.cfg.xml)

    <bean id="vendorProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="properties">
            <props>
                <prop key="SQL Server">sqlserver</prop>
                <prop key="DB2">db2</prop>
                <prop key="Oracle">oracle</prop>
                <prop key="MySQL">mysql</prop>
                <prop key="H2">h2</prop>
                <prop key="PostgreSQL">postgresql</prop>
            </props>
        </property>
    </bean>
    
    <bean id="databaseIdProvider" class="org.apache.ibatis.mapping.VendorDatabaseIdProvider">
        <property name="properties" ref="vendorProperties"/>
    </bean>
     
    <!--配置 sqlSessionFactory 解析数据源、别名等等 -->
    <!-- sqlserver ,postgresql ,oracle ,mysql ,sqlite ,db2 ,mariadb ,hsqldb ,informix -->
    <bean name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource"          ref="dataSource-Default" />
        <property name="databaseIdProvider"  ref="databaseIdProvider" />
        <property name="typeAliasesPackage"  value="ruanxi.queen.model" />
        <property name="typeHandlersPackage" value="ruanxi.mybatis3.typeHandlers" />
        <property name="mapperLocations"     value="classpath*:mapper/*.xml" />
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageHelper">
                    <property name="properties">                    
                        <value>
                            dialect=sqlserver
                        </value>
                    </property>
                </bean>
            </array>
        </property>
    </bean>
    

    配置好 PropertiesFactoryBean 和 VendorDatabaseIdProvider,然后为 SqlSessionFactoryBean 的 databaseIdProvider 属性加上 ref 引用。

    在 Mapper 的 xml 文件里就可以应用 Sql 片段了(IOrgGradeCategoryDao.xml)

    <mapper namespace="ruanxi.queen.iDao.IOrgGradeCategoryDao">
        <!-- 分页查询 -->
        <select id="GetListByPaging" parameterType="orgGradeCategorySearch" resultType="orgGradeCategoryGrid">
            Select orgGradeCategoryId, orgGradeCategoryName, orgGradeCategoryCode, sortCode, description, isEnabled, createTime
            From BaseOrgGradeCategory
     
            <!-- 使用 trim 语法代替 where,它最大的好处是能智能判断 where/and/or 的出现时机,避免动态 SQL 的语法错误。 -->
            <!-- Order by 依然放在最后,确保分页能正常使用 -->
            <trim prefix="WHERE" prefixOverrides="AND|OR">
                <include refid="GetListByPaging-Fragment" />
            </trim>
            Order By sortCode DESC
        </select>
    
        <sql databaseId="sqlserver" id="GetListByPaging-Fragment">
            <if test="orgGradeCategoryName != null and orgGradeCategoryName != '' ">and orgGradeCategoryName like '%' + #{orgGradeCategoryName} + '%'</if>
        </sql>
    
        <sql databaseId="postgresql" id="GetListByPaging-Fragment">
            <if test="orgGradeCategoryName != null and orgGradeCategoryName != '' ">and orgGradeCategoryName like '%' || #{orgGradeCategoryName} || '%'</if>
        </sql>
     
    </mapper>
    

    上述代码已针对 sqlserver 和 postgresql 两个数据库声明了 Sql 片段,在运行时,Mybatis 会根据数据库的不同而自行选择执行合适的片段。

  • 相关阅读:
    Windows下升级MySQL5.0到5.5
    聊聊MVC和模块化以及MVVM和组件化
    还有很多行业,并没有和互联网相加
    用React实现一个自动生成文章目录的组件
    一个Js开发者学习Python的第一天
    React弹窗组件
    React项目开发经验汇总
    Audio 标签的使用和自己封装一个强大的React音乐播放器
    你知道的和不知道的sass
    我眼中javascript的这些年
  • 原文地址:https://www.cnblogs.com/ramantic/p/7523807.html
Copyright © 2011-2022 走看看