mybatis参数传递问题

问题:

Mybatis 参数传递说明
     查询: age < 18  or age > 100
     是否可以封装为对象??  不可以!!

规则:

    1.Mybatis 原生只支持单值传参
    2.如果是多值,则想办法封装为单值
       方法:  1.封装为对象
                 2.封装为Map集合<K,V> ={minAge: 18,maxAge:100}
      补充说明: 现在mybatis版本 如果多值传参 则自动封装为Map集合
      Key:参数名称  value: 参数的值

方式:

1、在dao层UserMapper中定义方法

2、在.xml文件中写执行的的sql语句

        小于号  <    需要进行转义 为   &lt(LT);

3、在test中测试方法

dao层(mapper)UserMapper接口

package com.jt.mapper;

import com.jt.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
//@Mapper //将该接口交给Spring管理,spring创建对象
public interface UserMapper {

    //查询所有的user用户
    List<User> findAll();

    /**
     *  规则:
     *      1.Mybatis 原生只支持单值传参
     *      2.如果是多值,则想办法封装为单值
     *          方法:  1.封装为对象
     *                2.封装为Map集合<K,V> ={minAge: 18,maxAge:100}
     *  补充说明: 现在mybatis版本 如果多值传参 则自动封装为Map集合
     *           Key:参数名称  value: 参数的值
     */
    //List<User> findWhere(String name,Integer age,String sex);
    List<User> findWhere(User user);
    List<User> findAge(int minAge,int maxAge);

    List<User> findName(String name);
    //List<User> findAge(@Param("minAge") int minAge,@Param("maxAge") int maxAge);
}

UserMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jt.mapper.UserMapper">

    <!--Oracle中 ;号必定报错  不要加;号
        resultType:
            1.如果有别名包则自动拼接  com.jt.pojo.User
            2.如果根据别名找不到,则使用默认规则
     -->
    <select id="findAll" resultType="User">
        select * from demo_user
    </select>

    <!--驼峰规则说明:
        Mybatis 功能1: 可以实现结果集与实体对象的映射!!!
        对象与表 一一对应,
        对象中的属性与表中的字段 一一对应.

        User(userId,userName)
        user表(user_id,user_name)
        resultType: 不能映射.
        resultMap:  自己手动编辑.
        简化上述的操作: 引入驼峰规则.

        思考:开启驼峰规则如下是否可以映射???
             User(user_id,user_name)
             user表(user_id,user_name)
             字段user_id~~~userid~~~userId~~~~
             setUserId(..)方法
        规则: 如果开启驼峰规则,必须按照要求编辑否则报错
    -->


    <!--
        查询: sex="男" age > 18岁
        取值符号: #号  有预编译效果 能用#号不用$
                     自动的为参数添加一对 引号""
        #号用法: #{属性/key}
    -->
    <select id="findWhere" resultType="User">
        select * from demo_user
        where
            sex=#{sex}
        and
            age > #{age}
    </select>

    <!--
         age < 18  or age > 100
    -->
    <select id="findAge" resultType="User">
        select * from demo_user
        where
            age &lt; #{minAge}
        or
            age > #{maxAge}
    </select>

    <!--说明: 如果只有一个参数(不是对象/map),则名称可以任意
        Mybatis认为只有一个参数,不会有错.
    -->
    <select id="findName" resultType="User"><!--这个aaa可以随便取值--->
        select * from demo_user where name = #{aaa}
    </select>
    
</mapper>

测试类TestMybatis.java

package com.jt.test;

import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
public class TestMybatis {

    @Autowired
    private UserMapper userMapper; //必须有对象!!!!

    @Test
    public void test01(){

        List<User> userList = userMapper.findAll();
        System.out.println(userList);
    }


    /**
     * Mybatis 参数传递说明
     * 查询: sex="男" age > 18岁
     */
    @Test
    public void testMybatis(){
        //参数使用对象进行封装
        User user = new User();
        user.setSex("男").setAge(18);
        List<User> userList = userMapper.findWhere(user);
        System.out.println(userList);
    }

    /**
     * Mybatis 参数传递说明
     * 查询: age < 18  or age > 100
     * 思考: 1.是否可以封装为对象??  不可以!!
     *
     */
    @Test
    public void testMybatis2(){
        int minAge = 18;
        int maxAge = 100;
        List<User> userList = userMapper.findAge(minAge,maxAge);
        System.out.println(userList);
    }

    /**
     * Mybatis 参数传递说明
     * 查询name="王昭君"
     */
    @Test
    public void testMybatis3(){
        String name = "王昭君";
        List<User> userList = userMapper.findName(name);
        System.out.println(userList);
    }


}

补充:@Param注解

官方解析文档:

1、如果你的映射方法的形参有多个,这个注解使用在映射方法的参数上就能为它们取自定义名字。
2、若不给出自定义名字,多参数(不包括 RowBounds 参数)则先以 "param" 作前缀,
3、再加上它们的参数位置作为参数别名。例如 #{param1}, #{param2},这个是默认值。
4、如果注解是 @Param("person"),那么参数就会被命名为 #{person}。

在不使用@Param注解的时候,函数的参数只能为一个,并且在查询语句取值时只能用#{},且其所属的类必须为Javabean,

而使用@Param注解则可以使用多个参数,在查询语句中使用时可以使用#{}或者${}

使用:

1、使用@Param后,接口中的参数顺序也可以打乱,只要id唯一即可

2、当只有一个参数的时候可以不使用此注解

@Mapper
public interface LoginMapper extends BaseMapper<User> {
 
    @Select("SELECT COUNT(1) FROM `user` WHERE name=#{username} AND PASSWORD=#{password} ")
    public int checkLogin(@Param("username") String username, @Param("password") String password);
}

相似的注解@RequestParam

前端提交的form表单数据的name属性 和方法中的参数名不一致时 ,springMVC就无法自动封装参数,所以需要@RequestParam(前端name属性名称)来指定前端提交的表单的name属性的名称
当前端的name属性和方法的参数名一致的时候,可以不使用此注解
主要作用在Controller层
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值