• Java框架 MyBatis获取参数值的两种方式


    MyBatis获取参数值的两种方式:${}和#{}
    ${}的本质就是字符串拼接,#{}的本质就是占位符赋值
            ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;
            #{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号

    1、单个字面量类型的参数

    mapper接口中的方法参数为单个的字面量类型
    此时可以使用${}#{}以任意的名称获取参数的值,注意${}需要手动加单引号
    代码示例:
    UserMapper 接口:
    1. /**
    2. * MyBatis 获取参数的两种方式:${} 和 #{}
    3. * #{} 的本质是占位符 , ${}的本质是字符串拼接
    4. * 1.若 mapper 接口方法参数为单个字面量类型
    5. * 此时可以通过 #{} 和 ${} 以任意内容获取参数值,一定要注意 ${} 的单引号问题
    6. */
    7. public interface UserMapper {
    8. /**
    9. * 根据用户名查询用户信息
    10. * @param username 需要查询的用户名参数
    11. * @return 获取查询到的用户对象
    12. */
    13. User getUserByUsername(String username);
    14. }

    UserMapper.xml 配置文件:

    1. <mapper namespace="com.chenyixin.ssm.mapper.UserMapper">
    2. <select id="getUserByUsername" resultType="user">
    3. select * from t_user where username = '${username}'
    4. select>
    5. mapper>

    测试类:

    1. public class UserMapperTest {
    2. SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    3. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    4. @Test
    5. public void getUserByUsername() {
    6. User user = mapper.getUserByUsername("李四");
    7. System.out.println(user);
    8. }
    9. }

    结果:

     

    2、多个字面量类型的参数

    若mapper接口中的方法参数为多个字面量类型
            此时 MyBatis 会将参数放在 map 集合汇总,以两种方式存储数据
                    a> 以 arg0,arg1 ... 为键,以参数值为值
                    b> 以 param1,param2 ... 为键,以参数值为值
            因此,只需要通过 #{} 和 ${} 访问 map 集合的键,就可以获取相对应的值
             一定要注意 ${} 单引号问题

    代码示例:

    UserMapper 接口:

    1. /**
    2. * 用户登录检验
    3. * @param username 用户名
    4. * @param password 密码
    5. * @return 返回登录的用户
    6. */
    7. User checkLogin(String username, String password);

    UserMapper.xml 配置文件:

    1. <select id="checkLogin" resultType="user">
    2. select * from t_user where username = '${param1}' and password = '${param2}'
    3. select>

    测试;

    1. @Test
    2. public void checkLogin() {
    3. User user = mapper.checkLogin("李四","123");
    4. System.out.println(user);
    5. }

    结果:

    3、map集合类型的参数

            若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在 map中
            只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号

    代码示例:

    UserMapper 接口:

    1. /**
    2. * 验证登录(通过 map 集合)
    3. * @param map 参数
    4. * @return 返回登录的用户
    5. */
    6. User checkLoginByMap(Map map);

     UserMapper.xml 配置文件:

    1. <select id="checkLoginByMap" resultType="user">
    2. select *
    3. from t_user
    4. where username = #{username}
    5. and password = #{password}
    6. select>

    测试:

    1. @Test
    2. public void checkLoginByMap() {
    3. Map map = new HashMap<>();
    4. map.put("username", "李四");
    5. map.put("password", "123");
    6. User user = mapper.checkLoginByMap(map);
    7. System.out.println(user);
    8. // User{id=3, username='李四', password='123', age=19, gender='男', email='123456@qq.com'}
    9. }

    4、实体类类型的参数

    如果 mapper 接口方法的参数为实体类类型

            只需要通过 #{} 和 ${} 访问实体类中的属性名,既可以获取相对应的属性值(这里的属性指的是get方法的属性)

            一定要注意 ${} 的单引号问题

    代码示例:

    UserMapper 接口:

    1. /**
    2. * 添加用户信息
    3. * @param user 要添加的用户信息
    4. * @return 返回影响数据库行数
    5. */
    6. int insertUser(User user);

     UserMapper.xml 配置文件:

    1. <insert id="insertUser">
    2. insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email})
    3. insert>

    测试:

    1. @Test
    2. public void insertUser() {
    3. User user = new User(null, "王五", "321", 23, "女", "321@qq.com");
    4. int i = mapper.insertUser(user);
    5. System.out.println(i); // 1
    6. }

    结果:

    5、使用@Param标识参数

    可以在 mapper 接口方法的参数上设置@Param 注解

            此时 MyBatis 汇集那个这些参数放在 map,以两种方式进行存储

                    a> 以 @Param 注解的 value 属性值为键,一参数为值

                    b> 以 param1,param2 ... 为键,以参数为值

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

            一定要注意 ${} 单引号问题

    代码示例:

    UserMapper 接口:

    1. /**
    2. * 验证登录 (通过 @Param 注解方式)
    3. * @param username 用户名
    4. * @param password 密码
    5. * @return 返回登录的用户信息,若登录失败,则返回 null
    6. */
    7. User checkLoginParam(@Param("username") String username, @Param("password") String password);

     UserMapper.xml 配置文件:

    1. <select id="checkLoginParam" resultType="user">
    2. select *
    3. from t_user
    4. where username = #{username}
    5. and password = #{password}
    6. select>

    测试:

    1. @Test
    2. public void checkLoginParam() {
    3. User user = mapper.checkLoginParam("王五", "321");
    4. System.out.println(user);
    5. // User{id=13, username='王五', password='321', age=23, gender='女', email='321@qq.com'}
    6. }

     

    6、建议

    以后都使用 实体类类型的参数 与  @Param标识参数(包括单个字面量类型的参数)

  • 相关阅读:
    Python asyncore模块-客户端
    Mac(含M1) 使用 brew 安装nvm
    全网最详细的自动化测试(Jenkins 篇)
    ts重点学习144-描述文件声明
    修正版 | 面对千万级、亿级流量怎么处理?
    DDL相关操作
    spring--事务
    C++学习——vector类的使用
    【C++心愿便利店】No.12---C++之探索string底层实现
    Python基础语法入门篇(二)
  • 原文地址:https://blog.csdn.net/weixin_65637841/article/details/126300178