Mybatis相关知识(1)

这篇具有很好参考价值的文章主要介绍了Mybatis相关知识(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Mybatis相关知识

1 Mybatis介绍
Mybatis 是一个==半 ORM(对象关系映射)==框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高

上面提到了半ORM框架,那么和全自动ORM框架区别在哪
答: 全自动ORM框架以Hibernate为例,Hibernate是全自动的ORM映射工具,使用Hibernate查询的关联对象或者关联集合对象时,根据对象关系模型直接获取
而Mybatis在查询关联对象或者关联集合对象时,需要手动编写SQL来完成,因此是半自动ORM的框架

Mybatis和Hibernate的适用场景:
Hibernate 是重量级框架,适合于需求相对稳定,中小型的项目
MyBatis 是轻量级框架,适合于需求变化频繁,大型的项目

2 Mybatis优势和劣势
优势:
基于SQL语句编程,灵活,不会对应用程序或者数据库的现有设计造成任何影响,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用
与JDBC相比,消除了JDBC大量冗余的代码不需要手动开关连接很好的与各种数据库兼容
提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护
能够与Spring和其他框架很好的集成

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

后来,有更为强大的mybatis-plus,在此基础上做了增强,在开发中也得到了使用。

3 适用mybatis的步骤:
(1) 创建SqlSessionFactory
(2)通过SqlSessionFactory创建SqlSession
(3) sqlsession执行数据库操作
(4) session.commit()提交事务
(5) session.close()关闭会话

4 Mybatis的工作原理
第一步: 读取mybatis配置文件,mybatis-config.xml文件
第二步: mybatis-config.xml文件加载了项目程序的mapper文件,对应的xml文件。
第三步: 创建SqlSessionFactory
第四步: 通过SqlSessionFactory创建SqlSession
第五步: 执行器Executor
第六步: MapperedStatement对象
第七步: 输入参数类型,比如实体对象,基本数据类型等。
第八步: MapperedStatement对象将参数,执行数据库持久化操作,输出结果映射

下面将用一个案例配套步骤进行讲解:
首先,得建立一个数据库,我这里数据库是babytun,里面有几张表商品表,商品种类表等。对应的java实体类是Goods和Category。
好来看mybatis-config.xml文件里面配置的内容

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <settings>
        <!-- 将数据库类似于goods_id转换为goodsId,和我们在实体类中的字段一致-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <!--启用分页插件 -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <property name="helperDialect" value="mysql"/> <!--分页插件自动检测数据库链接 mysql -->
            <property name="reasonable" value="true"/> <!-- 分页合理化-->
        </plugin>
    </plugins>

    <environments default="dev"> <!-- 设置默认指向的数据库 -->
        <environment id="dev"> <!--配置环境,不同的环境不一样的id,dev开发环境,prd生产环境 -->
            <!-- 采用jdbc方式对数据库事务进行commit/rollback -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 采用连接池管理数据库连接,这是mybatis自带的连接池 -->
            <!--<dataSource type="POOLED"> -->
            <!-- 采用c3p0的数据库连接池 -->
            <dataSource type="com.mybatis.datasource.C3p0DataSourceFactory">
                <property name="driverClass" value="com.mysql.jdbc.Driver"/>
                <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/babytun?"/>
                <property name="user" value="root"/>
                <property name="password" value="root"/>
                <property name="initialPoolSize" value="5"/>
                <property name="maxPoolSize" value="20"/>
                <property name="minPoolSize" value="5"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="mappers/goods.xml"/>
    </mappers>

</configuration>

主要是配置实体类和数据库表驼峰转换,分页插件和数据源信息,mappers节点配置了对应Goods实体的xml文件即goods.xml。当然goods.xml就是操作和Goods相关的SQL。

来到第三步: 因为涉及创建会话,关闭会话,我们将这些方法封装到一个文件,方便调用。即文件MybatisUils.java。内容如下:

public class MybatisUils {
    //利用static保证SqlSessionFactory全局唯一;
    private static SqlSessionFactory sqlSessionFactory = null;
    //利用static块在初始化类时实例化sqlSessionFactory;
    static {
        Reader reader = null;
        try {
            reader = Resources.getResourceAsReader("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
            //初始化错误时,通过抛出异常通知调用者;
            throw new ExceptionInInitializerError(e);
        }
    }

    public static SqlSession openSession(){ //创建新的SqlSession对象;
        return sqlSessionFactory.openSession();
    }

    public static void CloseSession(SqlSession session){ //关闭SqlSession;
        if(session!=null){
            session.close();
        }
    }
}

此外,我们这里用的是c3p0数据源,这里创建了一个数据源工厂类C3p0DataSourceFactory

/*
c3p0和mybatis兼容使用的数据源工厂类;
 */
public class C3p0DataSourceFactory extends UnpooledDataSourceFactory {
    public C3p0DataSourceFactory(){
        this.dataSource = new ComboPooledDataSource();
    }

}

来到第五步和后续步骤:
需要写一个方法,用mybatis完成对数据库的查询。
首先,比如完成对数据库goods表的全部查询。

@Test
    public void testSelectAll(){
        SqlSession session = null;
        try {
            session = MybatisUils.openSession();
            List<Goods> list = session.selectList("goods.selectAll"); 
            //goods.xml中的namespace="goods" select id="selectAll"相对应;
            for(Goods good:list){
                System.out.println(good.getTitle());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            MybatisUils.CloseSession(session);
        }
    }

然后在goods.xml中写入对应的SQL,注意命名空间和方法保持一致。 id和后端的selectAll保持一致,而且在同一个xml文件中,方法id不要重名。 SQL语句如下,查询前十条商品按照id降序显示。 resultType就是上面的第八步,结果映射到实体。useCache表示是否适用缓存。 useCache=“false” 代表不使用缓存

<mapper namespace="goods">
 <select id="selectAll" resultType="com.mybatis.entity.Goods" useCache="false">
        select * from t_goods order by goods_id desc limit 10
    </select>
</mapper>

提到了缓存,mybatis有一级缓存和二级缓存。
一级缓存是SqlSession级别的缓存,默认开启
二级缓存是NameSpace级别(Mapper)的缓存,多个SqlSession可以共享,使用时需要进行配置开启。
缓存的查找顺序:二级缓存 => 一级缓存 => 数据库

从上面可以看到,二级缓存开启可以提高查询效率,减少数据库的访问次数,提高系统性能和响应速度。

怎么开启二级缓存呢?
这里可以在全局mybatis-config.xml配置,当然也可以在单个xml文件配置,例如,我这里在goods.xml配置。
在和 之间配置以下内容。一般放在SQL节点前。配置后的完整的goods.xml如下
相关参数,见下面的解释。

<mapper namespace="goods">
 <cache eviction="LRU" flushInterval="600000" size="512" readOnly="true"/> <!--开启二级缓存 -->
    <!--
        eviction 清除策略,当缓存对象数量达到上限时,自动触发对应算法对缓存对象清除;
        LRU:最近最久未使用,移除最长时间不被使用的对象;
        FIFO:先进先出;
        SOFT:软引用;移除基于垃圾收集器状态和如软引用规则的对象;
        WEAK:弱引用; 更积极的移除基于垃圾收集器状态和弱引用规则的对象;
        
        flushInterval="600000" 缓存清除间隔;单位毫秒;
        size="512" 缓存存储上限,用于保存对象或者集合的数量上限;
        readOnly true 只读缓存,每次从缓存取出的是缓存对象本身,执行效率高;
                 false 每次从缓存取出的是缓存对象的"副本“,执行效率不高,安全性高;
    -->
    <!--  useCache="false"  代表不使用缓存 -->
    <select id="selectAll" resultType="com.mybatis.entity.Goods" useCache="false">
        select * from t_goods order by goods_id desc limit 10
    </select>
</mapper>

当然此刻,想必有同学注意到上面八个步骤,第五步和第六步貌似没有讲,因为这是框架完成的,那接下来讲Executor和MapperedStatement对象。

Executor:是执行器。
Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor
SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象。
BatchExecutor:执行update没有select,将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。

那么Mybatis中如何指定使用哪一种Executor执行器呢?
在Mybatis配置文件中,可以指定默认的ExecutorType,也可以手动给DefaultSqlSessionFactory的创建SqlSession的方法传递ExecutorType类型参数,如SqlSession openSession(ExecutorType execType)。配置默认的执行器。SIMPLE 就是普通的执行器REUSE 执行器会重用预处理语句BATCH 执行器将重用语句并执行批量更新

MapperedStatement对象
Mybatis将所有Xml配置信息都封装到All-In-One对象Configuration内部。在Xml映射文件中,标签会被解析为ParameterMap对象,其每个子元素会被解析为ParameterMapping对象。标签会被解析为ResultMap对象,其每个子元素会被解析为ResultMapping对象。每一个select insert delete update 标签均会被解析为MappedStatement对象,标签内的sql会被解析为BoundSql对象

5 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的具体SQL语句的书写及其注意事项。文章来源地址https://www.toymoban.com/news/detail-495974.html

到了这里,关于Mybatis相关知识(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PCIe基础知识及Xilinx相关IP核介绍

    补发以下以前学习PCIe总结的知识。 PCIe学习笔记系列: PCIe基础知识及Xilinx相关IP核介绍 概念了解:简单学习PCIe的数据链路与拓扑结构,另外看看有什么相关的IP核。 【PG054】7 Series Integrated Block for PCI Express IP核的学习 基础学习:关于Pcie IP核的数据手册,学习PCIe相关的IP核的

    2024年02月02日
    浏览(42)
  • Web 应用程序防火墙 (WAF) 相关知识介绍

    Web应用程序防火墙 (WAF) 如何工作? Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称:WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。 WAF通过过滤、监控和

    2024年02月06日
    浏览(50)
  • 嵌入式机器人系统ROS入门相关知识点介绍

    本文旨在收集整理linux系统、ROS系统、树莓派、ssh软件的相关基础知识。 重点是ROS系统相关的知识,根据该实验课程的要求,最后修改的代码,都是由ROS组织起来,运行在ROS环境下的。 1、ssh软件–mobaXterm ssh:SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接

    2024年02月06日
    浏览(44)
  • 嵌入式硬件基础知识汇总<附带与硬件密切相关的软件介绍>

    工作知识学习及总结系列文档 本文主要记录学习嵌入式软硬件编程过程中的一些硬件基础知识 嵌入式微控制器MCU ,又称单片机,一般以某微处理器内核为核心,芯片集成多种部件,功能和外设,如8051系列。其最大的特点是单片化,体积大大减小,功耗和成本下降,可靠性提

    2024年02月02日
    浏览(43)
  • 位bit,字节byte,K,M,G的相关知识介绍

    字节是由8个位所组成,可代表一个字符(A~Z)、数字(0~9)、或符号(,.?!%+-*/),是内存储存数据的基本单位。 1 byte = 8 bit 1 KB = 1024 bytes =210 bytes 1 MB = 1024 KB = 220 bytes 1 GB = 1024 MB = 230 bytes 位:“位(bit)”是电子计算机中最小的数据单位。每一位的状态只能是0或1。 字节:8个二进制位构

    2024年02月08日
    浏览(35)
  • Tensorflow2.0中function(是1.0版本的Graph的推荐替代)的相关知识介绍

    在 Tensorflow无人车使用移动端的SSD(单发多框检测)来识别物体及Graph的认识 中我们对 Graph 这个计算图有了一定的了解,也知道了它具备的优点: 性能做了提升,可以并行处理以及由于它是一种数据结构,可以在非Python环境中进行交互。 我们先来看下自己的tensorflow的版本: 

    2024年02月15日
    浏览(37)
  • 第十篇【传奇开心果系列】Ant Design Mobile of React 开发移动应用:涉及到的相关基础知识介绍和示例

    第一篇【传奇开心果系列】Ant Design Mobile of React 开发移动应用:从helloworld开始 第二篇【传奇开心果系列】Ant Design Mobile of React 开发移动应用:天气应用 第三篇【传奇开心果系列】Ant Design Mobile of React 开发移动应用:健身追踪 第四篇【传奇开心果系列】Ant Design Mobile of React 开发移

    2024年01月20日
    浏览(50)
  • 推荐系统[一]:超详细知识介绍,一份完整的入门指南,解答推荐系统相关算法流程、衡量指标和应用,以及如何使用jieba分词库进行相似推荐,业界广告推荐技术最新进展

    搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目

    2024年02月13日
    浏览(55)
  • MyBatis关联映射相关习题

    一、单选题 1、下列属性中,不属于association元素属性的是()。 A、property B、select C、ofType D、autoMapping 正确答案:C ofType是collection元素特有的属性 2、下列关于foreach元素的collection属性的说法正确的是()。 A、collection属性可有可无 B、collection属性值在任何情况下的取值都是

    2023年04月27日
    浏览(69)
  • MyBatis配置文件 —— 相关标签详解

    目录 相关导读 一、Mybatis配置文件 — properties标签 二、Mybatis配置文件 — settings标签

    2023年04月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包