MyBatis


title: MyBatis
tags:

  • MyBatis
  • 持久层框架
    cover: ‘https://cdn.jsdelivr.net/gh/yang-sir-one/yangimg/MyBatis.jpg’
    abbrlink: 46721
    date: 2022-04-11 09:52:22

一、关于MyBatis

  持久层可以将业务数据存储到磁盘,具备长期存储能力,只要磁盘不损坏(大部分的重要数据都会有相关的备份机制),在断电或者其他情况下,重新开启系统仍然可以读取这些数据。

   Mybatis 是一个优秀的持久层框架,它对 jdbc 的操作数据库的过程进行封装,使得开发者只需要专注 于 SQL 语句本身,而不用去关心注册驱动,创建 connection 等 Mybatis 通过 xml 文件配置或者注解的方式将要执行的各种 statement 配置起来,并通过 java 对象 和statement中的sql进行映射成最终执行的sql语句,最后由Mybatis框架执行sql并将结果映射成java 对象并返回。

   不屏蔽 SQL 意味着可以更为精确地定位 SQL 语句,可以对其进行优化和改造, 这有利于互联网系统性能的提高,符合互联网需要性能优化的特点。

  并且它提供强大、灵活的映射机制 ,方便 Java 开发者使用 。提供动态 SQL 的功能,允许 我们根据不同条件组装 SQL ,这个功能远比其他工具或者 Java 编码的可读性和可维 护性高得多,满足各种应用系统的同时也满足了需求经常变化的互联网应用的要 求。

  在MyBatis 中,提供了使用 Mapper 的接口编程,只要 个接口和 XML 就能创 建映射器,进一步简化我们的工作,使得很多框架 API MyBatis 中消失,开发者 能更集中于业务逻辑 。

二、MyBatis的核心组件

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

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

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

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

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

三、使用XML构建SQLSessionFactory

  在MyBatis中的XML文件分为两类,一类是基础配置文件,通常只有一个,主要是配置一些最基本的上下文参数和运行环境;另一类是映射文件,它可以配置映射关系、SQL、参数等信息。

  通常命名为MyBatis_config.xml,代码清单如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!--
    引入XML的约束文件,约束内容
-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--在jdbc.properties属性文件中配置数据库四要素-->
    <properties resource="jdbc.properties" />
    <!--设置全限定类名的别名-->
    <typeAliases>
        <package name="com.dyh.pojo"/>
    </typeAliases>
    <!--配置数据库连接-->
    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${mysql.Driver}"/>
                <property name="url" value="${mysql.Url}"/>
                <property name="username" value="${mysql.UserName}"/>
                <property name="password" value="${mysql.UserPassword}"/>
            </dataSource>
        </environment>
    </environments>
	<!--扫描映射器包-->
    <mappers>
        <package name="com.dyh.dao"/>
    </mappers>
</configuration>

  typeAlias元素:定义了一个别名role,它代表着com.learn.ssm.chapter3.pojo.Role这个类。这样定义后,在 MyBatis 上下文中就可以使用别名去代替全限定名了。
  environment元素:的定义,这里描述的是数据库。它里面的<transactionManager>元素是配置事务管理器,这里采用的是 MyBatis的JDBC管理器方式。然后采用<dataSource>元素配置数据库,其中属性 type="POOLED"代表采用MyBatis内部提供的连接池方式,最后定义一些关于JDBC的属性信息。
  mapper元素:代表引入的那些映射器,它里面的 package 属性会扫描整个包取到里面的所有映射器。

四、SQLSession

  在MyBatis 中, SqISession是其核心接口。在MyBatis中有两个实现类, DefaultSqlSession和SqlSessionManager。DefaultSqlSession是单线程使用的,而SqlSessionManager在多线程环境下使用。SqlSession的作用类似于一个 JDBC 中的 Connection对象,代表着一个连接资源的启用。具体而言,它的作用有3个:获取Mapper接口,发送SQL给数据库,控制数据库事务。

  有了SqlSessionFactory创建SqlSession是非常简单的,注意SqlSession只是一个门面接口,真正执行业务语句的是底层的Executor!

package com.dyh.utlis;
/**
 * ClassName: MybatisUtils
 * Package: com.dyh.utils
 * Description: 工具类:一个类中的所有方法都是静态方法,不需要实例化对象,所以私有化构造方法
 * @Date: 2022/4/4 17:18
 * @Author: yangzhihong
 */
public class MybatisUtils {

    private MybatisUtils() {
    }

    private static SqlSessionFactory sqlSessionFactory = null;

    public static synchronized SqlSessionFactory getSqlSessionFactory() {

        if(sqlSessionFactory != null) {
            return  sqlSessionFactory;
        }
        try {
            InputStream is = Resources.getResourceAsStream("mybatis_config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

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

    public static SqlSession getSqlSession() {
        if(sqlSessionFactory == null) {
            getSqlSessionFactory();
        }
        return sqlSessionFactory.openSession();
    }
}

  SqlSession控制数据库事务:

package com.dyh.test;
/**
 * ClassName: MainTest
 * Package: com.dyh.test
 * Description:
 * @Date: 2022/4/4 16:21
 * @Author: yangzhihong
 */
public class MainTest {

    public static void main(String[] args) {
        SqlSession session = null;

        try {
            session = MybatisUtils.getSqlSession();

            EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);

            Employee employee = employeeMapper.getEmployee(1);

            System.out.println(employee);

            session.commit();
        } catch (Exception ex) {
            if(session != null) {
                session.rollback(); // 回滚
            }
        } finally {
            if(session != null) {
                session.close();
            }
        }
    }
}

  这里使用commit方法提交事务,或者使用rollback方法回滚事务。因为它代表着一个数据库的连接资源,使用后要及时关闭它,如果不关闭,那么数据库的连接资源就会很快被耗费光,整个系统就会陷入瘫痪状态,所以用finally语句保证其顺利关闭。
  由于SqlSession的获取 Mapper接口和发送SQL的功能需要先实现映射器的功能,而映射器接口也可以实现发送SQL 的功能。

五、映射器

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

  它可以配置以下内容:

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

使用XML文件实现映射器

定义一个映射器接口:

public interface EmployeeMapper {
    Employee getEmployee(long id);
}

XML文件:

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

<mapper namespace="demo.dao.ApartMapper">
    <select id="getTask" parameterType="long" resultType="com.dyh.pojo.Task">
        select id,title,context,note from t_task where id = #{id}
    </select>
</mapper>

  <mapper>元素中的属性namcspace 所对应的是一个接口的全限定名,于是 MyBatis上下文就可以通过它找到对应的接口。

  <select>元素表明这是一条查询语句,而属性 id标识了这条 SQL,属性parameterType="long"说明传递给SQL的是一个long型的参数,而resultType="role"表示返回的是一个role类型的返回值。而role是之前配置文件 mybatis-config.xml配置的别名,指代的是com.learn.ssm.chapter3.pojo.Role。
  这条SQL 中的#{id}表示传递进去的参数。
  注意,我们并没有配置SQL执行后和 role的对应关系,它是如何映射的呢?其实这里采用的是一种被称为自动映射的功能,MyBatis在默认情况下提供自动映射,只要SQL返回的列名能和POJO对应起来即可。这里SQL返回的列名id和note是可以和之前定义的POJO的属性对应起来的,而表里的列role_name通过SQL别名的改写,使其成为roleName,也是和 POJO对应起来的,所以此时MyBatis就可以把SQL查询的结果通过自动映射的功能映射成为一个POJO。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值