MyBatis概述

Posted jolivan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 映射文件了,也就是接下来我们要讨论的。




以上是关于MyBatis概述的主要内容,如果未能解决你的问题,请参考以下文章

SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper

MyBatis-05-笔记

MyBatis:动态sql语句

markdown [mybatis参考]关于mybatis #mybatis的一些片段

13.1 MyBatis Generator概述(MyBatis Generator逆向代码生成工具) -《SSM深入解析与项目实战》

Mybatis -- 动态Sql 环境搭建