[MySQL]——SQL预编译、动态sql

这篇具有很好参考价值的文章主要介绍了[MySQL]——SQL预编译、动态sql。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

键盘敲烂,年薪30万🌈

[MySQL]——SQL预编译、动态sql,mysql,mysql,sql,intellij-idea

目录

一、SQL的预编译

📕一条SQL语句的执行过程

📕弊端

📕预编译SQL的优势

📕两种参数占位符

📕小结

二、动态SQL

📕概念介绍:

📕案例:

📕动态SQL语句:

📕应用场景总结:

三、总结:


一、SQL的预编译

📕一条SQL语句的执行过程

[MySQL]——SQL预编译、动态sql,mysql,mysql,sql,intellij-idea

📕弊端
  • 3条SQL语句都是删除操作,但是经过语法解析,优化,编译会生成3条不同的SQL语句,降低性能也浪费空间。
delete from emp where id = 1;  
delete from emp where id = 2;
delete from emp where id = 3;
//优化后执行3条不同的SQL语句
📕预编译SQL的优势
  • 使用参数占位符#{}替代
  • 预编译生成的SQL语句相同,故第二次、第三次,省去了解析和优化过程,提高性能
delete from emp where id = #{id};
-- 预编译后的SQL语句
delete from emp where id = ?;

预编译可防止SQL注入

下面是一个登户登录的校验,当你输入用户名和密码,点击登录,信息传到服务器,服务器端会从User表中查询有无该用户,以下是两种SQL语句的差别。

-- 用户登录校验
select username, password from user where username='张三' and password='123'

-- 普通语句
select username, password from user where username='saggd' and password='' or '1'='1';

-- 预编译SQL安全
select username, password from user where username=? ans password=?;

小结:

普通语句编译后会将参数以字符串的形式拼接到SQL语句中,这就造成了语句的恒成立

预编译SQL编译后将参数整体视为一个字符串,当语句开始执行时,才进行替换

📕两种参数占位符

#{}

  • 执行SQL时,会将#{…}替换为?,生成预编译SQL,会自动设置参数值。
  • 使用时机:参数传递,都使用#{…}

${}

  • 拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题。
  • 使用时机:如果对表名、列表进行动态设置时使用。
📕小结

预编译SQL利用参数占位符编译生成的SQL语句相同,性能高效

可防止SQL注入

二、动态SQL

📕概念介绍:

随着用户的输入或外部条件的变化而变化的SQL语句,我们称为 动态SQL

📕案例:

[MySQL]——SQL预编译、动态sql,mysql,mysql,sql,intellij-idea

📕动态SQL语句:

<if>用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。

用法:test属性为if的判断条件

实现:例如动态sql实现条件查询

    <!--    动态sql - if-->
    <select id="select" resultType="com.itpan.pojo.Emp">
        select *
        from emp
            <where>
                <if test="name != null">
                    name like concat('%', #{name}, '%')
                </if>
                <if test="gender != null">
                    and gender = #{gender}
                </if>
                <if test="begin != null and end != null">
                    and entrydate between #{begin} and #{end}
                </if>
            </where>
        order by update_time desc
    </select>

注意:

如果name字段为空,sql语句为select * from emp where and gender = #{gemder}……

引入<where></where>标签:

where 元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND 或OR

同理update时也要引入<set></set>标签去除多余 ,

<foreach>遍历集合或数组给字段赋值

属性介绍 :

  • collection:集合或数组名
  • item:要分割的字段名
  • separator:每次遍历的分隔符
  • open:遍历开始前拼接的片段
  • close:遍历开始后拼接的片段

实现:例如实现批量删除

<!--    批量删除元素-->
<!--    ids是List<Integer>集合>
    <delete id="deleteById">
        delete from emp where id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>

<sql>与<include>

  •  <sql>定义可重用的 SQL 段。
  • <include>通过属性refid,指定包含的sql片段。

[MySQL]——SQL预编译、动态sql,mysql,mysql,sql,intellij-idea

[MySQL]——SQL预编译、动态sql,mysql,mysql,sql,intellij-idea

📕应用场景总结:

<if>

  • 用于判断条件是否成立,如果条件为true,则拼接SQL
  • 形式:<if test="name != null">…</if>

<where>

  • where 元素只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的AND OR

<set>

  • 动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中)

<foreach>

  • 遍历集合或数组给字段赋值
  • 形式<foreach collection=集合或数组名 item=字段名 separator="," open="(" close=")">

<sql><include>

  • sql封装相同代码 include引入

三、总结:

🌈 动态SQL是重点,也是我们开发中最为常用的SQL语句

🌈 #{} 与 ${}占位符有什么区别 -> 大厂面试题

🌈 预编译SQL的优势文章来源地址https://www.toymoban.com/news/detail-736576.html

