MyBatis简介

为什么引入持久层框架?

三层架构

  • 表现层—展示数据
  • 业务层—处理业务需求
  • 持久层—和数据库交互

持久层技术解决方案

  • JDBC技术(最底层)
  • Apache的DBUtils:QueryRunnner
  • Spring的JdbcTemplate:Spring中对jdbc的简单封装

以上都不是框架,jdbc是规范,其它两个是工具包,都封装的不够细致,需要关注加载驱动、创建连接、创建Statement等繁杂过程。而且功能简单,sql语句编写在java代码里,硬编码高耦合(sql变化时需要修改源码)。

持久层技术框架

框架是一种整体性解决方案,目前流行的有两种:

  • Hibernate:全自动全映射ORM框架,旨在消除sql。但是存在开发人员无法自主优化sql语句的缺点。
  • MyBatis:是优秀的基于java持久层的半自动轻量级框架,它内部封装了jdbc,sql与java编码分离(sql单独提取到配置文件中,由开发者控制),开发者只需要关注sql语句本身(剩下的预编译、设置参数、执行sql、封装结果由框架完成)。它使用了ORM的思想实现了结果集的封装。

    ORM:Object Relational Mapping 对象关系映射 将数据库表和实体类、实体类的属性对应起来,让我们可以实现操作实体类即操作数据表 Mybatis通过xml或注解的方式将要执行的statement(sql语句)配置起来,通过java对象 和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由Mybatis框架执行语句并将结果映射为java对象返回。

image.png
image.png

MyBatis

详细介绍看官网:https://mybatis.org/mybatis-3/zh/index.html
image.png
image.png

MyBatis快速入门

创建父工程

创建一个Maven工程:
image.png

引入依赖

在父工程的 pom 文件中引入依赖:

<!--引入依赖-->
<dependencies>
  <!--mysql驱动-->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.25</version>
  </dependency>
  <!--mybatis-->
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
  </dependency>
  <!--junit4-->
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
  </dependency>
  <!--lombok(可选)-->
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
  </dependency>
</dependencies>

静态资源过滤

在 pom.xml 文件中引入:

<!--解决静态资源过滤问题-->
<build>
  <resources>
    <resource>
      <directory>src/main/java</directory>
      <includes>
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
      <filtering>false</filtering>
    </resource>
    <resource>
      <directory>src/main/resources</directory>
      <includes>
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
      <filtering>false</filtering>
    </resource>
  </resources>
</build>

数据库准备

先创建一个 mybatis 数据库,然后建立一张表:

CREATE TABLE `tbl_employee` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `last_name` varchar(255) DEFAULT NULL,
  `gender` char(1) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

再添加一些数据:
image.png

入门案例

创建子工程

image.png

创建 Bean 类

package com.atguigu.mybatis.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {
    private Integer id;
    private String lastName;
    private String gender;
    private String email;
}

创建 Mapper 接口

package com.atguigu.mybatis.mapper;

import com.atguigu.mybatis.bean.Employee;

public interface EmployeeMapper {
    Employee getEmpById(Integer id);
}

创建 Mapper 对应的 XML 文件

在接口同级目录下创建,例如:EmployeeMapper.xml,这是 SQL 映射文件,封装了 SQL 代码

<?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">

<!--namespace 使用接口的全类名-->
<mapper namespace="com.atguigu.mybatis.mapper.EmployeeMapper">

    <!--id 使用接口的方法名-->
    <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
        select id, last_name lastName, gender, email from tbl_employee where id = #{id}
    </select>

</mapper>

mybatis 核心配置文件

在 resources 目录下创建 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.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai"/>
                <property name="username" value="root"/>
                <property name="password" value="12345678"/>
            </dataSource>
        </environment>
    </environments>

    <!--注册 mapper 文件,需要在pom文件中解决静态资源过滤的问题-->
    <mappers>
        <mapper resource="com/atguigu/mybatis/mapper/EmployeeMapper.xml"/>
    </mappers>

</configuration>

测试代码

public class MyBatisTest {

    //1、获取 sqlSessionFactory
    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(inputStream);
    }

    @Test
    public void test1() throws IOException {
        //2、获取 sqlSession
        SqlSession sqlSession = getSqlSessionFactory().openSession();

        //3、获取接口的实现类对象
        //会为接口自动创建一个代理对象,让代理对象去执行增删改查
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
        Employee emp = mapper.getEmpById(2);
        System.out.println(emp);

        //4、关闭连接
        sqlSession.close();
    }
}

总结

1、接口式编程

  • 原生: Dao ====> DaoImpl
  • mybatis: Mapper ====> xxxMapper.xml

2、SqlSession代表和数据库的一次会话,用完必须关闭;

3、SqlSessionconnection一样都是非线程安全,每次使用都应该去获取新的对象。

4、mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。(将接口和xml进行绑定)
EmployeeMapper empMapper = sqlSession.getMapper(EmployeeMapper.class);

5、两个重要的配置文件:

  • mybatis 全局配置文件:包含数据库连接池信息,事务管理器信息、系统运行环境信息等。
  • SQL 映射文件:保存了每一个sql语句的映射信息,将sql抽取出来。