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 代码

相关文章
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
SQL Java 数据库连接
MyBatis动态SQL字符串空值判断,这个细节99%的程序员都踩过坑!
本文深入探讨了MyBatis动态SQL中字符串参数判空的常见问题。通过具体案例分析,对比了`name != null and name != &#39;&#39;`与`name != null and name != &#39; &#39;`两种写法的差异,指出后者可能引发逻辑混乱。为避免此类问题,建议在后端对参数进行预处理(如trim去空格),简化MyBatis判断逻辑,提升代码健壮性与可维护性。细节决定成败,严谨处理参数判空是写出高质量代码的关键。
1632 0
|
9月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
510 18
|
10月前
|
SQL XML Java
MyBatis Mapper中使用limit参数的查询问题
总结而言,MyBatis中使用 `limit`参数的查询可以高度定制并且灵活,基于方法签名和XML映射文件的组合来达成多样化的查询需求。通过参数化查询和动态SQL,MyBatis可以有效地处理各种复杂情境下的数据库操作,并且将SQL语句的维护与业务代码的编写相分离,提升代码的可维护性和可阅读性。
791 13
|
9月前
|
SQL Java 数据库连接
SSM相关问题-1--#{}和${}有什么区别吗?--Mybatis都有哪些动态sql?能简述一下动 态sql的执行原理吗?--Spring支持的几种bean的作用域 Scope
在MyBatis中,`#{}`是预处理占位符,可防止SQL注入,适用于大多数参数传递场景;而`${}`是直接字符串替换,不安全,仅用于动态表名、列名等特殊场景。二者在安全性、性能及使用场景上有显著区别。
357 0
|
9月前
|
SQL Java 数据库连接
MyBatis的配置文件中定义类型别名(type aliases)的技巧。
类型别名提供了一种便捷的方式来引用复杂的全限定类名。通过使用 `<package>`标签进行自动扫描或使用 `<typeAlias>`标签手动指定,可以在整个MyBatis配置中提高清晰度和维护性。无论是简化mapper文件中的配置,还是提高整体的配置可读性,类型别名都是一个非常有用的配置工具。
367 0
|
12月前
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
1096 5
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
关系型数据库 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)")
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
842 13