1、Mybatis中#{}和${}的区别
在Mybatis中#{}
和${}
都可以用于在sql语句中拼接参数,但是在使用方面有很多的区别
1、处理方式不同:${}
表示的是字符串拼接,Mybatis在处理它时,会直接将${}
替换成变量的值
而#{}是预编译处理,Mybatis在处理它时,会将sql中的#{}
替换为?号,然后底层使用JDBC的预编译对象来赋值
2、安全性不同:${}
存在SQL注入问题,#{}可以有效的防止SQL注入
3、效率不同:${}
处理的sql到数据库每次都要重新编译,而#{}
处理的sql只需要编译一次
总之,在实际使用过程中尽量使用#{},而避免使用${}
,当然这也不是说${}
就没有使用场景
比如:如果sql中需要动态传递表名或者字段名,那就只能使用${}了
2、当实体类中的属性名和表中的字段名不一样 ,怎么办
是这样的,当实体类中的属性名和表中的字段名一样的时候,Mybatis会自动完成查询结果的映射
但是如果不一样,Mybatis默认无法完成结果映射,此时我们可以使用下面这几种方案:
1、开启驼峰映射:这种方式可以处理掉字段和属性满足驼峰转换规则的那部分
2、字段起别名:可以在查询的SQL语句中定义字段名的别名,让字段名的别名和实体类的属性名一致
3、手动映射:mybatis提供了resultMap标签,它可以通过来自定义映射关系来保证字段和属性的映射
3、MyBatis动态SQL了解吗
动态SQL是为了解决SQL语句灵活性不足的问题而提出的一种技术,它可以根据条件拼接SQL语句以不同的查询需求
MyBatis常用的动态SQL标签有:
- 条件判断标签:if、choose、when、otherwise 当条件成立时才执行其中的 SQL 语句
- 格式整理标签:trim、where、set 它可以在生成的SQL语句中调整格式,去除多余的关键字和符号
- 循环遍历标签:foreach 它用于遍历一个集合并将集合中的元素添加到 SQL 语句中
动态 SQL 的执行原理是,当 MyBatis 执行动态 SQL 语句时,会将 SQL 语句和参数传递给 SQL 解析器进行解析
SQL 解析器会根据 SQL 语句中的动态标签和参数的值,生成一个完整的 SQL 语句
然后,MyBatis将生成的SQL语句和参数传递给 JDBC 驱动程序进行执行