MyBatis获取参数值的两种方式#{}和${}

 MyBatis获取参数值的两种方式#{}和${}

             MyBatis获取参数值的两种方式: ${}和#{}

                   ${}的本质就是字符串拼接,#{}的本质就是占位符赋值

      1. 单个字面量类型的参数:

                   若mapper接口中的方法参数为单个的字面量类型

                 此时可以使用${}和#{}以任意的名称获取参数的值,注意${}需要手动加单引号

      2. 多个字面量类型的参数:

                   若mapper接口中的方法参数为多个时

                  此时MyBatis会自动将这些参数放在一个map集合中,

                       ①以arg0,arg1...为键,以参数为值;

                       ②以param1,param2...为键,以参数为值;

             因此只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号。

      3. map集合类型的参数:

                         若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,

                           将这些数据放在map中只需要通过${}和#{}访问map集合的键就可以获取相对应的值,

                        注意${}需要手动加单引号。

      4. 实体类类型的参数:

                               若mapper接口中的方法参数为实体类对象时

                               此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,

                           注意${}需要手动加单引号。

      5. 使用@Param标识参数:

                            可以通过@Param注解标识mapper接口中的方法参数

                          此时,会将这些参数放在map集合中,

                               以@Param注解的value属性值为键,以参数为值;

                               以param1,param2...为键,以参数为值;

                  只需要通过${}和#{}访问map集合的键就可以获取相对应的值,

                      注意${}需要手动加单引号。

package com.atiguigu.mabatis.mapper;
//接口

import com.atiguigu.mabatis.pojo.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/*
通过功能划分
*/
public interface ParameterMapper
{
   /**
    * 1
    * 根据用户名查询用户信息(根据用户名查询的,那方法中必定会有一个参数)
    * @return
    */
   User getUserByUsername(String username);
   /**
    * 2
    * 验证登录
    */
   User checkLogin(String username,String password);

   /**
    * 3
    * 验证登录(参数为map)
    * @return
    */
   User checkLoginByMap(Map<String,Object> map);  //String类型,值是Object类型

   /**
    * 4
    * 添加用户信息
    * @return
    */
   int insertUser(User user);

   /**
    * 5
    * 验证登录(使用@Param注解)
    * 当我们在mapper接口方法的参数上加上@Param注解之后,mybatis就会将参数放在map集合里面,
    * 以@Param注解的值为键,参数为值,当然还会以自己的方式来设置这个键并且存储参数
    * @return
    */
   User checkLoginByParam(@Param("username") String username,@Param("password") String password);

   /*
   查询所有的员工信息
    */
   List<User> getAlluser();
}
//映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
       PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
       "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atiguigu.mabatis.mapper.ParameterMapper">

<!--     List<User> getAlluser();-->
   <select id="getAlluser" resultType="User">
      select * from t_user
   </select>

<!--User getUserByUsername(String username);-->
   <select id="getUserByUsername" resultType="User">
<!-- select * from t_user where username=#{username}-->
      select * from t_user where username='${username}'
   </select>
   
<!--User checkLogin(String username,String password);-->
   <select id="checkLogin" resultType="User">
<!--   select * from t_user where username=#{arg0} and password=#{arg1}-->
      select * from t_user where username='${arg0}' and password='${arg1}'
   </select>
   
   <!--   User checkLoginByMap(Map<String,Object> map);-->
   <select id="checkLoginByMap" resultType="User">
      select * from t_user where username=#{username} and password=#{password}
   </select>
   
