Mybatis的核心组件

Mybatis的核心组件分为四个部分:

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

SqlSessionFactory (工厂接口):依靠它来生成 SqlSession,使用的是工厂模式。

SqlSession (会话): 一个既可以发送 SQL 执行返回结果,也可以获取 Mapper 的接 口。在现有的技术中, 一般我们会让其在业务逻辑代码中“消失”,而使用的是 MyBatis 提供的 SQLMapper 接口编程技术,它能提高代码的可读性和可维护性。  

SQL Mapper (映射器): MyBatis 新设计存在的组件,它由一个 Java 接口和 XML 文件(或注解)构成,需要给出对应的 SQL 和映射规则。它负责发送SQL去执行, 并返回结果

SqlSessionFactoryBuilder (构造器)

从上面的图中可以看出,SqlSessionFactory是由SqlSessionFactoryBuilder(构造器)创建的。SqlSessionFactory是一个接口,在Mybatis中它存在两个实现类:SqlSessionManager和DefaultSqlSessionFactory。

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

在 MyBatis中,既可以通过读取配置的 XML 文件的形式生成 Sq!SessionFactory,也可以通过 Java 代码的形式去生成 SqlSessionFactory。强烈推荐采用 XML 的形式,因为代码的方式在需要修改的时候会比较麻烦。

使用 XML 构建 SqlSessionFactory 

在项目成功导入Mybatis依赖包后,就可以创建mybatis配置文件了,新建给一个xml文件,命名为mybatis-config.xml,放在工程类路径下。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <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="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource=""/>
    </mappers>

</configuration>

<environment>元素的定义,这里描述的是数据库。它里面的<transactionManager> 元素是配置事务管理器,这里采用的是 MyBatis 的 JDBC 管理器方式。然后采用 <dataSource>元素配置数据库,其中属性 type=”POOLED”代表采用 MyBatis 内部提 供的连接池方式,最后定义一些关于 JDBC 的属性信息。 

 //使用XML构建SqlSessionFactory
        SqlSessionFactory SqlSessionFactory = null;
        String resource = "mybatis-config.xml";
        InputStream inputStream;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            System.out.println("使用XML构建的SqlSessionFactory"+SqlSessionFactory.hashCode());
            SqlSession sqlSession=SqlSessionFactory.openSession();
            StudentMapper studentMapper=sqlSession.getMapper(StudentMapper.class);
            System.out.println(studentMapper.getStudent(1).toString());

        } catch (IOException e) {
            e.printStackTrace();
        }

首先读取 mybatis-config.xml, 然后通过 Sq!SessionFacto可Builder 的 Builder 方法去创建 SqJSessionFactory。整个过程比较简单,而里面的步骤还是比较烦琐的,只是MyBatis 采用了Builder 模式为开发者隐藏了这些细节。这样一个 SqlSessionFactory 就被创建出来了。 

使用代码创建 SqlSessionFactory

写到这里掉进了坑。。。

使用IDEA创建的mybatis通过mapper接口加载映射文件

//采用MyBatis的JDBC事务方式
//      <transactionManager type="JDBC"/>
        TransactionFactory transactionFactory=new JdbcTransactionFactory();
//      <environments default="development">
        Environment environment=new Environment("development",transactionFactory,dataSource);
        
        
        //创建Configuration对象
        Configuration configuration=new Configuration(environment);
        
        
        //加入一个映射器
//      <mappers>
//        <mapper resource=""/>
//      </mappers>
        configuration.addMapper(StudentMapper.class);
        //使用SqlSessionFactoryBuilder 构建 SqlSessionFactory
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(configuration);
        System.out.println(sqlSessionFactory);

         //定义SqlSession
        SqlSession sqlSession=null;

        try {
            //打开SqlSession会话
            sqlSession = sqlSessionFactory.openSession();
            StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
            Student student = studentMapper.getStudent(1);
            System.out.println(student.toString());
            sqlSession.commit();//提交事务
        }catch (Exception ex){
            sqlSession.rollback();//回滚事务
        }finally {
            //确保资源被顺利关闭
            if(sqlSession!=null) {
                sqlSession.close();
            }
        }

使用代码来创建SqlSessionFactory,就不需要mybatis配置文件,但是还是需要mapper映射文件(其他也可以不用,通过注解的话)

SqlSession 

在 MyBatis 中,SqlSession 是其核心接口 。在MyBatis中有两个实现类,DefaultSqlSession 和 SqlSessionManager。 DefaultSqlSession 是单线程使用的,而 SqlSessionManager 在多线程 环境下使用。 SqlSession 的作用类似于一个 JDBC 中的 Connection 对象,代表着一个连接资源的启用。

具体而言, 它的作用有 3 个:

  • 获取 Mapper 接口
  • 发送 SQL 给数据库
  • 控制数据库事务。 
       //定义SqlSession
        SqlSession sqlSession=null;

        try {
            //打开SqlSession会话
            sqlSession = sqlSessionFactory.openSession();
            StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
            Student student = studentMapper.getStudent(1);
            System.out.println(student.toString());
            sqlSession.commit();//提交事务
        }catch (Exception ex){
            sqlSession.rollback();//回滚事务
        }finally {
            //确保资源被顺利关闭
            if(sqlSession!=null) {
                sqlSession.close();
            }
        }

这里使用 commit 方法提交事务,或者使用 rollback 方法回滚事务。因为它代表着一个 数据库的连接资源,使用后要及时关闭它,如果不关闭,那么数据库的连接资源就会很快被耗费光,整个系统就会陷入瘫痪状态,所以用 finally 语句保证其顺利关闭。 

SQL Mapper (映射器)

映射器是 MyBatis 中最重要、最复杂的组件,它由一个接口和对应的XML文件(或注解〉组成。

它可以配置以下内容:

  • 描述映射规则。
  • 提供 SQL 语旬, 并可以配置 SQL 参数类型、返回类型、缓存刷新等信息。
  • 配置缓存。
  • 提供动态 SQL。

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

用 XML 实现映射器

用 XML 定义映射器分为两个部分: 接口和 XML。

先定义一个映射器接口

SqlSession 发送 SQL

selectOne 方法表示使用查询并且只返回一个对象,而参数则是一个 String 对象和一个 Object 对象。这里是一个 long 参数, long 参数是它的主键。
String 对象是由一个命名空间加上 SQL id 组合而成的,它完全定位了一条 SQL, 这样 MyBatis就会找到对应的 SQL。如果在 MyBatis 中只有一个 id 为 getStudent 的SQL, 那么也可以简写为 :

//使用SqlSession发送SQL
 Student student=(Student)sqlSession.selectOne("getStudent",1L);

用 Mapper 接口发送 SQL(推荐方式)

 //用 Mapper 接口发送 SQL
 Student student = studentMapper.getStudent(1);

通过 SqlSession 的 getMapper 方法来获取一个 Mapper 接口 ,就可以调用它的方法了。 因为 XML 文件或者接口注解定义的 SQL 都可以通过“类的全限定名+方法名”查找,所 以 MyBatis 会启用对应的 SQL 进行运行,并返回结果。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值