mybatis的parameterType使用map实现真正的sql随意写

在dao层给map赋值

纠正一下应该把dd作为传入而不是sbiId;

sqlMap中的parameterType="java.util.Map", 就 OK

package com.ldrc.srm.jczx.web.results.module.screen;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;

import com.alibaba.citrus.service.requestcontext.parser.ParserRequestContext;
import com.alibaba.citrus.turbine.Context;
import com.ldrc.srm.common.web.OuUser;
import com.ldrc.srm.jczx.biz.common.DateUtil;
import com.ldrc.srm.jczx.biz.construction.technology.IndexPlanManager;
import com.ldrc.srm.jczx.dal.dataobject.construction.projectinfo.Assessment;
import com.ldrc.srm.jczx.dal.dataobject.construction.technology.PatentExecute;
import com.ldrc.srm.jczx.dal.dataobject.construction.technology.SmAssessmentPlan;

public class Kaimpatent {
    @Autowired
    private IndexPlanManager ipm;
    @Autowired
    ParserRequestContext parser;
    public void execute(Context context){
        OuUser ou = OuUser.getCurrentUser();
        Integer sbiId = ou.getSubjectBaseId();
        List<PatentExecute> pes = ipm.selectAllAimpatent();
        List<PatentExecute> pesList = new ArrayList<PatentExecute>();
        List<Assessment> ass = ipm.getAssessmentBySbiId(sbiId);
        List<SmAssessmentPlan> assessmentPlanList = new ArrayList<SmAssessmentPlan>();
        if (!ass.isEmpty()) {
            for (Assessment assessment : ass) {
                List<SmAssessmentPlan> assessmentPlan = assessment.getAssessmentPlan();
                if (!assessmentPlan.isEmpty()) {
                    assessmentPlanList.addAll(assessmentPlan);
                }
            }

            if (!assessmentPlanList.isEmpty()) {
                for (SmAssessmentPlan smAssessmentPlan : assessmentPlanList) {
                    Integer sadId = smAssessmentPlan.getSadId();
                    if (!pes.isEmpty()) {
                        for (PatentExecute patentExecute : pes) {
                            if (patentExecute.getSadId() != null && patentExecute.getSadId().equals(sadId)) {//使用程序代替sql相当于关联查询
                                pesList.add(patentExecute);
                            }
                        }
                    }
                }
            }
        }
        context.put("rUrl", parser.getRequest().getHeader("Referer"));
        context.put("pes", pesList);
        context.put("DateUtil", new DateUtil());

        /**
         * 上面的方法写了这么多其实不必
         * 一条sql就搞定
         * <select id="r" resultMap="BaseResultMap" parameterType="java.util.Map">
              select t3.* from sm_s_assessment t1
                left join SM_S_ASSESSMENT_PLAN t2
                    on t1.SASS_ID = t2.SASS_ID
                left join SM_PATENT_EXECUTE t3
                    on t2.SAD_ID = t3.SAD_ID
                where t1.SBI_ID = #{sbiId, jdbcType=INTEGER}
              </select>
              问题是我的resultMap中没有SBI_ID这个列,怎么办
              有办法, 注意到parameterType有没有比平时不一样没<select id="r" resultMap="BaseResultMap" parameterType="java.util.Map">
              呵呵, 就是parameterType="java.util.Map" ; 有了这个你可以在dao随意传递多少个参数, 不管下面的resultMap中有没有对应的列或属性
              注意的是dao里传参,
              Integer sbiId = 21;
            Map<String, Object> m = new HashMap<String, Object>();
            m.put("sbiId", sbiId);
            List<PatentExecute> selectList = sqlSession.selectList("PatentExecuteMapper.r", m);
              总结: 其实就是把parameterType平时使用的javaBean或四类八种换了 map, 原理是一样的
                       */
    }
}

sqlMap文件

<?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="PatentExecuteMapper" >
  <resultMap id="BaseResultMap" type="com.ldrc.srm.jczx.dal.dataobject.construction.technology.PatentExecute" >
    <id column="SPE_ID" property="speId" jdbcType="INTEGER" />
    <result column="SAD_ID" property="sadId" jdbcType="INTEGER" />
    <result column="SPE_NUM" property="speNum" jdbcType="VARCHAR" />
    <result column="SPE_APPLY_DATE" property="speApplyDate" jdbcType="DATE" />
    <result column="SPE_APPLY_REMARK" property="speApplyRemark" jdbcType="VARCHAR" />
    <result column="SPE_PEOPLE_NAME" property="spePeopleName" jdbcType="VARCHAR" />
    <result column="SPE_INVENT_NAME" property="speInventName" jdbcType="VARCHAR" />
    <result column="SPE_STUTAS" property="speStutas" jdbcType="VARCHAR" />
    <result column="SPE_PRIORITY" property="spePriority" jdbcType="VARCHAR" />
    <result column="SPE_PUBLISH_NUM" property="spePublishNum" jdbcType="VARCHAR" />
    <result column="SPE_ISSUE_NUM" property="speIssueNum" jdbcType="VARCHAR" />
    <result column="SPE_DIGEST" property="speDigest" jdbcType="VARCHAR" />
    <result column="SPE_MAIN_NUM" property="speMainNum" jdbcType="VARCHAR" />
    <result column="SPE_AGENT" property="speAgent" jdbcType="VARCHAR" />
    <result column="SPE_FILE" property="speFile" jdbcType="VARCHAR" />
    <collection property="files" column="SPE_FILE"
            ofType="com.ldrc.srm.jczx.dal.dataobject.file.SrmFile" select="SrmFileMapper.selectByEgCode"
            resultMap="SrmFileMapper.BaseResultMap">
    </collection>
  </resultMap>

  <sql id="Base_Column_List" >
    SPE_ID, SAD_ID, SPE_NUM, SPE_APPLY_DATE, SPE_APPLY_REMARK, SPE_PEOPLE_NAME, SPE_INVENT_NAME,
    SPE_STUTAS, SPE_PRIORITY, SPE_PUBLISH_NUM, SPE_ISSUE_NUM, SPE_DIGEST, SPE_MAIN_NUM,
    SPE_AGENT, SPE_FILE
  </sql>
    <select id="r" resultMap="BaseResultMap" parameterType="java.util.Map">
  select t3.* from sm_s_assessment t1
    left join SM_S_ASSESSMENT_PLAN t2
        on t1.SASS_ID = t2.SASS_ID
    left join SM_PATENT_EXECUTE t3
        on t2.SAD_ID = t3.SAD_ID
