Mybatis

作者: Zeppelin421 | 来源:发表于2023-01-28 10:18 被阅读0次

    [官网] https://mybatis.org/mybatis-3/zh/index.html

    简介

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

    历史

    Mybatis 本是 Apache 的一个开源项目 iBatis,2010年6月这个项目由 Apache Software Foundation 迁移到了Google Code,随着开发团队转投 Google Code 旗下,ibatis3.x 正式更名为 Mybatis,代码于2013年11月迁移到 Github。

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

    基本应用

    构建 SqlSessionFactory
    • 通过 XML 构建
    // BlogMapper.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="org.mybatis.example.BlogMapper">
        <select id="selectBlog" resultType="Blog">
            select * from Blog where id = #{id}
        </select>
    </mapper>
    
    // mybatis-config.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "https://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url}"/>
                    <property name="username" value="${username}"/>
                    <property name="password" value="${password}"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="org/mybatis/example/BlogMapper.xml"/>
        </mappers>
    </configuration>
    
    private SqlSessionFactory buildSqlSessionFactoryFromXml(String resourcePath) throws IOException {
        InputStream inputStream = Resources.getResourceAsStream(resourcePath);
        return new SqlSessionFactoryBuilder().build(inputStream);
    }
    
    • 通过 Java 构建
    private SqlSessionFactory buildSqlSessionFactory() {
        DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
        TransactionFactory transactionFactory = new JdbcTransactionFactory();
        Environment environment = new Environment("development", transactionFactory, dataSource);
        Configuration configuration = new Configuration(environment);
        configuration.addMapper(BlogMapper.class);
        return new SqlSessionFactoryBuilder().build(configuration);
    }
    
    获取 SqlSession

    SqlSession 提供了在数据库执行 SQL 命令所需的所有方法

    • 通过 SqlSession 实例来直接执行已映射的 SQL 语句
    SqlSession sqlSession = sqlSessionFactory.openSession();
    Blog blog = (Blog) sqlSession.selectOne("org.mybatis.example.BlogMapper.selectBlog", 1);
    
    • 通过接口来执行
    SqlSession sqlSession = sqlSessionFactory.openSession();
    BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
    Blog blog = mapper.selectBlog(1);
    
    作用域和生命周期
    • SqlSessionFactoryBuilder
      SqlSessionFactoryBuilder 的最佳作用域是方法作用域。可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好不要一直保留,以保证所有的 XML 解析资源可以被释放给更重要的事。
    • SqlSessionFactory
      SqlSessionFactory 的最佳作用域是应用作用域。SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,不要重复创建多次。
    • SqlSession
      SqlSession 的最佳作用域是请求或方法作用域。每个线程都应该有它自己的 SqlSession 实例,因为SqlSession实例不是线程安全的,因此不能被共享。绝对不能将 SqlSession实例的引用放在类的静态域、类的实例变量、任何类型的托管作用域(例如Servlet的HttpSession)。在Web框架中,每次收到HTTP请求就可以打开一个SqlSession,返回一个响应后就关闭它。
    • 映射器实例
      映射器是一些绑定映射语句的接口。映射器接口的实例是从SqlSession中获得的,从技术层面上来讲,任何映射器实例的最大作用域与请求它们的SqlSession相同。但方法作用域才是映射器实例的最合适的作用域。

    配置详解

    Config 配置
    Mapper 配置

    深入理解

    源码剖析
    手动实现

    相关文章

      网友评论

          本文标题:Mybatis

          本文链接:https://www.haomeiwen.com/subject/goeyhdtx.html