MyBatis笔记(一):MyBatis的由来

1.MyBatis介绍

        MyBatis 本是 Apache 的一个开源项目 iBatis,2010年这个项目由 Apache Software Foundation 迁移到了Google Code,并且改名为 MyBatis 。2013年11月迁移到 Github。

       iBatis一词来源于 "internet""abatis"的组合,是一个基于Java的持久层框架。iBatis 提供的持久层框架包括 SQL Maps 和 Data Access Objects(DAO)。

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

        当前,最新版本是MyBatis 3.5.4 ,其发布时间是2020年2月4日。MyBatis 官网:官网地址。以上内容呢介绍来自:百度百科

2.MyBatis前世

  在 MyBatis 等 ORM 框架之前,我们连接数据库完成操作,使用的都是 JDBC ,JDBC 连接数据库步骤如下:

  1. 注册驱动,获取连接;
  2. 创建 Statement对象;
  3. 编写 SQL 语句;
  4. execute()方法执行SQL;
  5. 关闭资源连接。

  JDBC 能够满足我们连接数据库获取查询的需求,但是当项目复杂时,直接使用 JDBC 原生API会带来哪些问题呢?

  1. 代码重复的问题;
  2. 查询返回结果集处理困难的问题;
  3. 资源连接管理的问题;
  4. 代码耦合高,SQL语句必须写在代码中的硬编码问题,;
  5. 事务管理的问题。

      针对以上问题,使用原生 JDBC 开发导致的各种不爽,由此衍生出了出了一些工具类、框架。比如:Apache DBUtils、Spring JDBC、Hibernate、MyBatis等。在我们日常工作作风,我们又该如何选择这些ORM框架呢?

  1. 业务简单的项目可以使用 Hibernate;
  2. 需要灵活的 SQL ,可以使用 MyBatis;
  3. 对性能要求高,可以使用 JDBC;
  4. Spring JDBC 可以和 ORM 框架混用;
  5. 不推荐 Hibernate 和 MyBatis 框架混用(有的公司会这么搞,哈哈)

3.MyBatis今生

3.1 MyBatis特性

  1. 使用连接池对连接进行管理;
  2. SQL 和代码分离,集中管理;
  3. 参数映射和动态SQL;
  4. 结果集映射;
  5. 缓存管理;
  6. 重复SQL通过SQL片段提取复用;
  7. 插件机制;

3.2 MyBatis 四大核心对象

1. SqlSessionFactoryBuilder

        这个类用来创建 SqlSessionFactory。它可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但是最好还是不要让其一直存在,以保证所有的 XML 解析资源可以被释放给更重要的事情。

2. SqlSessionFactory

       SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码"坏味道(bad smell)"。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,常见的就是使用单例模式来创建。

3. SqlSession

       每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 每次收到 HTTP 请求,就打开一个 SqlSession,当返回一个响应时,就关闭它。 这个关闭操作是很重要的,你应该把这个关闭操作放到 finally 块中以确保每次都能执行关闭。

4. Mapper

       Mapper 映射器是一些由你创建的、绑定你映射的语句的接口。映射器接口的实例是从 SqlSession 中获得的。

3.3 MyBatis编程式开发

3.3.1 前期 MyBatis 开发

@Test
public void testSelect() throws Exception{
    //配置文件所在路径
    String resource = "mybatis/mybatis-config.xml";
    //读取MyBatis配置文件,转换成InputStream
    InputStream readerStream = Resources.getResourceAsStream(resource);
    //创建一个SqlSessionFactory
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(readerStream);
    //创建一个SqlSession会话
    SqlSession sqlSession = sqlSessionFactory.openSession();

    try {
        //1.MyBatis 在最开始,是直接通过sqlSession 封装好的方法进行调用
        //com.springboot.dao.UserMapper.selectUserById:为映射器中定义的路径
        //缺点: 硬编码问题
        User user = (User) sqlSession.selectOne("com.springboot.dao.UserMapper.selectUserById", 1);
        System.out.println(user);
    } finally {
        sqlSession.close();
    }
}

3.3.2 现在常用的 MyBatis 开发

@Test
public void testSelect() throws Exception{
    //配置文件所在路径
    String resource = "mybatis/mybatis-config.xml";
    //读取MyBatis配置文件,转换成InputStream
    InputStream readerStream = Resources.getResourceAsStream(resource);
    //创建一个SqlSessionFactory
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(readerStream);
    //创建一个SqlSession会话
    SqlSession sqlSession = sqlSessionFactory.openSession();

    try {
        //2.如下为使用getMapper()方法,执行操作。
        // MyBatis 定义了一个 getMapper() 方法,用来解决框架初期的硬编码问题,
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user1 = userMapper.selectUserById(1);
        System.out.println(user1);
    } finally {
        sqlSession.close();
    }
}
发布了301 篇原创文章 · 获赞 66 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/lzb348110175/article/details/104568924