【MyBatis】关于 MyBatis 的占位符 # 和 $ 说明

#占位符,告诉 mybatis 使用实际的参数值代替。并使用 PrepareStatement 对象执行 sql 语句, #{…}代替

sql 语句的 “”。这样做更安全,更迅速,通常也是首选做法

mapper 文件 :

<select id="selectById" resultType="com.kaho.domain.Student"> 
 	select id,name,email,age from student where id=#{studentId} 
</select>

内部机制:

使用#{}之后,mybatis执行sql语句是使用的jdbc中的PrepareStatement对象
        由mybatis执行下面的代码:
            1.mybatis创建Connection、PrepareStatement对象
              String sql = "select  id,name,email,age from student where id=?";
              PrepareStatement pst = conn.prepareStatement(sql);
              pst(1,1001); //填充占位符
              
        解释:where id=? 就是 where id=#{studentId} ps.setInt(1,1001) , 
        		1001 会替换掉 #{studentId}

            2.执行sql封装为resultType="com.kaho.domain.Student"这个类型的对象
              ResultSet rs = ps.executeQuery();
              Student student = new Student();
              while(rs.next()){
                  //从数据库取表的一行数据,存到一个java对象属性中
                  Student.setId(rs.getInt("id"));
                  Student.setName(rs.getString("name"));
                  Student.setEmail(rs.getString("email"));
                  Student.setAge(rs.getInt("age"));
              }
              return student;  //赋给了dao方法调用的返回值

$字符串替换,告诉 mybatis 使用 $ 包含的“字符串”替换所在位置。使用 Statement 把 sql 语句和${}的

内容连接起来。主要用在替换表名,列名,不同列**排序(order by ${…})**等操作。

mapper文件:

select id,name, email,age from student where id=${studentId}

MyBatis解析 $ 的结果:select id,name, email,age from student where id=1001

String sql=“select id,name, email,age from student where id=” + “1001”;
使用的Statement对象执行sql, 效率比PreparedStatement低。

: 可 以 替 换 表 名 或 者 列 名 , 需 要 能 确 定 数 据 是 安 全 的 , 才 可 以 使 用 :可以替换表名或者列名, 需要能确定数据是安全的,才可以使用 :可以替换表名或者列名,需要能确定数据是安全的,才可以使用

  # 和 $ 区别
  1. # 使用 ?在sql语句中做占位的,使用PreparedStatement执行sql,有预编译处理,效率高
  2. # 能够避免sql注入,更安全。
  3. $ 不使用占位符,是字符串连接方式,使用Statement对象执行sql,效率低
  4. $ 有sql注入的风险,缺乏安全性。
  5. $ 可以替换表名或者列名
  6. $所表示的内容是原样替换的
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值