目录
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 驱动程序进行执行
4、ResultType和ResultMap有什么区别
resultType和resultMap都用于查询结果的映射,区别点在于:
-
resultType :当数据库结果集中的列名和要封装实体的属性名完全一致的时候使用
-
resultMap :当数据库结果集中的列名和要封装实体的属性名有不一致的使用使用,它允许自定义映射规则