前言
共6题。
Mybatis中#{}和${}的区别?
都可以在sql语句中拼接参数,区别在于:
-
${}表示的是字符串拼接,会直接将${}替换成变量的值;#{}是预编译处理,会将sql中的#{}替换为?号,然后底层使用JDBC赋值。 -
${}存在SQL注入问题(前端传递导致),#{}可以有效的防止SQL注入。 -
${}处理的sql到数据库每次都要重新编译,而#{}处理的sql只需要编译一次。 -
使用场景:在实际使用过程中尽量使用
#{};当sql中需要动态传递表名或者字段名使用${}。 -
传入数据的表现:
#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id";$将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id。
实体类中的属性名和表中的字段名不同如何映射?
可以使用下面这几种方案:
-
开启驼峰映射;
-
字段起别名:可以在查询的
SQL语句中定义字段名的别名; -
手动映射:
mybatis提供了resultMap标签或者用注解@Results。
MyBatis动态SQL了解吗?
动态SQL的执行原理:当MyBatis执行动态SQL语句时,会将SQL语句和参数传递给SQL解析器进行解析 ,解析器会根据SQL语句中的动态标签和参数的值,生成一个完整的SQL语句,MyBatis将生成的SQL语句和参数传递给JDBC执行。
MyBatis常用的动态SQL标签有:
-
条件判断标签:
if、choose、when、otherwise -
格式整理标签:
trim、where、set -
循环遍历标签:
foreach
Mybatis的一级缓存和二级缓存?
-
一级缓存(默认开启):同一个
session下执行相同方法,sql语句相同,是SQL session级别缓存, -
二级缓存(默认关闭):同一个名称空间下
<namespace>--同一个mapper下,不管有多少session执行的SQL语句相同的话,走二级缓存,
xml映射文件中,都有哪些标签?
常见的有select|insert|update|delete标签,此外还有<resultMap>、<parameterMap>、<sql>、<include>、<selectKey>,加上动态sql的标签。其中<sql>为sql片段标签,通过<include>标签引入sql片段,<selectKey>为不支持自增的主键生成策略标签。
MyBatis的大批量数据插入数据库是怎么实现的?
开启ExecutorType.BATCH模式,简单的讲就是openSession的时候带上参数ExecutorType.BATCH,可以几乎无损优化你的代码性能。
SqlSession session = sessionFactory.openSession(ExecutorType.BATCH);
然后就可以使用MultiRowInsertStatementProvider完成大批量数据插入。