首页 > 数据库 >MyBatis 特殊SQL执行技巧与注意事项

MyBatis 特殊SQL执行技巧与注意事项

时间:2024-06-15 23:59:04浏览次数:23  
标签:username xml SQL 表名 user 注意事项 MyBatis id

在MyBatis中,处理特殊SQL查询时,需要格外注意SQL注入的风险以及参数的绑定方式。下面将详细介绍几种常见的特殊SQL执行场景,并提供相应的 MyBatis 实现方式及注意事项。

一、模糊查询

/**
 * 根据用户名进行模糊查询
 * @param username 
 * @return java.util.List<com.example.mybatis.pojo.User>
 */
List<User> getUserByLike(@Param("username") String username);

模糊查询是数据库中常见的查询方式,MyBatis提供了两种主要的参数绑定方式来实现模糊查询:

  • 使用 ${}不推荐,存在SQL注入风险)
xml
<select id="getUserByLike" resultType="User">  
    select * from t_user where username like '%${username}%'  
</select>

注意:这种方式直接将变量内容拼接到SQL语句中,存在SQL注入的风险。

  • 使用 concat 函数和 #{}推荐
xml
<select id="getUserByLike" resultType="User">  
    select * from t_user where username like concat('%', #{username}, '%')  
</select>

或者在某些数据库中,可以使用 || 代替 concat 函数:

xml
<select id="getUserByLike" resultType="User">  
    select * from t_user where username like '%' || #{username} || '%'  
</select>

使用 #{} 的方式可以确保参数被正确预编译,防止SQL注入

二、批量删除

在 MyBatis 中进行批量删除时,需要特别注意参数的绑定方式。由于 #{} 会将参数值作为整体进行预编译,因此不能直接在 IN 子句中使用

delete from t_user where id in ('1,2,3')

这样是将 1,2,3 看做是一个整体,只有 id 为 1,2,3 的数据会被删除。

正确的做法是使用 ${} 或者将参数拆分为多个 #{}

  • 使用 ${}(注意SQL注入风险)
xml
<delete id="deleteMore">  
    delete from t_user where id in (${ids.replaceAll(",","','")})  
</delete>

delete from t_user where id in ('1','2','3')

注意:在Java代码中,需要确保 ids 字符串中的每个ID都被单引号包围,并且用逗号分隔

  • 使用 foreach 元素和 #{}(推荐)
xml
<delete id="deleteMore">  
    delete from t_user  
    <where>  
        <foreach item="id" collection="ids" open="id in (" separator="," close=")">  
            #{id}  
        </foreach>  
    </where>  
</delete>

这种方式可以确保每个ID都被单独预编译,避免了SQL注入的风险。

三、动态设置表名

在某些场景下,可能需要动态地设置表名。由于表名无法被预编译,因此只能使用 ${} 来绑定参数:

/**
 * 查询指定表中的数据
 * @param tableName 
 * @return java.util.List<com.atguigu.mybatis.pojo.User>
 */
List<User> getUserByTable(@Param("tableName") String tableName);
xml
<select id="getUserByTable" resultType="User">  
    select * from ${tableName}  
</select>

注意:在使用这种方式时,需要确保传入的表名是可信的,否则将面临SQL注入的风险。一种常见的做法是在后端代码中定义一个包含所有有效表名的白名单,并检查传入的表名是否在该白名单中。

四、添加功能获取自增的主键

  • 使用场景

    • t_clazz(clazz_id,clazz_name)
    • t_student(student_id,student_name,clazz_id)
    1. 添加班级信息
    2. 获取新添加的班级的id
    3. 为班级分配学生,即将某学的班级id修改为新添加的班级的id

mapper.xml 中设置两个属性:

  • useGeneratedKeys:设置使用自增的主键
  • keyProperty:因为增删改有统一的返回值(受影响的行数),因此只能将获取的自增的主键放在传输的参数user对象的某个属性中
/**
 * 添加用户信息
 * @param user 
 */
void insertUser(User user);
<!--void insertUser(User user);-->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
	insert into t_user values (null,#{username},#{password},#{age},#{sex},#{email})
</insert>
//测试类
@Test
public void insertUser() {
	SqlSession sqlSession = SqlSessionUtils.getSqlSession();
	SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);
	User user = new User(null, "ton", "123", 23, "男", "[email protected]");
	mapper.insertUser(user);
	System.out.println(user);
	
	// 输出:user{id=10, username='ton', password='123', age=23, sex='男', email='[email protected]'},自增主键存放到了user的id属性中
}

总结

在处理特殊 SQL 查询时,我们需要根据具体的场景选择合适的参数绑定方式。

  • 对于模糊查询和批量删除等场景,推荐使用 #{} 来确保参数被正确预编译,防止SQL注入。

  • 对于需要动态设置表名等场景,由于无法预编译表名,只能使用 ${} 来绑定参数,但需要确保传入的参数是可信的。

标签:username,xml,SQL,表名,user,注意事项,MyBatis,id
From: https://blog.csdn.net/Zachyy/article/details/139710978

相关文章

  • 实现一个简单的mybatis:SimpleMyBatis
    创建一个类似MyBatis的框架,主要涉及到几个关键部分:SQL语句的解析与存储,参数的绑定,以及最终的SQL执行。以下是一个简单的示例,使用Java、JDBC和SQLite数据库来实现:importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importja......
  • 数据库MySQL——从0到1入门教程
    Q:为什么需要MySQL?A:网络服务中,我们需要存储、管理大量的数据,并确保数据的安全、实现增删改查操作的高效,因此需要一个系统用来专门管理数据,以实现上述的高性能要求,数据库管理系统应需而生八股如下:数据持久性:数据库能够持久化存储数据,确保数据在系统关闭或崩溃后依然存在......
  • Windows中搭建centos虚拟机和MySQL
    背景前一段时间,博主为了在家里搭建学习环境,想模拟一个生产环境,尝试了Windows安装WSL、Vmwareworkstationplayer安装Ubuntu、把Window删了直接装Ubuntu、把Ubuntu删了装回Windows(Windows一直无法安装到SSD,最后拆了电脑拔了机械硬盘才装成功)的多个阶段,发现还是Windows用的习惯......
  • 《mysql必知必会》读书笔记
    信息《MySQL必知必会》福塔人民邮电出版社摘录基本概念数据库保存有组织的数据的容器(通常是一个文件或一组文件)。表某种特定类型数据的结构化清单。模式关于数据库和表的布局及特性的信息。有时,模式用作数据库的同义词。主键一列或一组列,其值可以唯一区分表中......
  • 使用mysql_config_editor可以为特定的MySQL服务器或客户端程序设置登录路径
    login_path介绍在MySQL中,login_path通常不是MySQL服务器配置或SQL语句的一部分。但是,它经常与MySQL的命令行工具mysql_config_editor一起使用,这是一个允许用户安全地存储认证凭据(如用户名、密码和连接参数)的工具。mysql的client工具都能使用login-path,如......
  • Mybatis和Hibernate的作用区别及底层原理分析
    目录Mybatis的作用及底层原理Hibernate的作用及底层原理Mybatis与Hibernate的主要区别Mybatis和Hibernate都是Java应用程序中常用的ORM(Object-RelationalMapping,对象关系映射)框架,它们的主要作用是简化数据库访问层的开发,将数据库操作映射为面向对象的编程方式,从而提高......
  • JavaWeb课程设计/期末大作业-电影网站+源代码+文档说明+数据库sql
    文章目录源码下载地址项目介绍项目功能界面预览项目备注源码下载地址源码下载地址点击这里下载代码项目介绍项目功能界面预览项目备注1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!2、本项目适合计算机相关专业(如计科......
  • MySQL中的日期格式化匹配
    在MySQL中,处理日期和时间数据是很常见的需求。在某些情况下,你可能需要从数据库中选择特定日期或格式化日期进行匹配。本文将介绍如何使用MySQL的SELECT语句对日期进行格式化匹配。1.基本的日期格式化函数MySQL提供了几个函数来处理和格式化日期和时间数据:DATE_FORMAT(dat......
  • Mybatis框架中结果映射resultMap标签方法属性收录
    Mybatis框架中结果映射resultMap标签收录在MyBatis框架中,resultMap是一种强大的机制,用于将数据库结果集映射到Java对象上。它允许你定义如何将查询结果中的列映射到Java对象的属性上,尤其是当数据库表的字段名与Java对象的属性名不一致时,或者需要进行复杂的映射(如一对一、......
  • MySQL数据库初体验
    SQLServer(微软公司产品)1、数据库基本概念(1)数据Data数据就是描述事物的符号记录。主要包括数字,文字、图形、图像、声音、档案记录等。一般以“记录”形式按统一的格式进行存储。(2)表表就是将不同的记录组织在一起。主要是用来存储具体数据。(3)数据库数据库(database)是表的集......