详解mybatis #{}和${}的区别、传参、基本语法

{}和${}是MyBatis中用于参数传递的两种方式,它们虽然很相似,但实际上存在着很大的差异。下面我将详细介绍#{}和${}的区别,以及相关的传参方式和基本语法。

#{}和${}的区别

语法

{}中的内容会被预编译处理,最终生成的SQL语句中会使用占位符 "?", 占位符用于接收#{}中的值,例如:select * from user where id = ? 。这样使用的好处就是预处理语句会对SQL语句进行装载,提高执行效率,从而避免SQL注入。

${}中的内容不会被预编译处理,会直接将变量替换到SQL语句中,例如:select * from user where name = '${name}' 。这样使用的坏处就是会导致SQL注入,因为${}中的内容可以被拼接,从而对数据库进行攻击。

参数安全

以#{}代表的参数都是经过预编译处理的,能防止SQL注入,${}表示的参数拼接进SQL中,容易受到SQL注入攻击。因此,在传递参数时应该优先使用#{},杜绝SQL注入攻击。

表示

{}表示一个单一的JDBC预编译参数标记符号,mybatis会将#{}替换成?号。即使在输入参数是字符串类型时,mybatis也会对其进行自动转义和处理。因此#{}可以防止SQL注入攻击。

${}表示纯碎的字符串替换,Mybatis在将SQL语句传递给JDBC之前不会修改或替换它。在使用${}时需要注意SQL注入问题,比如拼接在一起的字符串。

传参方式

MyBatis支持多种参数传递方式,其中包括:

  • POJO(Java类)参数
// User类
public class User {
    // 对应user表中的字段
    private Integer id;
    private String name;
    private Integer age;

    // getter和setter方法
}

// Mapper接口
public interface UserMapper {

    /**
     * 根据用户ID查询用户信息
     * @param id 用户ID
     * @return User对象
     */
    public User selectUserById(Integer id);
}

// Mapper.xml
<select id="selectUserById" parameterType="int" resultMap="userMap">
    select * from user where id = #{id}
</select>
  • Map参数
// Mapper接口
public interface UserMapper {

    /**
     * 根据用户ID查询用户信息
     * @param paramMap 参数Map
     * @return User对象
     */
    public User selectUserById(Map<String, Object> paramMap);
}

// Mapper.xml
<select id="selectUserById" parameterType="map" resultMap="userMap">
    select * from user where id = #{id}
</select>
  • @Param注解参数
// Mapper接口
public interface UserMapper {

    /**
     * 根据用户ID查询用户信息
     * @param id 用户ID
     * @param name 用户名
     * @return User对象
     */
    public User selectUserById(@Param("id") Integer id, @Param("name") String name);
}

// Mapper.xml
<select id="selectUserById" parameterType="map" resultMap="userMap">
   select * from user where id = #{id} and name like '%${name}%'
</select>

基本语法

#{}参数

  • 在条件语句中使用#{}参数
// Mapper.xml
<select id="selectUserByNameAndAge" parameterType="User" resultMap="userMap">
   select * from user where name = #{name} and age = #{age}
</select>
  • 在foreach循环中使用#{}参数
// Mapper接口
public interface UserMapper {

    /**
     * 根据用户ID列表查询用户信息
     * @param idList 用户ID列表
     * @return 用户列表
     */
    public List<User> selectUserByIdList(List<Integer> idList);
}    

// Mapper.xml
<select id="selectUserByIdList" parameterType="list" resultMap="userMap">
    select * from user where id in
    <foreach item="id" index="index" collection="list" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

${}参数

  • 在条件语句中使用${}参数
// Mapper.xml
<select id="selectUserByName" parameterType="User" resultMap="userMap">
   select * from user where name = '${name}'
</select>
  • 在foreach循环中使用${}参数
// Mapper接口
public interface UserMapper {

    /**
     * 根据用户ID列表查询用户信息
     * @param idList 用户ID列表
     * @return 用户列表
     */
    public List<User> selectUserByIdList(List<Integer> idList);
}    

// Mapper.xml
<select id="selectUserByIdList" parameterType="list" resultMap="userMap">
    select * from user where id in 
    <foreach item="id" index="index" collection="list" open="(" separator="," close=")">
        ${id}
    </foreach>
</select>

示例

#{}示例

  • Mapper接口
public interface UserMapper {

    /**
     * 根据用户ID查询用户信息
     * @param id 用户ID
     * @return User对象
     */
    public User selectUserById(Integer id);
}
  • Mapper.xml
<select id="selectUserById" parameterType="int" resultMap="userMap">
    select * from user where id = #{id}
</select>
  • 调用方式
// 获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();

// 获取Mapper对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 调用selectUserById方法
User user = userMapper.selectUserById(1);

