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

相关文章
|
24天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
3月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
3月前
|
SQL XML Java
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
2月前
|
SQL 存储 关系型数据库
SQL判断CHAR类型字段不为空的方法与技巧
在SQL查询中,判断一个CHAR类型字段是否不为空是一个常见的需求
|
3月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
53 1
|
4月前
|
SQL 存储 数据库
SQL Server 中的备份类型详解
【8月更文挑战第31天】
75 0
|
4月前
|
SQL 存储 数据库
|
4月前
|
SQL 关系型数据库 数据处理
|
4月前
|
SQL 存储 数据库
SQL中的不同关系类型:深入解析
【8月更文挑战第31天】
75 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)")