本文共 4675 字,大约阅读时间需要 15 分钟。
一、单个参数:
public ListgetXXBeanList(String xxCode);
其中方法名和ID一致,#{}中的参数名与方法中的参数名一直, 我这里采用的是XXXBean是采用的短名字,
select 后的字段列表要和bean中的属性名一致, 如果不一致的可以用 as 来补充。
复制代码二、多参数:
public ListgetXXXBeanList(String xxId, String xxCode);
由于是多参数那么就不能使用parameterType, 改用#{index}是第几个就用第几个的索引,索引从0开始
复制代码三、Map封装多参数:
public ListgetXXXBeanList(HashMap map);
其中hashmap是mybatis自己配置好的直接使用就行。map中key的名字是那个就在#{}使用那个,map如何封装就不用了我说了吧。
复制代码四、List封装in:
public ListgetXXXBeanList(List list);
foreach 最后的效果是select 字段… from XXX where id in (‘1’,‘2’,‘3’,‘4’)
复制代码五、多参数传递之注解方式示:
例子:
public AddrInfo getAddrInfo(@Param("corpId")int corpId, @Param("addrId")int addrId);
xml配置这样写:
以前在语句中要带parameterType的,现在可以不要这样写。
复制代码六、selectList()只能传递一个参数,但实际所需参数既要包含String类型,又要包含List类型时的处理方法:
将参数放入Map,再取出Map中的List遍历。如下:
Listlist_3 = new ArrayList ();Map map2 = new HashMap ();list.add("1");list.add("2");map2.put("list", list); //网址idmap2.put("siteTag", "0");//网址类型
public ListgetSysInfo(Map map2) { return getSqlSession().selectList("sysweb.getSysInfo", map2);}
问题:
假设a方法中传入一个带查询参数x,而子查询里也要这个参数 如何在子查询b中带入这个参数一般一对多查询方式:
/** * 按User表中platform查询User */@Select("select * from user where pid = #{id}")ListfindUsers(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 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") ) ) ListfindCartById(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 findGoodsBySalerId(Integer salerId,Integer consumerId);
column = "{salerId = id,consumerId = consumerId}"
,表示把id列和consumerId列取出salerId,consumerId
列使用consumerId 表示(类似别名,对应子查询参数,然后以这两个参数进行子查询在使用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}
问题解决。
转载地址:http://uqlbi.baihongyu.com/