专栏文章 我的开发日记 (二)

FunTester · 2020年06月16日 · 最后由 FunTester 回复于 2020年06月18日 · 2714 次阅读

今天主要做了测试用户模块的基础数据的管理,遇到了一个比较头大的问题,用户属性存的都是id,但是返给前端需要转成相应的string类型,然后还有各种非必传参数的验证,一下子来个这么复杂的SQL,特别在是在mybatisXML文件中配置,着实让我学习了一阵子。分享一下学习成果。

需求图如下,按照几种筛选条件获取当前用户创建的测试用户列表:

接口文档如下:

里面都是必传参数,string类型默认 ""number默认0表示全部。

下面是我的XML文件内容:

<sql id="table">
    qa_test_user
</sql>

<sql id="user_status">
    qa_user_status_name
</sql>

<sql id="env">
    family_base_env
</sql>

<sql id="user_role">
    qa_role_name
</sql>

<select id="findUsers" parameterType="com.okay.family.common.bean.testuser.SearchUserBean"
        resultType="com.okay.family.common.bean.testuser.TestUserBean">
    select tu.id,tu.descc,tu.user,tu.phone,tu.password,tu.create_time,us.name status,env.name env,ur.name role from
    <include refid="table"/>
    tu
    left join
    <include refid="user_status"/>
    us on tu.status = us.status
    left join
    <include refid="env"/>
    env on tu.envId = env.id
    left join
    <include refid="user_role"/>
    ur on tu.roleId = ur.roleId
    where tu.uid = #{uid}
    <if test="status != 0">
        and tu.status = #{status}
    </if>
    <if test="envId != 0">
        and tu.envId = #{envId}
    </if>
    <if test="roleId != 0">
        and tu.roleId = #{roleId}
    </if>
    <choose>
        <when test="type == 0 and query != null and query != ''">
            and tu.user = #{query}
        </when>
        <when test="type == 1 and query != null and query != ''">
            and tu.phone = #{query}
        </when>
        <when test="type == 2 and query != null and query != ''">
            and tu.id = #{query}
        </when>
    </choose>

</select>

下面是Java bean的内容:

package com.okay.family.common.bean.testuser

import com.okay.family.common.basedata.OkayConstant
import com.okay.family.fun.base.bean.AbstractBean
import org.hibernate.validator.constraints.Range

import javax.validation.constraints.Min

class SearchUserBean extends AbstractBean {

    private static final long serialVersionUID = 894894891651651L;

    int uid

    @Range(min = 0L, max = OkayConstant.ENV, message = "环境参数错误")
    int envId

    @Min(value = 1L)
    int pageNum

    @Range(min = 5L, max = 20L, message = "每页显示数量设置错误")
    int pageSize

    @Range(min = 0L, max = 10L, message = "用户身份参数错误")
    int roleId

    @Range(min = 0L, max = OkayConstant.USER_STATUS, message = "用户状态参数错误")
    int status

    String query

    @Range(min = 0l, max = 2L, message = "搜索类型出错!0账号1手机号2用户id")
    int type

}

总算是解决了这个难题,剩下的继续搬砖,终于体会到开发的难处了:牵一发而动全身,改个属性名,乱七八糟的地方修改不下五处,但愿提测时候BUG能少点。


  • 郑重声明:公众号 “FunTester” 首发,欢迎关注,禁止第三方转载。更多原创文章:FunTester 十八张原创专辑,合作请联系Fhaohaizi@163.com
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 5 条回复 时间 点赞

有点好奇,为何 mybatis xml 里面需要用这么多应用 sql 只是个列名的 <include refid="user_status"/> ?我一般看到用 include 都是 sql 比较长而且比较多地方会需要 copy paste ,采用 include 方便维护的。如果只是个列名,且只有一处用到,好像没有用 include 的必要?

另外, query 如果输入框没填,没有做特殊判定处理的话,前端传给后端应该是个空字符串,而非 null 。那么此时 mybatis 里面

<when test="type == 0 and query != null">
    and tu.user = #{query}
</when>

这里会变成 and tu.user = '' ,反而可能导致一个都没匹配到。

陈恒捷 回复

第一个问题的确是这样,我这里只用了用到了表名,没有用到列名。user_status 是用户 id 和名称对应关系表名,不是列名,起名没弄好,容易混淆了。
第二个,这里需求是精确查询,你说的这个是个问题,跟前端商量之后,已经改了。

陈恒捷 回复

已改好,谢大佬指点

FunTester 回复

客气啦,这么快就改好了,点赞!

陈恒捷 回复

先做了非空校验,然后判空。大佬指正,火速修改。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册