到了这里,关于[MySQL]——SQL预编译、动态sql的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java开发+Intellij-idea+Maven+工程构建

    Intellij-idea是一款流行的Java集成开发环境,它支持Maven作为项目管理和构建工具。Maven可以帮助开发者自动下载项目依赖的jar包,执行编译、测试、打包等生命周期任务。本资源将介绍如何在Intellij-idea中创建、导入、转换和编译Maven工程,以及如何配置Maven的相关参数和插件。

    2024年02月01日
    浏览(111)
  • Java项目使用intellij-IDEA查看依赖包版本是否有冲突(方法及工具)附截图

    编译器及版本 idea-ultimate 依赖管理工具 maven Step1:点击右侧的maven Step2:右键依赖项,点击分析依赖关系 Step3:可以在模块名位置进行切换,左侧三角的标志则表示该包引入了多个版本,有冲突 Step4:可以看到当前这个包被引入了两个版本的 Step5:右键冲突的包名,可以看到

    2024年02月15日
    浏览(104)
  • IntelliJ IDEA 安装mybaits当前运行sql日志插件在线与离线安装方法

    先安装好idear 去网上找找这个安装包下载下来,注意版本要完全一致! 比如: 手动安装离线插件方法举例 提前下载好插件的安装包 可以去网上下载这个安装包 搜索离线安装包的资源,包名如下: 找到资源下载好之后解压出来如下图: 然后选择提前下载好的插件的JAR文件,

    2024年02月06日
    浏览(37)
  • 在IDEA中配置MySQL数据库连接以及在使用mybatis时设置sql语句的代码提示功能

    在IDEA中配置MySQL数据库连接以及在使用mybatis 时设置 sql语句的代码提示功能 一:在IDEA中配置MySQL数据库连接 第一步:在IDEA右侧区域有database选项,点击进去 第二步:database  - data soucre - mysql   第三步:配置连接信息,连接数据库   第四步:显示的数据库以及表的信息  第

    2024年02月14日
    浏览(51)
  • 解决IntelliJ IDEA在Mybatis 编写mapper.xml SQL语句时不自动提示SQL语句和数据库表的问题

    在Idea中链接数据库后,发现在MySql 的console中有SQL语句提示和数据表的提示,但是在编写mapper.xml中发现并没有提示,很烦,觉得效率下降。 在百度搜索后,发现了解决方法,出现了SQL语句的提示. 解决办法: 按下alt + enter,选择Language injection settings 然后选择SQL即可,但是这种

    2024年02月16日
    浏览(54)
  • 【MySQL速通篇003】MySQL视图,MySQL触发器,MySQL函数,MySQL存储过程(参数分类,存储过程的增删改查等),SQL的动态执行,支持事务的存储过程,pymysql

    这篇万字博客主要包括了我对: MySQL视图,MySQL触发器,MySQL函数,MySQL存储过程(参数分类,存储过程的增删改查等),SQL的动态执行,支持事务的存储过程,pymysql等的总结,可谓非常的详细😃 文章毕竟这么长,对于文章中的一些语法,概念,例子等错误,欢迎并感谢各位读

    2023年04月27日
    浏览(79)
  • mybatis-plus技巧--动态表名-多语句-拼接sql--关于mybatis的mysql分页查询总数的优化思考

    传入tableName参数就可以了,不过只能用$不能用# 因为#会发生预编译,然后会在表名上加引号’\\\'。 新建一个表名拦截类实现TableNameHandler mybatisPlus添加插件 实例: 每天按统计 如果表名为count则加上今天的时间 每次设置 直接设置名字,然后就会改变的。 需要在配置文件中的

    2024年01月16日
    浏览(49)
  • IntelliJ IDEA Java 连接 mysql 配置(附完整 demo)

    从MySQL官网下载JDBC驱动的步骤如下: 1)访问MySQL的官方网站:MySQL 2)点击页面上方的\\\"DOWNLOADS\\\"菜单; 3)在下载页面,找到\\\"MySQL Community (GPL) Downloads\\\"部分,点击进入; 4)在MySQL Community Downloads页面,找到\\\"Connector/J\\\"链接,点击进入; 5)在Connector/J页面,您将看到最新版本的JDBC驱

    2024年02月02日
    浏览(52)
  • IntelliJ IDEA如何使用固定地址公网远程访问本地Mysql数据库

    IDEA作为Java开发最主力的工具,在开发过程中需要经常用到数据库,如Mysql数据库,但是在IDEA中只能连接本地数据库,有时候需要访问其他地方如家里或者公司的数据库,将无法访问,内网的局限性导致我们只能在同一网络访问,无法跨网络访问,所以,本例将介绍如何在异

    2024年02月03日
    浏览(133)
  • 【Java】IntelliJ IDEA使用JDBC连接MySQL数据库并写入数据

    在 IntelliJ IDEA 中连接 MySQL 数据库并将数据存储在数据表中,使用 Java 和 JDBC(Java Database Connectivity)实现。 下载并安装 IntelliJ IDEA 下载并安装 MySQL 数据库 下载 MySQL Connector/J 驱动程序(JDBC 驱动程序) 使用 Navicat 创建一个 MySQL 数据库 打开 IntelliJ IDEA。 选择 \\\"File\\\"→ “New” →

    2024年02月05日
    浏览(85)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包