关于拼接SQL语句sqlMap的使用方法

本文详细介绍了一种在MyBatis框架中实现动态SQL的方法,通过在Java实体类中使用自定义SQL映射,结合XML配置文件中的动态SQL元素,实现了灵活的数据查询。特别关注了数据权限过滤条件的动态生成,确保了系统的安全性与灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.为什么使用?

  主要还是为了代码中获取到值,然后带入SQL语句中拼接查询

2.怎么使用?

1)bean继承了BaseEntity类,该类中有

复制代码

    /**
     * 自定义SQL(SQL标识,SQL内容)
     */
    protected Map<String, String> sqlMap;
    @JsonIgnore
    @XmlTransient
    public Map<String, String> getSqlMap() {
        if (sqlMap == null){
            sqlMap = Maps.newHashMap();
        }
        return sqlMap;
    }
     public void setSqlMap(Map<String, String> sqlMap) {
        this.sqlMap = sqlMap;
    }

复制代码

2)XML中如何写?

复制代码

<select id="findList" resultType="ZlfbBean">
        SELECT * FROM (
            SELECT    <include refid="ZlfbBeanColumns"/>
            FROM ZL_HCZZ i <include refid="ZlfbBeanJoins"/>
            <where>
            AND i.del_flag = #{DEL_FLAG_NORMAL} 
            ${sqlMap.dsf} //此处加入service中的限制条件
            <if test="zlbh != null and zlbh != ''">
                AND i.ZLBH = #{zlbh}
            </if>
            <if test="createBy != null and createBy.id != null and createBy.id != ''">
                AND i.CREATE_BY = #{createBy.id}
            </if>
            <if test="office != null and office.id != null and office.id != ''">
                AND i.OFFICE_ID = #{office.id}
            </if>
            </where>
            ORDER BY i.CREATE_DATE DESC,i.UPDATE_DATE DESC
        ) t
        <where>
            AND t.del_flag = #{DEL_FLAG_NORMAL} 
            <if test="beginInDate != null and beginInDate != ''">
                AND t.CREATE_DATE <![CDATA[ >= #{beginInDate} ]]>
            </if>
            <if test="endInDate != null and endInDate != ''">
                AND t.CREATE_DATE <![CDATA[ <= #{endInDate} ]]>
            </if>
        </where>
    </select>

复制代码

3)service中:

复制代码

public Page<ZlfbBean> findzlfb(Page<ZlfbBean> page,ZlfbBean bean){
        // 生成数据权限过滤条件(dsf为dataScopeFilter的简写,在xml中使用 ${sqlMap.dsf}调用权限SQL)
        User user = UserUtils.getUser();
        String dsf = dataScopeFilter( user, "l", "k");//返回的是如AND (k.id='user.getId()')
        if((bean.getCreateBy()==null || bean.getCreateBy().getId().equals("")) && (bean.getOffice()==null || bean.getOffice().getId().equals(""))){
            dsf = dsf+" OR i.zlbh IN( "
                +" SELECT  DISTINCT t1.zlbh FROM ZL_HCZZ t1 join ZL_HCZZSP t2 on t1.zlbh=t2.zlbh where t2.CREATE_BY = "+user.getId()
                +" ) "
                +" OR i.zlbh IN( " 
                +" SELECT  DISTINCT t1.zlbh FROM ZL_HCZZ t1 join ZL_HCZZQS t2 on t1.zlbh=t2.zlbh where t2.CREATE_BY = "+user.getId()+" OR ((SELECT COUNT(1) FROM SYS_USER WHERE id="+user.getId()+" and qsqx='01' and office_id='"+user.getOffice().getId()+"') > 0 ) AND t2.QS_DW = '"+user.getOffice().getId()+"' "
                +" ) "
                +" OR i.zlbh IN( "
                +" SELECT  DISTINCT t1.zlbh FROM ZL_HCZZ t1 join ZL_HCZZFK t2 on t1.zlbh=t2.zlbh where t2.CREATE_BY = "+user.getId()
                +" ) ";
        }
        bean.getSqlMap().put("dsf", dsf);给sqlmap集合中添加值,即添加一个dsf字符串的值为dsf
        // 设置分页参数
        bean.setPage(page);
        // 执行分页查询
        page.setList(zlfbDao.findList(bean));
        return page;
    }

复制代码

 

分类: java

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值