数据库技术 - Mybatis

51 阅读2分钟

前言

6题。

Mybatis中#{}和${}的区别?

都可以在sql语句中拼接参数,区别在于:

  1. ${}表示的是字符串拼接,会直接将${}替换成变量的值;#{}是预编译处理,会将sql中的#{}替换为?号,然后底层使用JDBC赋值。

  2. ${}存在SQL注入问题(前端传递导致),#{}可以有效的防止SQL注入。

  3. ${}处理的sql到数据库每次都要重新编译,而#{}处理的sql只需要编译一次。

  4. 使用场景:在实际使用过程中尽量使用#{};当sql中需要动态传递表名或者字段名使用${}

  5. 传入数据的表现:#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sqlorder by "id"$将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sqlorder by id

实体类中的属性名和表中的字段名不同如何映射?

可以使用下面这几种方案:

  • 开启驼峰映射;

  • 字段起别名:可以在查询的SQL语句中定义字段名的别名;

  • 手动映射:mybatis提供了resultMap标签或者用注解@Results

MyBatis动态SQL了解吗?

动态SQL的执行原理:当MyBatis执行动态SQL语句时,会将SQL语句和参数传递给SQL解析器进行解析 ,解析器会根据SQL语句中的动态标签和参数的值,生成一个完整的SQL语句,MyBatis将生成的SQL语句和参数传递给JDBC执行。

MyBatis常用的动态SQL标签有:

  1. 条件判断标签ifchoosewhenotherwise

  2. 格式整理标签trimwhereset

  3. 循环遍历标签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完成大批量数据插入。