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

相关文章
|
8月前
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
4月前
|
SQL XML Java
MyBatis Mapper中使用limit参数的查询问题
总结而言,MyBatis中使用 `limit`参数的查询可以高度定制并且灵活,基于方法签名和XML映射文件的组合来达成多样化的查询需求。通过参数化查询和动态SQL,MyBatis可以有效地处理各种复杂情境下的数据库操作,并且将SQL语句的维护与业务代码的编写相分离,提升代码的可维护性和可阅读性。
400 13
|
8月前
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
5月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
851 1
Spring boot 使用mybatis generator 自动生成代码插件
|
8月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
633 0
|
10月前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
386 2
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
552 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
455 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
2841 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)