Mybatis传多个参数(三种解决方案)

Stella981
• 阅读 787

Mybatis分页插件 - PageHelpe http://git.oschina.net/free/Mybatis_PageHelper

极其方便的使用Mybatis单表的增删改查 http://git.oschina.net/free/Mapper

Mybatis示例 http://blog.csdn.net/column/details/mybatis-sample.html

MyBatis官方文档 http://mybatis.github.io/mybatis-3/zh/dynamic-sql.html

##第一种方案

DAO层的函数方法

public User selectUser(String name,String area);

对应的Mapper.xml

<select id="selectUser" resultMap="BaseResultMap">
    select  *  from user_user_t   where user_name = #{0} and user_area=#{1}
</select>

其中,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。

##第二种方案 此方法采用Map传多参数.

Dao层的函数方法

public User selectUser(Map paramMap);

对应的Mapper.xml

<select id="selectUser" resultMap="BaseResultMap">
   select * from user_user_t where user_name = #{userName,jdbcType=VARCHAR} and user_area=#{userArea,jdbcType=VARCHAR}
</select>

Service层调用

private User xxxSelectUser(){
    Map paramMap=new hashMap();
    paramMap.put(“userName”,”对应具体的参数值”);
    paramMap.put(“userArea”,”对应具体的参数值”);
    User user=xxx. selectUser(paramMap);
}

个人认为此方法不够直观,见到接口方法不能直接的知道要传的参数是什么。

##第三种方案

Dao层的函数方法

public User selectUser(@param(“userName”)String name,@param(“userArea”)String area);

对应的Mapper.xml

<select id="selectUser" resultMap="BaseResultMap">
   select * from user_user_t  where user_name = #{userName,jdbcType=VARCHAR} and user_area=#{userArea,jdbcType=VARCHAR}
</select> 

个人觉得这种方法比较好,能让开发者看到dao层方法就知道该传什么样的参数,比较直观,个人推荐用此种方案。

##mybatis if标签判断的问题

细节可以参考XML代码:

<?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="com.lypaydb.mapper.Order_DayMapper">
    <resultMap type="com.lypaydb.pojo.Order_Day" id="odMap">
      <id property="id" column="id" />
      <result property="date" column="date" />
      <result property="total" column="total" />
      <result property="aisle" column="aisle" />
      <result property="operators" column="operators" />
      <result property="channelid" column="channelid" />
      <result property="appid" column="appid" />
      <result property="paycnt" column="paycnt" />
    </resultMap>
   
  <!-- /*sql -->
  <select id="findod" parameterType="java.util.Map" resultMap="odMap">
      select * from order_day where 1 = 1 
      <if test="${start} != null and ${start != ''}">
        and   date >= #{start} 
      </if>
      <if test="${end} != null and ${end} != ''">
        and #{end} > date  
      </if>
      <if test="appid != null and appid != ''">
        and  appid=${appid}
      </if>
      <if test="operators != null and operators != ''">
        and operators=${operators}  
      </if>
      limit ${Page.startPos},${Page.pageSize};
  </select>
   
  <select id="getAllCount" parameterType="java.util.Map" resultType="java.lang.Integer">
     select count(*)  from order_day where 1=1 
      <if test="${start} != null and ${start != ''}">
        and   date >= #{start} 
      </if>
      <if test="${end} != null and ${end} != ''">
        and #{end} > date  
      </if>
      <if test="appid != null and appid != ''">
        and  appid=${appid}
      </if>
      <if test="operators != null and operators != ''">
        and operators=${operators}  
      </if>
  </select>
  <!-- sql*/ -->
</mapper>

这里是正确的写法:POJO

<select id="findod" parameterType="map" resultMap="odMap">
    select * from order_day where 1 = 1 
    <if test="start != null and start != ''">
    and   date >= #{start} 
    </if>
    <if test="end != null and end != ''">
    and #{end} > date  
    </if>
    <if test="appid != null and appid != ''">
    and  appid=${appid}
    </if>
    <if test="operators != null and operators != ''">
    and operators=${operators}  
    </if>
    limit ${Page.startPos},${Page.pageSize};
</select>

MyBatis,数据库映射这一块。 and #{end} > date 参数是你方法里面传过来参数的实体解析,或者键值对的解析。parameterType是参数类型。可以是map,也可以是你的实体类(完整的包名)

##foreach的使用

<insert id="insertUserList">
  INSERT INTO user(username,password)
  VALUES
  <foreach collection="userList" item="user" separator=",">
    (#{user.username},#{user.password})
  </foreach>
</insert>

对应的接口:

int insertUserList(@Param("userList")List<User> list);
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
MyBatis学习总结(17)——Mybatis分页插件PageHelper
如果你也在用Mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件。分页插件支持任何复杂的单表、多表分页,部分特殊情况请看重要提示(http://git.oschina.net/free/Mybatis_PageHelper/blob/master/wikis/Important.markdown)。想要使用分页插件?请看如何使用分页
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
Oracle一张表中实现对一个字段不同值和总值的统计(多个count)
需求:统计WAIT\_ORDER表中的工单总数、未处理工单总数、已完成工单总数、未完成工单总数。表结构:为了举例子方便,WAIT\_ORDER表只有两个字段,分别是ID、STATUS,其中STATUS为工单的状态。1表示未处理,2表示已完成,3表示未完成总数。 SQL:  1.SELECT   2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这