${}示例

  • Mapper接口
public interface UserMapper {

    /**
     * 根据用户名查询用户信息
     * @param name 用户名
     * @return User对象
     */
    public User selectUserByName(String name);
}
  • Mapper.xml
<select id="selectUserByName" parameterType="User" resultMap="userMap">
   select * from user where name = '${name}'
</select>
  • 调用方式
// 获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();

// 获取Mapper对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 调用selectUserByName方法
User user = userMapper.selectUserByName("张三");

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解mybatis #{}和${}的区别、传参、基本语法 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • Qt读写XML文件的方法详解(含源码+注释)

    首先我们来介绍一下Qt读写XML文件的基本概念。XML(Extensible Markup Language)是一种标记语言,作为一种通用性的标记语言,被广泛应用于存储和传输数据。Qt中提供了用于读写XML文件的模块QXmlStreamReader和QXmlStreamWriter。 一、QXmlStreamReader介绍 QXmlStreamReader…

    html 2023年5月30日
    00
  • JavaScript的React框架中的JSX语法学习入门教程

    首先,要了解JSX是什么。JSX是JavaScript的一种语法扩展,可以在JavaScript中编写类似HTML的代码。它是React用来描述UI的语法。 学习JSX,需要掌握以下知识点: 语法格式 JSX的语法格式与HTML类似,但它并不是HTML。最外层需要一个容器元素(可以是div等),标签必须闭合,属性名采用驼峰式命名,属性值既可以是字符串也可以是…

    html 2023年5月30日
    00
  • MSSQL转MYSQL,gb2312转utf-8无乱码解决方法

    下面是“MSSQL转MYSQL,gb2312转utf-8无乱码解决方法”的完整攻略: MSSQL转MYSQL 第一步,将MSSQL数据库的数据导出为CSV文件,可以使用SQL Server Management Studio的导出向导完成。 第二步,使用Navicat等工具将CSV文件导入MYSQL数据库中。在导入数据时,注意要选择正确的字符集,如utf-8…

    html 2023年5月31日
    00
  • 小米 MIUI 音乐播放器 歌名 显示乱码的解决办法

    “小米 MIUI 音乐播放器 歌名 显示乱码的解决办法”攻略,可以按照以下步骤进行解决: 问题描述 在小米 MIUI 音乐播放器中,有时候会遇到乱码的问题,这种情况通常出现在歌曲名称、歌手名称等文本内容中。这使得用户无法正确识别歌曲信息,影响了用户体验。 解决办法 1. 修改音乐文件的元数据 这种乱码出现的原因很可能是音乐文件的元数据缺失或者无法正确解析导致…

    html 2023年5月31日
    00
  • php中文乱码问题的终极解决方案汇总

    Title: PHP中文乱码问题的终极解决方案汇总 1. 问题概述 在PHP开发中,由于字符编码的原因,中文经常会出现乱码的问题,给程序的运行和开发带来了很大的困扰。本文将梳理并总结解决PHP中文乱码问题的终极方案。 2. 解决方案 解决PHP中文乱码问题通常有如下几个方面: 2.1 修改PHP配置文件 在php.ini配置文件中,设置字节序(byte_or…

    html 2023年5月31日
    00
  • 抖音视频带货怎么做入门教学

    以下是“抖音视频带货怎么做入门教学”的完整攻略: 抖音视频带货怎么做入门教学? 抖音视频带货是一种新型的电商模式,可以让商家通过在抖音上发布商品视频,吸引消费者的关注和购买。以下是一些操作步骤和攻略。 步骤1:了解抖音视频带货的基本概念 在开始抖音视频带货之前,需要了解一些基本概念,包括: 抖音:一款流行的短视频应用程序。 视频带货:一种电商模式,通过在视频…

    html 2023年5月18日
    00
  • WAP建站WML语言语法基础教程

    WAP建站WML语言语法基础教程 介绍 WAP建站,需要使用 WML(Wireless Markup Language)进行页面制作。本教程将介绍 WAP 建站的基础知识和 WML 语言语法基础。 WAP基础知识 WAP全称为Wireless Application Protocol,中文名为“无线应用协议”,是硬件、软件和服务的集成体,它为手机等移动设备提…

    html 2023年5月30日
    00
  • mBlock5慧编程怎么下载安装? 慧编程安装图文教程

    以下是“mBlock5慧编程怎么下载安装? 慧编程安装图文教程”的完整攻略: mBlock5慧编程怎么下载安装? mBlock5慧编程是一款基于Scratch 3.0的图形化编程软件,适用于各种年龄段的学生和教师。以下是mBlock5慧编程下载安装的步骤: 步骤1:打开mBlock5慧编程官网 在浏览器中打开mBlock5慧编程官网(https://www.…

    html 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部