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

相关文章
|
28天前
|
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标签的用法
|
28天前
|
SQL XML Java
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
1月前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
378 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
12天前
|
SQL 分布式计算 Java
Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作
Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作
27 3
|
13天前
|
SQL Java 数据库连接
Mybatis中传入不同类型的值处理方案
这篇文章讲述了在Mybatis中如何处理传入不同类型参数的情况,包括单个值、列表及Map等,并提供了相应的XML映射和Java代码示例。
51 0
|
1月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
39 1
|
8天前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
33 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
8天前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
21 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
15天前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
132 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
8天前
|
SQL Java 数据库连接
mybatis使用二:springboot 整合 mybatis,创建开发环境
这篇文章介绍了如何在SpringBoot项目中整合Mybatis和MybatisGenerator,包括添加依赖、配置数据源、修改启动主类、编写Java代码,以及使用Postman进行接口测试。
10 0
mybatis使用二:springboot 整合 mybatis,创建开发环境