• mybatis总结(一)(mybatis的基本定义介绍)


    jdbc方式连接数据库的缺点

     

    首先看下面传统jdbc方式连接数据库的方式,可以看出这种方式有如下缺点:

    1. 每次都需要重新连接,执行sql之后,还要及时的关闭连接,频繁的连接,对数据库会造成很大的负担。

    2. 代码里写sql,属于硬编码,不利于代码的维护和更新。

    解决上面两个问题的思路如下:

    1. 使用数据库连接池管理数据库连接。

    2. 将sql语句配置在xml文件中,即使sql变化,也不需要对java代码重新编译。

    所以由此我们开始学习mybatis。

     1         String Url="jdbc:mysql://127.0.0.1:3306/xdclass?useUnicode=true&characterEncoding=utf-8"; //定义连接mysql的url
     2         String User="root";//定义连接mysql的用户名
     3         String Password="123456";//定义连接mysql的密码
     4         Class.forName("com.mysql.jdbc.Driver");//加载mysql驱动程序
     5         Connection con=DriverManager.getConnection(Url,User,Password); //获取数据库链接
     6         Statement st=con.createStatement();//创建执行对象
     7         ResultSet rs=st.executeQuery("select name from tablename");//执行sql返回结果
     8         while (rs.next()){//遍历返回结果(使用ResultSet类)
     9             System.out.println(rs.getString("name"));
    10         }
    11         //关闭资源 真实业务中,需要写try catch 这里暂时省略
    12         rs.close();
    13         st.close();
    14         con.close();            

     

    mybatis的定义

    百度百科中对其的定义为:

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

    简单理解:

    mybatis本质就是一个半自动的ORM框架,用于和数据库交互。在编码的过程中,只需要一个接口和xml就可以创建映射器,让程序员们可以专注于业务逻辑。

    持久层的含义:

    1. 持久层可以将业务数据存储到磁盘,具备长期存储能力(只要磁盘不损坏)。

    2. 持久层可以使用巨大的磁盘控件,并且也较为廉价,就是比较慢(相对于内存)。

     

    mybatis和jdbc的区别

     

    mybatis和hibernate的区别

     

    1. hibernate是自动的(它有良好的映射机制,针对高级查询,不用手动写sql)。mybatis是半自动的(针对高级查询,必须手动写sql和resultMap)。所以开发量:mybatis>hibernate。

    2. hibernate默认查表中所有列,而mybatis是指定查哪列。所以优化性上:mybatis>hibernate。

    3. hibernate自带日志统计。mybatis要依赖于log4j实现。

    mybatis的工作原理

    1. 读取mybatis的全局配置文件(mybatis-config.xml 名称不固定)从中获取参数信息后(数据源、事务、映射文件mapper等)加载到内存中。

    2. 由会话工厂sqlSessionFactory根据获取到的数据库信息创建出访问数据库所需要的sqlSession会话对象。

    3. sqlSession对象调用executor接口进行对数据库的操作(sqlSession对象不能够直接操作数据库)。

    4. 执行器会根据配置和sqlSession对象中的信息查找到对应的mapper.xml执行相应的语句。

    5. mapped statement(底层封装对象)会查找对应mapper.xml中对应的id的sql执行语句,根据 输入参数+sql语句 执行数据库操作后,返回对应的输出结果。

    mybatis的核心组件

     

    1. SqlSessionFactoryBuilder:(构造器),它会根据配置或者代码来生成SqlSessionFactory,采用的是分步构建的Builder模式。

    2. SqlSessionFactory:(工厂接口)生成SqlSession,使用的是工厂模式。

    3. SqlSession:(会话)既可以发送sql给数据库执行并返回结果,也可以获取Mapper的接口。(现在基本不用,而改成使用下面的SQL Mapper来实现功能)

    4. SQL Mapper:(映射器)由一个java接口和xml文件(或注解)构成,需要给出对应的sql和映射规则。它负责发送sql去执行并返回结果。

    如图:

    SqlSessionFactory

    在mybatis中,生成SqlSessionFactory的方式有两种:

    1. 通过读取配置xml文件的形式。(建议)

    2. 通过java代码的形式。

    SqlSessionFactory是一个接口,它有两个实现类:SqlSessionManager和DefaultSqlSessionFactory,一般而言,具体是由DefaultSqlSessionFactory去实现的,而SqlSessionManager使用在多线程的环境中,它的具体实现依靠DefaultSqlSessionFactory。

    每个基于MyBatis的应用都是以一个SqlSessionFactory的实例为中心的,而SqlSessionFactory唯一的作用就是生产MyBatis的核心接口对象SqlSession,所以它的责任是唯一的。我们往往会采用单例模式去处理它。

    SqlSession

    在MyBatis中,SqlSession是其核心接口。它有两个实现类:DefaultSqlSession和SqlSessionManager。DefaultSqlSession是单线程使用的,SqlSessionManager是多线程下使用的。

    SqlSession的作用类似于一个JDBC中的Connection对象,代表着一个连接资源的启用。

    不过要注意:SqlSession只是一个门面接口,拿公司来说,类似于产品经理得角色,而实际干活的是Executor。

    具体作用:

    1. 获取Mapper接口。2. 发送SQL给数据库。3. 控制数据库事务。

    它的创建方法为:

    1 SqlSession sqlSession = SqlSessionFactory.openSession();

    映射器

    映射器是MyBatis中最重要、最复杂的组件,它由一个接口和对应的xml文件(或注解)组成,它可以配置以下内容:

    1. 描述映射规则。

    2. 提供SQL语句,并可以配置SQL参数类型、返回类型、缓存刷新等信息。

    3. 配置缓存。

    4. 提供动态SQL。

    映射器的主要作用就是将SQL查询到的结果映射为一个pojo,或者将pojo的数据插入到数据库中,并定义一些缓存等的重要内容。

    实现映射器的两种方式:用XML实现,用注解实现。如果这两种同时定义,以XML为主,我们在开发的时候,也推荐使用XML的方式。

    发送SQL

    mybatis发送sql一共分为两种形式:

    1. SqlSession发送SQL。2. Mapper接口发送SQL。(建议)

    各个组件的生命周期

    1. SqlSessionFactoryBuilder:创建完SqlSessionFactory就失去了作用,所以它只能存在于创建SqlSessionFactory的方法中。

    2. SqlSessionFactory:它可以被认为是一个数据库连接池,所以一旦创建了它,就要长期保存,可以认为它的生命周期=mybatis的应用周期。但是如果创建了多个,那么就相当于存在多个连接池,容易耗光数据库资源,所以我们希望它是单例的,在应用中被共享。

    3. SqlSession:相当于一个数据库连接,所以它存在于一个业务请求中,业务处理完毕之后,关闭这条连接。一般我们需要使用try catch finally来保证其关闭。

    4. Mapper:它是一个接口,由SqlSession创建,所以它的生命周期应该小于等于SqlSession,可以理解成,它存在于一个请求中,一旦处理完业务了,就废弃它。

    参考:

    1. https://blog.csdn.net/Logicr/article/details/81462821

    2. javaEE互联网轻量级框架整合开发SSM框架和Redis实现(书) 

    本文章仅用于个人学习总结,如果有侵权行为,联系必删!

    持续更新!!!

  • 相关阅读:
    Step by Step To Create a K8S Cluster
    Linux简单操作指令
    安装redis 最新版 redis-6.2.6
    GCC升级到11.2.0
    SQL开窗函数
    SQL 树形结构递归查询
    一文详解python的类方法,普通方法和静态方法
    _new_()与_init_()的区别
    关于Python的import机制原理
    【原创】android内存管理-hprof文件
  • 原文地址:https://www.cnblogs.com/flyinghome/p/12335736.html
Copyright © 2020-2023  润新知