分页查询(二)MyBatis中利用Mapper.xml的Include标签解决方案 [附源码]

动机

选择MyBatis作为项目持久化方案时,通常第一件事就是写一个的分页查询作为项目组的通用解决方案。百度会告诉你有很多别人写好的MyBatis 分页插件。实现的方法也比较简单,类似与参数驱动sql插件。笔者推荐使用MyBatis配置文件中的include来解决分页的问题。

配置MyBatis对不同数据库的支持

spring 4 配置类配置 MyBatis 的 sqlSessionFactory 。这个配置是为了解决不同数据库之间的方言差别。

@SuppressWarnings("SpringJavaAutowiringInspection")
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(@Autowired DataSource dataSource) throws IOException {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        ...........................
        Properties properties = new Properties();
        properties.setProperty("Oracle","oracle");
        properties.setProperty("DB2","db2");
        properties.setProperty("MySQL","mysql");
        properties.setProperty("SQL Server","sqlserver");
        properties.setProperty("H2","h2");

        /*PropertiesFactoryBean propertiesFactory = new PropertiesFactoryBean();
        propertiesFactory.setProperties(properties);*/

        DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
        databaseIdProvider.setProperties(properties);
        sessionFactory.setDatabaseIdProvider(databaseIdProvider);

        ...........
        return  sessionFactory;
    }

配置一个共用的Mapper.xml

这个Mapper.xml中配置分页sql语句片段,是这个方案的重点。完整的文档参见BaseMapper.xml在这个文件中定义了各种数据库分页的语法。



<mapper namespace="com.centit.framework.mybatis.dao.BaseDao">
    
    <sql id="pageBegin" databaseId="oracle">
    sql>

    
    <sql id="pageEnd" databaseId="oracle"> #{startRow} ]]>sql>

    
    <sql id="pageBegin" databaseId="mysql">sql>

    
    <sql id="pageEnd" databaseId="mysql">sql>


    
    <sql id="pageBegin" databaseId="sqlserver">sql>

    
    <sql id="pageEnd" databaseId="sqlserver">= #{startRow} AND __row_nr__ < #{endRow} ]]>sql>


    
    <sql id="pageBegin" databaseId="db2">sql>

    
    <sql id="pageEnd" databaseId="db2"> #{startRow} order by rownumber_ ]]>sql>

    
    <sql id="pageBegin" databaseId="h2">sql>

    
    <sql id="pageEnd" databaseId="h2">sql>
mapper>

分页查询使用示例

调用分页查询的传入的Map参数必须要 startRow、maxSize、endRow 这三个参数。

 
    <select id="pageQuery" parameterType="map" resultMap="UnitInfo">
        
        <include refid="com.centit.framework.mybatis.dao.BaseDao.pageBegin" />
        <include refid="coreSql" />
        <where>
            <include refid="condition" />
        where>
        <if test="mybatisOrderBy != null and mybatisOrderBy != '' ">
            order by ${mybatisOrderBy}
        if>
        
        <include refid="com.centit.framework.mybatis.dao.BaseDao.pageEnd" />
    select>

总结

感觉这样做的好处是充分利用MyBatis原有的特性,并且修改也相对灵活,只要修改xml配置文件,虽然笔者非常讨厌xml配置文件,在南大先腾框架中引入spring 4 的配置类消灭了几乎所有可以消灭的配置xml文件。

你可能感兴趣的:(先腾开源框架)