MyBatis传入多个参数的问题以及出现“无效的列类型: 1111 错误”问题的解决办法

一、MyBatis传入多个参数的问题

一、单个参数:

public List<XXBean> getXXBeanList(String xxCode);  

<select id="getXXXBeanList" parameterType="java.lang.String" resultType="XXBean">

  select t.* from tableName t where t.id= #{id}  

</select>  

其中方法名和ID一致,#{}中的参数名与方法中的参数名一直, 我这里采用的是XXXBean是采用的短名字,

select 后的字段列表要和bean中的属性名一致, 如果不一致的可以用 as 来补充。
复制代码

二、多参数:

public List<XXXBean> getXXXBeanList(String xxId, String xxCode);  

<select id="getXXXBeanList" resultType="XXBean">

  select t.* from tableName where id = #{0} and name = #{1}  

</select>  

由于是多参数那么就不能使用parameterType, 改用#{index}是第几个就用第几个的索引,索引从0开始
复制代码

三、Map封装多参数:

public List<XXXBean> getXXXBeanList(HashMap map);  

<select id="getXXXBeanList" parameterType="hashmap" resultType="XXBean">

  select 字段... from XXX where id=#{xxId} code = #{xxCode}  

</select>

其中hashmap是mybatis自己配置好的直接使用就行。map中key的名字是那个就在#{}使用那个,map如何封装就不用了我说了吧。
复制代码

四、List封装in:

public List<XXXBean> getXXXBeanList(List<String> list);  

<select id="getXXXBeanList" resultType="XXBean">
  select 字段... from XXX where id in
  <foreach item="item" index="index" collection="list" open="(" separator="," close=")">  
    #{item}  
  </foreach>  
</select> 

foreach 最后的效果是select 字段… from XXX where id in (‘1’,‘2’,‘3’,‘4’)
复制代码

五、多参数传递之注解方式示:

例子:

public AddrInfo getAddrInfo(@Param("corpId")int corpId, @Param("addrId")int addrId);

xml配置这样写:

<select id="getAddrInfo"  resultMap="com.xxx.xxx.AddrInfo">
       SELECT * FROM addr__info 
    where addr_id=#{addrId} and corp_id=#{corpId}
</select>

以前在语句中要带parameterType的,现在可以不要这样写。
复制代码

六、selectList()只能传递一个参数,但实际所需参数既要包含String类型,又要包含List类型时的处理方法:

将参数放入Map,再取出Map中的List遍历。如下:

List<String> list_3 = new ArrayList<String>();
Map<String, Object> map2 = new HashMap<String, Object>();

list.add("1");
list.add("2");
map2.put("list", list); //网址id

map2.put("siteTag", "0");//网址类型
 
public List<SysWeb> getSysInfo(Map<String, Object> map2) {
  return getSqlSession().selectList("sysweb.getSysInfo", map2);
}
<select id="getSysInfo" parameterType="java.util.Map" resultType="SysWeb">
  select t.sysSiteId, t.siteName, t1.mzNum as siteTagNum, t1.mzName as siteTag, t.url, t.iconPath
   from TD_WEB_SYSSITE t
   left join TD_MZ_MZDY t1 on t1.mzNum = t.siteTag and t1.mzType = 10
   WHERE t.siteTag = #{siteTag } 
   and t.sysSiteId not in 
   <foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
       #{item}
   </foreach>
 </select>

二、Mybatis一对多传递多个参数和自定义参数(实例)

问题:
假设a方法中传入一个带查询参数x,而子查询里也要这个参数
如何在子查询b中带入这个参数

一般一对多查询方式:

/**
 * 按User表中platform查询User
 */
@Select("select * from user where pid = #{id}")
List<User> findUsers(int id);

/**
 * 一对多查询
 */
@Select("select * from platform where 1 = 1")
@Results({
        /*@Result(property = "id" , column = "id"),*/
        @Result(property = "users",
                /*javaType = List.class,*/
                //对platform表中id属性进行一对多查询
                column = "id",
                many = @Many(select = "mybatis.mapper.HelloMapper.findUsers")
        )
})
List<Platform> getPlatforms();

findUsers需要传入一个参数 -> 即使用platform表中id 可自动带入进行一对多查询
@Result中column = “id”
表示把父查询中id列每个值传递给子查询进行一对多查询
解决方案
表 shoppingcart :购物车 主要包含商家id字段,商品id及信息,顾客id等等
为了某个顾客显示先购物车中商家,再显示商家中商品,需要传入一个顾客id
查询商家需要顾客id作为查询条件,查询商品需要商家id和顾客id两个条件
如果按以上的方法,(商家表中没有顾客id)无法传递顾客参数
(假设仅传递一个商家id参数的话,子查询两个参数都会被设定为商家id值进行查询)
思路:把顾客id放进查询中保存起来,并给他取一个别名
这样之后,顾客id即可传递给子查询

/**
     * 按顾客id查询其购物车(商家->商品 一对多查询)
     * @param consumerId 顾客id
     * @return 购物车商品列表
     */
    @Select("select distinct saler.id,saler.shopname,#{consumerId} as consumerId from shoppingcart \n" +
            "join saler on saler.id = shoppingcart.salerId \n" +
            "where consumerId = #{consumerId}")
    @Results(
            @Result(
                    property = "goods",
                    column = "{salerId = id,consumerId = consumerId}",
                    many = @Many(select = "cn.datacharm.springbootvuecli.dao.CartMapper.findGoodsBySalerId")
            )
    )
    List<Shop> findCartById(Integer consumerId);

    @Select("select \n" +
            "sid,consumerId,productName,price,photo,\n" +
            "shoppingcart.salerId,\n" +
            "shoppingcart.productId,\n" +
            "shoppingcart.amount\n" +
            "from shoppingcart\n" +
            "join saler_inventory on shoppingcart.salerId = saler_inventory.salerId\n" +
            "and shoppingcart.productId = saler_inventory.productId\n" +
            "where shoppingcart.salerId = #{salerId}\n"+
            "and consumerId = #{consumerId}" )
    List<Goods> findGoodsBySalerId(Integer salerId,Integer consumerId);
  • @Result中column = "{salerId = id,consumerId = consumerId}",表示把id列和consumerId列取出
  • id列值使用salerId,consumerId列使用consumerId 表示(类似别名,对应子查询参数,然后以这两个参数进行子查询

三、Mybatis出现:无效的列类型: 1111 错误

在使用Mybatis时,不同的xml配置文件,有的会提示:无效的列类型: 1111

比如这个sql:

update base.sys_person t
   set t.rybh=#{rybh},t.xm=#{xm},t.ryzt=#{ryzt},t.sfzhm=#{sfzhm},t.xb=#{xb},t.sj=#{sj},t.yx=#{yx},t.jtzz=#{jtzz},t.bz=#{bz},t.csrq=#{csrq}
  where t.ryid=#{ryid}

在csrq有值时不会报错,csrq为空时会报上述错误:
原因时什么呢?官方文档显示:
在这里插入图片描述

这句话的意思是,如果对一个属性字段,需要传递null值,(尤其是Date,int等类型时),jdbcType是必要的。(我觉得为了不出错,每个字段都写也是可以的)。

那好,根据上述文字修改:

update base.sys_person t
     set t.rybh=#{rybh},t.xm=#{xm},t.ryzt=#{ryzt},t.sfzhm=#{sfzhm},t.xb=#{xb},t.sj=#{sj},t.yx=#{yx},t.jtzz=#{jtzz},t.bz=#{bz},t.csrq=#{csrq,jdbcType=TIMESTAMP}
     where t.ryid=#{ryid}

问题解决。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值