<!--int insertUser(User user);-->
<!-- 实体类对象中是属性和属性值的对应关系,直接通过属性名来获取属性值就可以   -->
<!--
   在一个实体类中什么叫属性:属性并不是我们的成员变量,当然目前来说是成员变量也没有问题,
                        然后因为我们get set方法他都是根据成员变量创建出来的。
     但是真正的属性是什么:就是去找到县对应的get和set方法,把get set方法的方法名中的get set去调,
                       把剩余首字母变为小写的结果就是我们当前的属性名。
                   但是以后有一种情况,是没有相对应的成员变量,但是却又相对应的get set方法,
                         那就不能说这是没有属性,我们最终访问的属性到底看的是谁,其实是看的
                         是他的get set方法,如果取值找get 如果赋值找set
 -->
   <insert id="insertUser">
      insert into t_user values(5,#{username},#{password},#{age},#{sex},#{email})
   </insert>
   
<!--User checkLoginByParam(@Param("username") String username,@Param("password") String password);-->
   <select id="checkLoginByParam" resultType="User">
      select * from t_user where username=#{username} and password=#{password}
   </select>
</mapper>

package com.atguigu.mybatis.test;
//测试类
import com.atiguigu.mabatis.mapper.ParameterMapper;
import com.atiguigu.mabatis.pojo.User;
import com.atiguigu.mabatis.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ParameterMapperTest
{
   /**
    * MyBatis 获取参数值的两种方式:${}和#{}
    * ${}本质字符串拼接
    * #{}占位符赋值
    * MyBatis获取参数值的各种情况:
    * 1.mapper接口方法的参数为单个的字面量类型
    * 可以通过${}和#{}以任意的名称获取参数值,但是需要注意${}的单引号问题
    * 2.mapper接口方法的参数为多个时
    * 此时MyBatis会将这些参数放入在一个map集合中,以两种方式进行存储
    * ①以arg0,arg1...为键,以参数位置
    * ②以param1,param2....为键,以参数为值
    * 因此只需要通过#{}和${}以键的方式访问值即可,但是需要注意${}的单引号问题
    * 3.若mapper接口方法的参数有多个时,可以手动将这些参数放在一个map中存储
    * 只需要通过#{}和${}以键(这个键是我们自己设置的)的方式访问值即可,但是需要注意${}的单引号问题
    * 4.map接口方法的参数是一个实体类类型的参数
    * 只需要通过#{}和${}以属性的方式访问属性值即可,但是需要注意${}的单引号问题(用的最多,添加 删除 修改)
    * 5.使用@Param命名参数
    * 此时MyBatis会将这些参数放入在一个map集合中,以两种方式进行存储
    * 以@Param注解的值为键,以参数为值
    * 以param1,param2....为键,以参数为值
    * 因此只需要通过#{}和${}以键的方式访问值即可,但是需要注意${}的单引号问题
    * 第二种情况可以用@Param来解决,第4中是实体类类型的参数直接通过参数名属性名,
    * 整合两种情况,第一种情况实体类对象这种,第二种全部都用@Param
    */
   @Test
   public void testGetUserByUsername(){
       SqlSession sqlSession= SqlSessionUtils.getSqlSession(); //获取
       ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
       User admin = mapper.getUserByUsername("adimi");
       System.out.println(admin);
  }
   @Test
   public void testCheckLogin(){
       SqlSession sqlSession= SqlSessionUtils.getSqlSession(); //获取
       ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
       User admin = mapper.checkLogin("admin","123456");
       System.out.println(admin);
  }
   @Test
   public void testCheckLoginByMap(){
       SqlSession sqlSession= SqlSessionUtils.getSqlSession(); //获取
       ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
       Map<String,Object> map=new HashMap<>();//集合创建
       map.put("username","admin");
       map.put("password",123456);
       User admin = mapper.checkLoginByMap(map);//传的是map集合所以先把map集合创建出来
       System.out.println(admin);
  }
   @Test
   public void testinsertUser(){
       SqlSession sqlSession= SqlSessionUtils.getSqlSession(); //获取
       ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
       int result = mapper.insertUser(new User(5, "李四", "123", 23, "男", "123@qq.com"));
       System.out.println(result);
  }
   @Test
   public void testCheckLoginParam(){
       SqlSession sqlSession= SqlSessionUtils.getSqlSession(); //获取
       ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
       User admin = mapper.checkLoginByParam("admin","123456");
       System.out.println(admin);
  }
   
   @Test
   public void testGetAlluser(){
       SqlSession sqlSession= SqlSessionUtils.getSqlSession(); //获取
       ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
       List<User> alluser = mapper.getAlluser();
       alluser.forEach(user -> System.out.println(user));
  }
}
 
posted @ 2022-10-19 23:07  zjw_rp  阅读(382)  评论(0)    收藏  举报