• Mybaits 常用问题详解


    1. 什么是Mybaits

    本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。Mybaits封装了对SQL的crud的接口操作,是一款优秀的ORM框架。

    2. 为什么要使用mybatis

    • Java应用开发mybatis使用简单,只需要简单的xml配置即可使用
    • 封装了对数据库链接的创建、释放,封装了POJO的SQL映射,简化了对DB的操作,提高编码效率
    • 能集成到Spring中

    3. Mybatis的核心类

    • configuration: 全局配置类,通过mysql-config.xml实例产生
    • SqlSessionFactory: 管理SqlSession的工厂
    •  SqlSession: 面向用户的接口,提供了很多对DB的操作方法
    • Executor: 执行器接口,sqlSession通过执行器操作DB
    • MappedStatement:对操作数据库存储封装,包括SQL语句,输入输出参数
    • StatementHandler: 操作DB相关的handler接口
    • ResultHandler: 对结果返回处理的handler

    4. Mybatis的执行流程

    (来自mybatis执行流程 - 夜柠檬 - 博客园) 

    • 1)读取核心配置文件mybatis-config.xml,配置文件用于配置数据库连接、属性、类型别名、类型处理器、插件、环境配置、映射器(mapper.xml)等信息,核心配置文件最终会被封装成一个Configuration对象。
    1. configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    2. <configuration>
    3. <properties>
    4. <property>property>
    5. ...
    6. properties>
    7. <settings>
    8. <setting>setting>
    9. ...
    10. settings>
    11. <typeAliases>
    12. <package>package>
    13. ...
    14. <typeAlias>typeAlias>
    15. ...
    16. typeAliases>
    17. <typeHandlers>
    18. <package>package>
    19. ...
    20. <typeHandler>typeHandler>
    21. ...
    22. typeHandlers>
    23. <objectFactory>
    24. <property>property>
    25. ...
    26. objectFactory>
    27. <objectWrapperFactory>
    28. <property>property>
    29. ...
    30. objectWrapperFactory>
    31. <reflectorFactory>reflectorFactory>
    32. <plugins>
    33. <plugin>
    34. <property>property>
    35. ...
    36. plugin>
    37. ...
    38. plugins>
    39. <environments>
    40. <environment>
    41. <transactionManager>
    42. <property>property>
    43. ...
    44. transactionManager>
    45. <dataSource>
    46. <property>property>
    47. ...
    48. dataSource>
    49. environment>
    50. ...
    51. environments>
    52. <databaseIdProvider>
    53. <property>property>
    54. ...
    55. databaseIdProvider>
    56. <mappers>
    57. <package>package>
    58. ...
    59. <mapper>mapper>
    60. ...
    61. mappers>
    62. configuration>
    • 2)加载SQL映射文件,映射文件中配置了操作数据库的SQL语句,常见的配置的方式有两种,一种是package扫描包,一种是mapper找到配置文件的位置。
    1. <package name="com.mybatis.xxx"/>
    2. <mapper resource="xxx.xml"/>
    • 3)构造SqlSessionFactory.

    1. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    2. <property name="dataSource" ref="datasource">property>
    3. <property name="typeAliasesPackage" value="com.zhangguo.bookstore.entities">property>
    4. <property name="mapperLocations" value="classpath*:com/zhangguo/bookstore/mapper/*Mapper.xml">property>
    5. bean>
    • 4)创建SqlSession。SqlSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。SqlSession sqlSession = builder.openSession();

    • 5)Executor执行器,是MyBatis的核心,负责SQL语句的生成和查询缓存的维护,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护

      • SimpleExecutor -- SIMPLE 就是普通的执行器。
      • ReuseExecutor-执行器会重用预处理语句(PreparedStatements)
      • BatchExecutor --它是批处理执行器
    • 6)MappedStatement对象,是对解析的SQL的语句封装,一个MappedStatement代表了一个sql语句标签,如下:

    1. <select id="selectUserList" resultType="com.mybatis.User">
    2. select * from t_user
    3. select>
    • 7)输入参数映射,参数类型可以是基本数据类型,也可以是Map、List、POJO类型复杂数据类型,有两个属性 parameterType和parameterMap

    • 8)封装结果集,对返回结果处理映射,也有两个常用的属性resultType和resultMap。

    5. Mybatis的缓存实现

    Mybatis设计缓存的主要目的是减少对DB的可能性操作,减少资源浪费。Mybatis提供两级缓存设计,一级缓存在 Executor 执行器(SimpleExecutor)中有一个 Cache 对象中,默认就是一个 HashMap,执行数据库查询操作前,如果在一级缓存中有对应的缓存数据,则直接返回;

    一级缓存的key是函数id+包名,所以在mybaits中不允许有方法重载。

    二级缓存在Mapper scope,同一个mapper在不同的sqlsession种共享缓存。因为SqlSessio非线程安全,在多个 SqlSession 会话时,可能导致数据的不一致性,所以二级缓存默认关闭。

    6. #{} 和 ${} 的区别

    • #{}:在解析 SQL 的时候会将其替换成 ? 占位符,然后通过 JDBC 的 PreparedStatement 对象添加参数值,这里会进行预编译处理,可以有效地防止 SQL 注入,提高系统的安全性
    • ${}:在 MyBatis 中带有该占位符的 SQL 片段会被解析成动态 SQL 语句,根据入参直接替换掉这个值,然后执行数据库相关操作,存在 SQL注入 的安全性问题

    7. 延迟加载

    延迟加载就是在需要⽤到数据时才进⾏加载,不需要⽤到数据时就不加载数据。延迟加载也称懒加载。延迟加载是基于嵌套查询来实现的,优点是优先嵌套外层查询,减少DB操作,提高性能;缺点是使用到数据时临时查询,有一定的时延,用户体验有delay。

    局部延迟加载:在associationcollection标签中都有⼀个fetchType属性,通过修改它的值,可以修改局部的加载策略。 

    延迟加载原理:主要是通过动态代理的形式实现,代理拦截到指定⽅法,执⾏数据加载。 

    8. Mybatis和Hibernate

    • mybatis:入门简单,容易上手开发,节省开发成本;程序员自己编写sql语句,灵活度高,容易实现SQL的优化;可以自定义插件e.g. 分页插件等,可操作性强;
    • hibernate是一个ORM框架,不需要写SQL,但入门门槛较高,

  • 相关阅读:
    SCA Nacos 服务注册和配置中心(二)
    Web压测工具http_load原理分析
    计算机毕业设计(附源码)python职业高中智慧教学系统
    CommandInvokationFailure: Failed to update Android SDK package list. 报错的解决方法
    编译安装oh-my-zsh
    HDLbits exercises 13(MORE CIRCUITS全部题)
    在tdengine容器中生成初始化数据库的SH命令
    50道Redis面试题史上最全,以后面试再也不怕问Redis了
    二元Weierstrass逼近定理及其证明
    基于java+springboot+vue的校园出入管理系统
  • 原文地址:https://blog.csdn.net/chenwiehuang/article/details/125945883