常用框架03 - MyBatis

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

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

(2)MyBatis 在处理两个字符时,处理方式也是不同的,

        01 处理 #{} 时,会将 SQL 中的 #{} 整体替换为占位符(即:?),调用PreparedStatement 的 set 方法来赋值;

        02 在处理 ${} 时,就是把 ${} 替换成变量的值。

(3)用 ${} 来编写SQL 会出现:恶意SQL 注入,那么数据库的数据安全性就没办法保障了。使用#{}可以有效的防止SQL注入,提高系统安全性。原因在于:预编译机制。预编译完成之后,SQL的结构已经固定,即便用户输入非法参数,也不会对SQL的结构产生影响,从而避免了潜在的安全风险。

        预编译是提前对SQL语句进行预编译,而其后注入的参数将不会再进行SQL编译。我们知道,SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止SQL注入。

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

      <resultMap>、<parameterMap>、<sql>、<include>、<selectKey>,加上动态 sql 的 9 个标签 trim | where | set | foreach | if | choose | when | otherwise | bind 等,其中 <sql> 为 sql 片段标签,通过 <include> 标签引入 sql 片段, 为不支持自增的主键生成策略标签。

3. Mybatis 是如何进行分页的?分页插件的原理是什么?

        Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页,可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

       分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql,根据 dialect 方言,添加对应的物理分页语句和物理分页参数。

如,select _ from student ,拦截 sql 后重写为: select t._ from (select \* from student)t limit 0,10

4. 简述 Mybatis 的插件运行原理,以及如何编写一个插件?

        Mybatis 仅可以编写针对 ParameterHandler 、 ResultSetHandler 、 StatementHandler 、 Executor 这 4 种接口的插件,Mybatis 使用 JDK 的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这 4 种接口对象的方法时,就会进入拦截方法,具体就是 InvocationHandler 的 invoke() 方法,当然,只会拦截那些你指定需要拦截的方法。

        实现 Mybatis 的 Interceptor 接口并复写 intercept() 方法,然后在给插件编写注解,指定要拦截哪⼀个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。

5. Mybatis 执行批量插入,能返回数据库主键列表吗?

        能,JDBC 都能,Mybatis 当然也能。

6. Mybatis 动态 sql 是做什么的?都有哪些动态 sql?能简述一下动态 sql 的执行原理不?

        Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和 动态拼接 sql 的功能,Mybatis 提供了 9 种动态 sql 标签 trim | where | set | foreach | if | choose | when | otherwise | bind 。 其执行原理为,使用 OGNL 从 sql 参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态 sql 的功能。

        OGNL:对象图导航语言,一种强大的表达式语言。

7. Mybatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形式?

        第一种是使用标签,逐⼀定义列名和对象属性名之间的映射关系。第二种是使用 sql 列的别名功能,将列别名书写为对象属性名,比如 T_NAME AS NAME,对象属性名一般是 name,小写,但是列名不区分大小写,Mybatis 会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以 写成 T_NAME AS NaMe,Mybatis 一样可以正常工作。 有了列名与属性名的映射关系后,Mybatis 通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值