1、Mybatis的理解

(1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句
本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原
生态sql,可以严格控制sql执行性能,灵活度高。
(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了
几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
(3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement
中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对
象并返回。(从执行sql到返回result的过程)。

2、Mybatis的标签

3、MyBatis的主要成员

  • Configuration MyBatis所有的配置信息都保存在Configuration对象之中,配置文件中的大部分配置都会存储到该类中
  • SqlSession 作为MyBatis工作的主要顶层API,表示和数据库交互时的会话,完成必要数据库增删改查功能
  • Executor MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
  • StatementHandler 封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数等
  • ParameterHandler 负责对用户传递的参数转换成JDBC Statement 所对应的数据类型
  • ResultSetHandler 负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
  • TypeHandler 负责java数据类型和jdbc数据类型(也可以说是数据表列类型)之间的映射和转换
  • MappedStatement MappedStatement维护一条节点的封装
  • SqlSource 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
  • BoundSql 表示动态生成的SQL语句以及相应的参数信息

    4、#{}和${}的区别

    {}是预编译处理、是占位符,#的参数都会被当成字符串处理,自动加上双引号
    ${}是字符串替换、是拼接符,直接拼接在sql上。

    5、#{}是怎么防止SQL注入的

    因为sql注入只出现在编译过程中,mybatis预编译处理sql语句,#{}会编译成占位符?号,执行sql时由PreparedStatement注入参数,而${}是字符串替换,预编译时会直接把传进来的任何参数拼接到sql上。

    mybatis的二级缓存

    一级缓存基于sqlsession,实现对sql级别的缓存,当访问同一sql是缓存生效,默认开启一级缓存
    二级缓存基于mapper,访问同一个mapper时缓存生效