# :占位符,告诉 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. $所表示的内容是原样替换的