Mybatis

#{}和${}的区别是什么?

1)#{}是预编译处理,$ {}是字符串替换。

2)MyBatis在处理#{}时,会将SQL中的#{}替换为?号,使用PreparedStatement的set方法来赋值;MyBatis在处理 $ { } 时,就是把 ${ } 替换成变量的值。

3)使用 #{} 可以有效的防止SQL注入,提高系统安全性。

项目实战中使用,请阅读我博客中Java项目实战分类中的--MySQL中in('5,6,7')只取第一个id为5对应的数据的思考一文,谢谢。

要理解记忆这个题目,我觉得要抓住两点:

(1)$ 符号一般用来当作占位符,常使用Linux脚本的同学应该对此有更深的体会吧。既然是占位符,当然就是被用来替换的。知道了这点就能很容易区分$和#,从而不容易记错了。

(2)预编译的机制。预编译是提前对SQL语句进行预编译,而其后注入的参数将不会再进行SQL编译。我们知道,SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止SQL注入。在某些特殊场合下只能用${},不能用#{}。例如:在使用排序时ORDER BY ${id},如果使用#{id},则会被解析成ORDER BY “id”,这显然是一种错误的写法。

Xml 映射⽂件中,除了常⻅的 select|insert|updae|delete 标签之外,还有哪些标签?

答:还有很多其他的标签, ,加上动态 sql 的 9个标签, trim|where|set|foreach|if|choose|when|otherwise|bind 等,其中为 sql ⽚段标签,通过
标签引⼊ sql ⽚段, 为不⽀持⾃增的主键⽣成策略标

最佳实践中,通常⼀个 Xml 映射⽂件,都会写⼀个 Dao 接⼝与之对应,请问,这个 Dao 接⼝的⼯作原理是什么?Dao 接⼝⾥的⽅法,参数不同时,⽅法能重载吗?

Dao 接⼝,是⼈们常说的 Mapper 接⼝,接⼝的全限名,就是映射⽂件中的 namespace的值,接⼝的⽅法名,就是映射⽂件中 MappedStatement 的 id 值,接⼝⽅法内的参数,就是传递给 sql 的参数。 Mapper 接⼝是没有实现类的,当调⽤接⼝⽅法时,接⼝全限名+⽅法名拼接字符串作为 key 值,可唯⼀定位⼀个 MappedStatement ,举com.mybatis3.mappers.StudentDao.findStudentById ,可以唯⼀找到 namespace为 com.mybatis3.mappers.StudentDao 下⾯ id = findStudentById 的 MappedStatement 。在 Mybatis
中,每⼀个

0条相关条目,使用了0毫秒