• Mybaits


    mybatis

    什么是Mybatis?

    mybatis是一个数据持久层的轻量级的框架.

    对JDBC进行封装,提供了一些数据访问接口,将sql与java进行分离,

    提供动态sql,对结果进行封装…

    Mybatis如何进行分页?

    1. 使用Mybatis里面的第三方插件,
    2. 使用方式:在将要执行的sql语句之前使用分页插件:pageHelper.starPage(pageNum,pageSize);
    3. pageNum:表示的是页码,也就是说有多少页
    4. pageSize:就是一个页中显示几条数据(数量)
    5. 在starPage()方法中重要输入整数就行;

    Mybaits的优缺点

    Mybait的优点:

    (1)简单易学,容易上手(相比于Hibernate) 基于SQL编程;
    (2)JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
    (3)很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持,而JDBC提供了可扩展性,所以只要这个数据库有针对Java的jar包就可以就可以与MyBatis兼容),开发人员不需要考虑数据库的差异性。
    (4)提供了很多第三方插件(分页插件 / 逆向工程);
    (5)能够与Spring很好的集成;
    (6)MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,解除sql与程序代码的耦合,便于统一管理和优化,并可重用。
    (7)提供XML标签,支持编写动态SQL语句。
    (8)提供映射标签,支持对象与数据库的ORM字段关系映射。
    (9)提供对象关系映射标签,支持对象关系组建维护。
    三、MyBatis框架的缺点:

    (1)SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求。
    (2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

    简述Mybatis的运行流程

    第一步:通过Resources加载配置好的mybatis.xml配置文件.

    第二步:然后看第二句话,这句话是关键。我们首先new了一个SqlSessionFactoryBuilder对象,他是SqlSessionFactory的构建者。我们调用了他的build()方法.

    第三步:我们继续往下走,我们最终的目的是获取一个SqlSession对象,现在我们有了一个SqlSessionFactory了,就愉快的生成SqlSession吧.

    第四步:jdk动态代理生成mapper接口的代理对象.

    第五步:通过第四步返回的代理对象的方法调用mapper方法最终执行的方法.

    第六步: 封装查询结果.

    Mybatis核心类:

    SqlSessionFactory:
    每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或通过Java的方式构建出 SqlSessionFactory 的实例。SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,建议使用单例模式或者静态单例模式。一个SqlSessionFactory对应配置文件中的一个环境(environment),如果你要使用多个数据库就配置多个环境分别对应一个SqlSessionFactory。
    
    SqlSession:
    SqlSession是一个接口,它有2个实现类,分别是DefaultSqlSession(默认使用)以及SqlSessionManager。SqlSession通过内部存放的执行器(Executor)来对数据进行CRUD。此外SqlSession不是线程安全的,因为每一次操作完数据库后都要调用close对其进行关闭,官方建议通过try-finally来保证总是关闭SqlSession。
    
    Executor:
    Execounterrevolutionary接口有两个实现类,其中BaseExecutor有三个继承类分别是BatchExecutor(重用语句并执行批量更新),ReuseExecutor(重用预处理语句prepared statement,跟Simple的唯一区别就是内部缓存statement),SimpleExecutor(默认,每次都会创建新的statement)。以上三个就是主要的Executor。通过下图可以看到Mybatis在Executor的设计上面使用了装饰器模式,我们可以用CachingExecutor来装饰前面的三个执行器目的就是用来实现缓存。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    使用 MyBatis 的 mapper 接口调用时有哪些要求

    接口中的方法 与 xml中 匹配

    方法名与 xml中id名相同

    参数类型 与 xml中参数类型相同 id

    返回值 与 xml中返回值相同

    方法能重载 不能重载?

    什么是MyBatis的接口绑定?

    接口绑定,就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定, 我们通过代理对象调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。

    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的功能。

    where

    ​ and age = 10

    jsp

    自定义标签

    Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

    Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。 把一个关联查询 ,拆分为多次查询,需要时,在发出查询,嵌套查询

    它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

    Mybatis的一级、二级缓存

    (1)一级缓存: 其存储作用域为SqlSession,当 SqlSession.flush 或 close 之后,该 SqlSession中的所有 Cache 就将清空,默认打开一级缓存。

    (2)二级缓存与一级缓存其机制相同,其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache .要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置 ;

    当配置了二级缓存后,关闭sqlSession时会将数据写入到二级缓存,下次在新会话中仍然可以从二级缓存中查询到数据.

  • 相关阅读:
    详解OpenCV的窗口滑动条创建控制函数createTrackbar()
    相关性网络图
    MindSpore数据集加载-GeneratorDataset数据处理报错:The pointer[cnode] is null
    【推荐系统】ESMM:一种有效估算后点击转换率的方法
    VMware Workstation求哪位看看我的虚拟机还有救嘛,现在打不开了,有什么办法能解决
    用已安装好的系统级别PsychoPy软件配置Python虚拟环境
    Apache Hudi vs Delta Lake:透明TPC-DS Lakehouse性能基准
    2023年09月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试
    打造千万级流量秒杀第二十八课 性能调优:如何使用 ab 命令和 pprof 分析性能?
    libcurl 库的编译
  • 原文地址:https://blog.csdn.net/m0_53680228/article/details/126917619