zoukankan      html  css  js  c++  java
  • MyBatis概述

    什么是MyBatis?

      我们可以从MyBatis官网上来查到MyBatis的简介(在这里分享一下我对于学一个框架的见解,我觉得第一步应该是去框架官网上看它的介绍的第一句话,来了解它到底是个什么东西,而不是上去直接百度),在这里翻译一下。

      1、Mybatis是一个一流的持久化框架,它支持定制化SQL、存储过程和高级映射。(是什么)

      2、MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。(优势)

      3、MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。(怎么做的)

      第一句话就是概念,我们在介绍MyBatis的时候可以直接用。然后是第二句话,这是MyBatis相比较JDBC的明显优势所在,比如说我们想对数据库进行一个插入的操作,可以分别贴一下两种方法的代码

    //JDBC方式进行插入
    public
    static int insert(Test test) throws SQLException { Connection connection = null; PreparedStatement preparedStatement = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC", "root", "123456"); connection.setAutoCommit(false); preparedStatement = connection.prepareStatement("INSERT INTO test VALUES (?,?,?)"); if (null != test.getId()) { preparedStatement.setInt(1, test.getId()); } else { preparedStatement.setNull(1, INTEGER); } preparedStatement.setInt(2, test.getNums()); preparedStatement.setString(3, test.getName()); connection.commit(); return preparedStatement.executeUpdate(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (null != connection) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } return 0; }
    //MyBatis方式进行插入
    public static int insert(SqlSession sqlSession, Test test) {
            TestMapper testMapper = sqlSession.getMapper(TestMapper.class);
            return testMapper.insert(test);
        }

      通过上面两段代码的展示,我觉得什么都不用说了,无论是复杂性和可读性,MyBatis的优势都太明显了。

    MyBatis的使用

    (1)xml文件

      可以通过Generator来自动生成代码,但是代码里可能有一些乱七八糟的注释,配置Generator的方式的过程可以简单说一下,配置它主要是先在pom文件中配置plugin,然后通过GeneratorConfig.XML文件来进行,不过我不是很提倡这种,因为对于后续的维护和回滚有很大影响,不过也有解决办法,就是你创建两个项目,一个负责Generator,一个是你的主项目,可以拷贝Generator里生成的文件。

      然后配置mapper.xml文件,在里面定义Bean、写SQL语句。

     (2) Annotation

      主要就是通过注解来操作,比如说通过@Select写SQL语句。

      我个人还是比较倾向于第一种,目前也只用过第一种。但是看了网上的相关博客之后,觉得这两种模式各有利弊,可以把他们俩的优劣势列出来

      优势 劣势
    Mapper.xml

    (1)跟接口分离,统一管理

    (2)不会直接看到复杂的SQL语句,从而提高代码可读性

    通常需要操作多个XML文件
    Annotation 通过注释就可以看到具体的SQL语句 代码可读性差

     MyBatis-Config.xml文件解析

      我们通过MyBatis-config.xml文件来控制MyBatis的使用,主要是控制properties和settings来进行的。

    properties 

      首先是properties,我们通过它来设置我们的DataSource,也就是数据源,我们用的哪个数据库、数据库账号和密码等一些信息都在这设置

    <dataSource type="UNPOOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                    <property name="username" value="root"/>
                    <property name="password" value="11111111"/>
    </dataSource>

      我们也可以通过传入属性到SqlSessionFactory里来进行控制,但是和在Mapper接口中写方法的两种方式(直接写和通过使用XML文件,两者可以并存,但只能是互补关系,不然会报错)不同的是,这样是可以覆盖的,因此MyBatis官方定义了他们的优先级:

    如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:

    • 在 properties 元素体内指定的属性首先被读取。
    • 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
    • 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。

    因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性。

    settings

      这个是设置MyBatis的一些默认行为,他应该怎样准备,怎样工作,怎样结束,涉及到许多scope,我就不在这一一罗列了,具体的可以参考MyBatis官网的XML配置 

    TypeHandlers

      这也是一个比较重要的点,在写这篇文章的时候,我对于他的理解,就是它可以帮助我们在Javatype和JDBCtype之间作了一个桥梁,可以让我们的数据类型在写入的时候不会出错。MyBatis内部自己定义了许多的TypeHandlers,我们也可以自己定义。

    Mappers

      既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等。例如:

    <!-- 使用相对于类路径的资源引用 -->
    <mappers>
      <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
      <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
      <mapper resource="org/mybatis/builder/PostMapper.xml"/>
    </mappers>
    <!-- 使用完全限定资源定位符(URL) -->
    <mappers>
      <mapper url="file:///var/mappers/AuthorMapper.xml"/>
      <mapper url="file:///var/mappers/BlogMapper.xml"/>
      <mapper url="file:///var/mappers/PostMapper.xml"/>
    </mappers>
    <!-- 使用映射器接口实现类的完全限定类名 -->
    <mappers>
      <mapper class="org.mybatis.builder.AuthorMapper"/>
      <mapper class="org.mybatis.builder.BlogMapper"/>
      <mapper class="org.mybatis.builder.PostMapper"/>
    </mappers>
    <!-- 将包内的映射器接口实现全部注册为映射器 -->
    <mappers>
      <package name="org.mybatis.builder"/>
    </mappers>

      这些配置会告诉了 MyBatis 去哪里找映射文件,剩下的细节就应该是每个 SQL 映射文件了,也就是接下来我们要讨论的。

  • 相关阅读:
    Codeforces Round #644 (Div. 3)(A~G)
    【】BZOJ3687: 简单题(dp+bitset)
    [LeetCode] 275. H-Index II
    [LeetCode] 1028. Recover a Tree From Preorder Traversal
    [LeetCode] 1014. Best Sightseeing Pair
    [LeetCode] 468. Validate IP Address
    [LeetCode] 701. Insert into a Binary Search Tree
    [LeetCode] 658. Find K Closest Elements
    [LeetCode] 787. Cheapest Flights Within K Stops
    [LeetCode] 1300. Sum of Mutated Array Closest to Target
  • 原文地址:https://www.cnblogs.com/Jolivan/p/9085131.html
Copyright © 2011-2022 走看看