文章目录:

1.#占位符

1.1 #占位符的特点

1.2 使用 #{ } 对数据库执行 update 操作

2.$占位符

2.1 $占位符的特点

2.2 使用 ${ } 对数据库执行 select 操作

3.#{ }、${ } 占位符的综合使用


1.#占位符

1.1 #占位符的特点

  1. MyBatis处理 #{ } 占位符,使用的 JDBC 对象是 PreparedStatement 对象,执行sql语句的效率更高。
  2. 使用 PreparedStatement 对象,能够避免 sql 注入,使得sql语句的执行更加安全。
  3. #{ } 常常作为列值使用,位于sql语句中等号的右侧;#{ } 位置的值与数据类型是相关的。

1.2 使用 #{ } 对数据库执行 update 操作

package com.bjpowernode.dao;import com.bjpowernode.entity.Student;/****/
public interface StudentDao {//更新学生信息int updateStudent(Student student);}
<!-- 更新学生信息 -->
<update id="updateStudent">update student set name=#{name},email=#{email} where id=#{id}
</update>
    @Testpublic void testUpdateStudent() {SqlSession session=MyBatisUtil.getSqlSession();StudentDao studentDao=session.getMapper(StudentDao.class);Student student=new Student();student.setId(1003);student.setName("最强王者");student.setEmail("123456@qq.com");student.setAge(28);int rows=studentDao.updateStudent(student);session.commit();System.out.println("更新学生的rows === " + rows);session.close();}


2.$占位符

2.1 $占位符的特点

  1. MyBatis处理 ${ } 占位符,使用的 JDBC 对象是 Statement 对象,执行sql语句的效率相对于 #{ } 占位符要更低。
  2. ${ } 占位符的值,使用的是字符串连接的方式,有 sql 注入的风险,同时也存在代码安全的问题。
  3. ${ } 占位符中的数据是原模原样的,不会区分数据类型。
  4. ${ } 占位符常用作表名或列名,这里推荐在能保证数据安全的情况下使用 ${ }。

2.2 使用 ${ } 对数据库执行 select 操作

package com.bjpowernode.dao;import com.bjpowernode.entity.Student;
import org.apache.ibatis.annotations.Param;import java.util.List;/****/
public interface StudentDao {//${}占位符的使用,使用@Param命名参数List<Student> queryStudent(@Param("studentName") String name);}
<!-- ${}占位符的使用 -->
<select id="queryStudent" resultType="com.bjpowernode.entity.Student">select * from student where name=${studentName}
</select>
    @Testpublic void testQueryStudent() {SqlSession session= MyBatisUtil.getSqlSession();StudentDao studentDao=session.getMapper(StudentDao.class);List<Student> students=studentDao.queryStudent("'张起灵'");for(Student stu : students) {System.out.println("stu === " + stu);}session.close();}

这里注意代码中通过 ${ } 占位符传值的地方,如果我们写成下面这样,代码运行一定是会报错的!!!

List<Student> students=studentDao.queryStudent("张起灵");

这是因为 ${ } 占位符中的数据是原模原样的,不会区分数据类型。也就是说它会把你的mapper文件中的sql语句转换为:

select * from student where name=张起灵  (错误!!!)

对sql语句有了解的人肯定都能看出这里的错误,首先我们的name字段的数据类型是 varchar,而这里 name=张起灵 显然是错误的,应该是 name= '张起灵' 这样才对,所以代码中通过 ${ } 占位符传值的地方,应该这样写:

MyBatis——谈谈占位符(#、$)的理解与使用相关推荐

  1. MyBatis -- 参数占位符 #{} 和 ${}

    MyBatis -- 参数占位符 #{} 和 ${} 一.准备工作 二.参数占位符 #{} 和 ${} 三.特殊场景 3.1 特殊场景 1 -- String 3.1.1 使用 #{} 3.1.2 使 ...

  2. mybatis 注解 占位符

    #{} 自动进行 java 类型和 jdbc 类型转换,#{}可以有效防止 sql 注入. select * from user where username = #{username} userna ...

  3. Java面试之谈谈对Volatile的理解

    谈谈对Volatile的理解 Volatile在日常的单线程环境是应用不到的 Volatile是Java虚拟机提供的轻量级的同步机制(三大特性) 保证可见性 不保证原子性 禁止指令重排 可能这么说,还 ...

  4. python中,print()多个数据逗号分隔,打印时会以空格分隔,如果不要空格可以使用{}占位符

    print()多个数据逗号分隔,打印时会以空格分隔,如果不要空格可以使用{}占位符

  5. 谈谈对MVVM的理解

    谈谈对MVVM的理解 什么是MVVM 不管是MVC,MVP,或者MVVM,都是常见的软件架构设计模式(Architectural Pattern),它通过分离关注点来改进代码的组织方式.不同于设计模式 ...

  6. 谈谈对this的理解

    谈谈对this的理解 什么是this 每个函数在被调用时都会创建一个执行上下文,这个上下文包含了变量环境.this.作用域链等,this就是执行上下文中的一个属性,他是在函数运行时进行绑定的,this ...

  7. html 空格占位符

    // 空格展位符   // 使用 <span>  前面两个空格</span> 转自片段 html 空格占位符

  8. 什么是面向对象?谈谈对面向对象的理解?

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.什么是面向对象?谈谈对面向对象的理解? 二.3大特征: 1.封装: 2.继承: 2.多态: 总结 一.什么是面向对象?谈 ...

  9. Logger 日志输出请使用占位符 {}

    在工作复盘时,检查代码的过程中,发现好多代码在打印日志的时候,会用字符串拼接,这是是非常不好的现象. 对于占位符的形式而言,只有在我们需要的时候才会提取字符串,这样就会避免创建string对象的时候消 ...

最新文章

  1. struts2中拦截器和过滤器的比较
  2. 120分钟React快速扫盲教程
  3. u-boot分析(八)----串口初始化
  4. 福利 | 2018 OpenInfra Days China限量版免费票任性放出
  5. 优达学城深度学习之一——Anaconda
  6. 比较=、==、===
  7. 设计模式再学习之单例模式
  8. 1017 A除以B (20 分)—PAT (Basic Level) Practice (中文)
  9. SQL2008如何建立数据库
  10. png转iconfont_IconFont|阿里巴巴矢量图标库
  11. linux虚拟键盘onboard设置,求助,安装屏幕虚拟键盘onboard出错。
  12. 手机端和PC端开发区别
  13. 美团构建实时数仓的痛点是什么?如何解决?
  14. 日期格式化、时间差转换
  15. php注入过程详解,PHP注入代码详解
  16. ROS中EKF(扩展卡尔曼跟踪)的使用
  17. LEP与负载均衡—— 以PCDUINO实际案例来使用LEP提高网络带宽
  18. 听说一个漂亮的小姐姐图片是程序员无法抗拒的
  19. 无迹卡尔曼滤波UKF—目标跟踪中的应用(仿真部分)
  20. Ubuntu创建Eclipse桌面快捷方式

热门文章

  1. Embedding 基础
  2. 海外开发者账号上架总结
  3. 常用的TTL与CMOS电平转换方案
  4. HandlerThread源码分析
  5. oschina为什么绑定手机号总是报错
  6. 云开发喝酒神器2.0微信小程序源码 附搭建教程【源码好优多】
  7. Mybatis报错:Could not find resource mybatis-conf.xml
  8. 【C语言】实现n的阶乘
  9. 5-羟色胺(serotonin)
  10. 利用 diskpart 隐藏显示分区