MyBatis动态SQL实现ORDER BY和LIMIT的控制?

MyBatis如果想用动态SQL实现ORDER BY和LIMIT语句的运行与否,怎么办?

阅读 27.3k
4 个回答

不是很确定您的需求,不过您可以试试在mapper接口上加上 @SelectProvider 这个注解,通过自定义sql的方式,可以根据参数对sql进行不同的处理.相同的,还有 @UpdateProvider , @DeleteProvider , @InsertProvider 这些注解.

这是一个对User分页带过滤查询,你可以参考

dao层参数组装写法

    public List<User> find(String key, Integer offset, Integer rowCount) {
        Map<String, Object> params = getParameterMap();
        params.put("name", key);
        params.put("offset", offset);
        params.put("rowCount", rowCount);
        return getSqlSession().selectList(User.class.getName().find, params);
    }

配置文件写法

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.stephen.ssm.model.User">
    <resultMap type="User" id="userMap">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
    </resultMap>

    <sql id="pagination">
        <if test="offset != null and rowCount!= null">
            <![CDATA[
                LIMIT #{offset},#{rowCount}
            ]]>
        </if>
    </sql>

    <select id="find" resultMap="userMap" parameterType="map">
        <![CDATA[
            SELECT * FROM users WHERE 1 = 1
        ]]>
        <if test="name != null">
            <![CDATA[
                AND name LIKE CONCAT('%', #{name}, '%')
            ]]>
        </if>
        <![CDATA[
            ORDER BY id ASC
        ]]>
        <include refid="pagination" />
    </select>

    <select id="getCount" resultType="Integer" parameterType="map">
        <![CDATA[
            SELECT COUNT(id) FROM users WHERE 1 = 1
        ]]>
        <if test="name != null">
            <![CDATA[
                AND name LIKE CONCAT('%', #{name}, '%')
            ]]>
        </if>
    </select>

</mapper>
新手上路,请多包涵

楼主现在有答案了吗?我唯一能想到的就是在toString()后面直接添加limit语句,不知道你是怎么解决的,感谢回答!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