mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型

简介: 这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。

前言

  • 关于mybatis的dao接口和mapper的SQL编写,具有一定的规矩,但是动态性却很多,最近遇到了一个问题,就是这里的,但是也确实是因为自己的粗心,所以特来总结一番和学习一番。特此记录。也以便以后复习。
  • 在mybatis映射接口的配置中,有select,insert,update,delete等元素都提到了parameterType的用法,parameterType为输入参数,在配置的时候,配置相应的输入参数类型即可。parameterType有基本数据类型和复杂的数据类型配置。
  • 关于mybatis的使用可以看我的mybatis分类专栏。
  • 注意 @Param类不要导成 spring的注解

一、parameterType类型

1. MyBatis的传入参数parameterType类型分两种

  1. 基本数据类型:int、string、long、Date;
  2. 复杂数据类型:类(JavaBean、Integer等)和Map

2. 如何获取参数中的值:

  1. 基本数据类型:#{参数} 获取参数中的值
  2. 复杂数据类型:#{属性名} ,#{属性.属性名},map中则是#{key}

二、单个参数

1. 普通参数

使用 parameterType 属性绑定输入参数的类型,然后使用使用参数名称注入即可。

dao接口代码

public List<javabean> getXXBeanList(String id);

mapper SQL 代码

<select id="getXXXBeanList" parameterType="java.lang.String" resultType="XXBean">
  select tableName.* from tableName where tableName .id= #{id}  
</select>

2. 传入List

dao接口代码

public List<User> findUserListByIdList(List<Long> idList);

mapper SQL 代码

<select id="findUserListByIdList" parameterType="java.util.ArrayList" resultType="User">    
    select * from user user    
    <where>    
        user.ID in (    
          <foreach collection="list"  item="id" index="index" separator=",">   
             #{id}   
          </foreach>    
        )    
    </where>    
</select>

在使用foreach的时候最关键的也是最容易出错的就是collection属性。

该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

  1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
  2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
  3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可

3. 传入map

dao接口代码

public boolean exists(Map<String, Object> map);

mapper SQL 代码

<select id="exists" parameterType="java.util.HashMap" resultType="java.lang.Integer">    
        SELECT COUNT(*) FROM USER user    
        <where>    
            <if test="code != null">     
                and user.CODE = #{code}     
            </if>    
            <if test="id != null">     
                and user.ID = #{id}     
            </if>    
            <if test="idList !=null ">    
                and user.ID in (    
                   <foreach collection="idList" item="id" index="index" separator=",">   
                        #{id}   
                   </foreach>    
                )    
            </if>    
        </where>    
</select>

MAP中有list或array时,foreach中的collection必须是具体list或array的变量名。

比如这里MAP含有一个名为idList的list,所以MAP中用idList取值,这点和单独传list或array时不太一样。

4. 传入JAVA对象

这里传入的对象,在SQL中,使用使用对象中的属性名即可。

dao接口代码

public int findUserList(User user);

mapper SQL 代码

<select id="findUserList" parameterType="User" resultType="java.lang.Integer">    
        SELECT COUNT(*) FROM USER user    
        <where>    
            <if test="code != null">     
                and user.CODE = #{code}     
            </if>    
            <if test="id != null">     
                and user.ID = #{id}     
            </if>    
            <if test="idList !=null ">    
                and user.ID in (    
                    <foreach  collection="idList" item="id" index="index" separator=",">   
                         #{id}   
                    </foreach>    
                )    
            </if>    
        </where>    
</select>

JAVA对象中有list或array时,foreach中的collection必须是具体list或array的变量名。

比如这里User含有一个名为idList的list,所以User中用idList取值,这点和单独传list或array时不太一样。

三、注解@Param(推荐)

此注解用在 dao接口中。注解单一属性;这个类似于将参数重命名了一次

一定要注意,spring中也有 @Param注解,切勿导错类

1. 注解单一属性

相当于对 startDate 重命名为 startdate, 在SQL中使用 重命名后的即可。
下面的 jdbcType=VARCHAR也可不写。

dao接口代码

List<User> selectUserByTime(@Param(value="startdate")String startDate);

mapper SQL 代码

<select id="selectUserByTime" resultType="User" parameterType="java.lang.String">    
    select * from t_user   
    where  create_time >= to_date(#{startdate,jdbcType=VARCHAR},'YYYY-MM-DD')  
</select>

2. 注解javaBean

如果不加注解,在SQL中,则可直接使用属性名即可。
加了注解,就要使用 属性.属性名 的方式来获取Javabean中的值。
dao接口代码

List<User> selectUserByTime(@Param(value="dateVO")DateVO dateVO);

mapper SQL 代码

<select id="selectUserByTime" resultType="User" parameterType="DateVO">    
    select *  
    from t_user  
    where create_time >= to_date(#{dateVO.startDate,jdbcType=VARCHAR},'YYYY-MM-DD')   
          and create_time < to_date(#{dateVO.endDate,jdbcType=VARCHAR},'YYYY-MM-DD')   
 </select>

四、多参数

1. 多个普通类型参数

a. 方案1

dao接口代码

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

mapper SQL 代码

<select id="getXXXBeanList" resultType="XXBean">不需要写parameterType参数
  select t.* from tableName where id = #{0} and name = #{1}  
</select>

a. 方案1 注解方式(推荐)

dao接口代码

public List<XXXBean> getXXXBeanList(@Param("id")String id, @Param("code")String code);

mapper SQL 代码

<select id="getXXXBeanList" resultType="XXBean">
  select t.* from tableName where id = #{id} and name = #{code}  
</select>

2. javabean+普通类型参数

使用@Param注解进行标记。parameterTypeJavabean类型
dao接口代码

public List<XXXBean> getXXXBeanList(@Param("model") User user, @Param("start") int start, @Param("pageSize")int pageSize);

mapper SQL 代码

<select id="selectPhotoMian" parameterType="com.adt.service.xfadvice.vo.AdtPhotoMainVo" resultMap="BaseResultMap" >
    SELECT ID, CLASS_CODE,CLASS_NAME,TITLE,ORDERNO,CONTENT,FILE_NAME,FILE_OSS,OUT_URL,IS_CLICK,DATA_FLAG,OPERATOR_ID,OPERATOR_CODE,OPERATOR_NAME,OPERATOR_TIME,AUDITOR_ID,AUDITOR_CODE,AUDITOR_NAME,USE_FLAG
    FROM PHOTO_MAIN
    <where>
      <if test="model.classCode!=null">
        AND CLASS_CODE =#{model.classCode}
      </if>
      <if test="model.dataFlag!=null">
        AND DATA_FLAG =#{model.dataFlag}
      </if>
      <if test="model.useFlag!=null">
        AND USE_FLAG =#{model.useFlag}
      </if>
      <if test="model.useFlag==null">
        AND USE_FLAG=0
      </if>
    </where>
    ORDER BY ORDERNO
    LIMIT #{start},#{pageSize}
  </select>

五、总结

dao接口代码

mapper SQL 代码

相关文章
|
17天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
1月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
24天前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
SQL
处理动态SQL语句的参数
原文:处理动态SQL语句的参数 经常对SQL进行开发,写动态的SQL语句,是少之不了的,但是在使用动态语句中,常是因为有动态的参数的出现。参考下面代码示例:   正因为有了标记1的动态条件代码,而让SQL语句需要变成动态的SQL语句。
1369 0
|
3月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
5月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
133 13
|
5月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
5月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
69 6
|
5月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
456 1
|
5月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
373 3