详解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日

相关文章

  • Android开发之XML文件解析的使用

    下面就为你详细讲解“Android开发之XML文件解析的使用”的完整攻略。 1. 什么是XML文件解析 XML文件解析是通过解析XML文件中的数据,将其转换为Java对象的过程。在Android开发中,我们经常会使用XML文件来处理数据,如布局文件、AndroidManifest.xml文件、网络请求等等,这些数据需要通过解析XML文件才能够在代码中被处理和…

    html 2023年5月30日
    00
  • 美图秀秀怎么设计闪图?

    美图秀秀是一款功能强大的图片处理软件,它可以帮助用户设计出各种各样的图片,包括闪图。以下是设计闪图的详细攻略: 步骤1:打开美图秀秀 打开美图秀秀软件。 单击“新建”按钮。 选择“自定义尺寸”。 输入闪图的尺寸。 单击“确定”按钮。 步骤2:添加图片和文字 单击“插入”菜单。 选择“图片”或“文字”。 选择要添加的图片或文字。 拖动图片或文字到闪图中。 步骤…

    html 2023年5月17日
    00
  • hbuilderx怎么设置向下插入空行?hbuilderx设置向下插入空行技巧

    以下是关于HBuilderX设置向下插入空行的攻略: HBuilderX怎么设置向下插入空行? 在HBuilderX中,您可以通过以下步骤设置向下插入空行: 打开HBuilderX:首先,打开HBuilderX。 进入设置:在HBuilderX中,选择“文件”->“首选项”->“设置”。 搜索设置项:在搜索框中输入“insert”,找到“Edit…

    html 2023年5月17日
    00
  • Python中的hypot()方法使用简介

    Python中的hypot()方法使用简介 简介 hypot() 方法返回欧几里得范数 sqrt(xx + yy)。 即,求解对应点(x,y)的极坐标 r。 语法 hypot()方法的语法如下: math.hypot(x, y) 参数 以下是 hypot()方法的参数: x — 数值表达式 y — 数值表达式 返回值 hypot()方法返回两个参数平方和…

    html 2023年5月30日
    00
  • Android中的xml解析介绍

    下面就为您详细讲解“Android中的xml解析介绍”的完整攻略。 什么是XML解析 XML 指可扩展标记语言。 XML 被设计用来传输和存储数据。 XML 是一种非常常用的数据传输格式,也是 Android 开发中常用的一种数据传输格式。Android 中常用的 XML 解析方式有三种:SAX、DOM 和 Pull。 SAX 解析方式 SAX 是 Simp…

    html 2023年5月30日
    00
  • 详解XML中的代码注释书写方法

    下面是详解“详解XML中的代码注释书写方法”的完整攻略。 标准XML代码注释格式 在XML中,我们使用<!–和–>进行注释。这两个符号之间的内容都会被视为注释,在XML解析时会被忽略。 例如,在下面的示例中,我们使用XML注释来描述XML文件的版本、作者和创建时间: <?xml version="1.0" encod…

    html 2023年5月30日
    00
  • HTML注释的写法(附带示例)

    HTML注释是一种特殊的语法,它通常被用于在HTML文档中注释一些内容。在网页开发中,注释是一种非常有用的方式,可以让其他的开发者和自己更好地理解文档结构,也方便我们在调试代码时做一些标注。 以下是HTML注释的写法和示例: 注释单行内容 注释单行内容的方法是在要注释的内容前加上“”符号。注意,注释符号中间不要加空格。 <p>这是一个段落<…

    Web开发基础 2023年3月15日
    00
  • 浅析Spring基于注解的AOP

    浅析Spring基于注解的AOP 什么是AOP AOP(Aspect Oriented Programming),面向切面编程,通过预编译方式和运行时动态代理实现在不修改原有业务代码的情况下,对系统功能进行增强。 在AOP中,切面是指一类横跨多个对象的特定行为,比如事务管理、日志管理等。切面可以包含前置、后置、环绕、异常通知等多个通知,对目标对象的方法进行增…

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