where t1.SBI_ID = #{sbiId, jdbcType=INTEGER}
  </select>
  <select id="selectAllAimpatent" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select *
    from SM_PATENT_EXECUTE
  </select>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select
    <include refid="Base_Column_List" />
    from SM_PATENT_EXECUTE
    where SPE_ID = #{speId,jdbcType=INTEGER}
  </select>
</mapper>
时间: 2024-10-11 20:03:25

mybatis的parameterType使用map实现真正的sql随意写的相关文章

mybatis中#{}与${}的差别(如何防止sql注入)

默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义. #相当于对数据 加上 双引号,$相当于直接显示数据 示例1:执行SQL:select * from emp where name = #{employeeName}参数:employeeName=>Smith解析后执行的SQL:select * from emp where name = ? 示例2:

mybatis框架中parameterType为Map的用法 和 数据库语句多层嵌套

当需用到参数Map里面的数据时,直接写传进去的key,例Map map = new HashMap(); map.put("currPage1",10); 在mybatis的xml文件中需要引用的地方写上currPage1,如下文 数据库语句多层嵌套时,先执行最里层的语句,表的别名定义语句的最里层,红色字体是多表联查时定义的查询最大记录数 例: <select id="query" parameterType="java.util.Map"

mybatis 之 parameterType=&quot;Map&quot;

// 获得品牌下的商品 Map<String, Object> params = new HashMap<String, Object>(); params.put("brands", brandId); List<HashMap<String, Object>> productBrands = productBrandService.getBrandProductByBrandId(params); public List<Has

Mybatis传入参数为map

Mapper: List<AdPayConfigEntity> selectByAdType(@Param("status") Integer... status); XML:<select id="selectByAdType" parameterType="map" resultMap="BaseResultMap"> SELECT * from sky_ad_pay_config WHERE ad

mybatis 之 parameterType=&quot;List&quot; 2

<select id="queryGoodsByGoodsNoPcweb" parameterType="List" resultMap="simpleProductExtLucene"> select g.goods_no, wp.PRODUCT_ID, p.product_name, p.drug_treatment, p.drug_prescription_type, p.product_least_order || '' as

Mybatis foreach嵌套遍历Map的key和value

最近做东西,需要向数据库存储一个保存在HashMap的key和value中的数据.具体的结构大致是Map<Object, Set<String>>. 数据库中需要保存两个个字段:1.key中对象的id,set中的多个string,显然id和set中的string是1对多的关系:需要嵌套循环. 一开始怀疑Mybatis能否做到这样灵活sql,经过尝试,证明了Mybatis的强大. 具体做法:(Oracle数据库) <insert id="saveMatchResult

Mybatis的resultMap返回map

<resultMap type="Map" id="bankMaintainMap"> <result column="bank_name" property="bankName"/> <result column="maintain_time_interval" property="maintainTimeInterval"/> </resul

解决:oracle+myBatis ResultMap 类型为 map 时,表字段类型有 Long/Blob/Clob 时报错

前言:最近在做一个通用查询单表的组件,所以 sql 的写法就是 select *,然后 resultType="map" .如果数据库中的表里有字段类型为 Long 等类型时,mybatis 在执行 sql 时会报错,如果表中有 Blob.Clob 类型在转 json 是也会报错,而且我这里也需要将这几种类型都转为 String 类型到前端. long 类型 sql 报错: Blob/Clob 转 json 报错: 解决方案: 自定义 typeHandle 来统一处理数据库这些特殊的字

记录一次mybatis中parameterType中使用String和string的区别

今天修改一个问题. xml中使用的是#{xxxx  jdbcType=String} 但是这个sql  查询需要用到  in 如果这样查询 会变成 in  ( "1,2,3,4,5") 所以我把他改成 in <foreach collection="xxx.split(',')" item="item" open="(" close=")" separator=","> #{