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对象返回。
 


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

MyBatis快速入门
创建父工程
创建一个Maven工程:
引入依赖
在父工程的 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;
再添加一些数据:
入门案例
创建子工程

创建 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、SqlSession和connection一样都是非线程安全,每次使用都应该去获取新的对象。
4、mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。(将接口和xml进行绑定)EmployeeMapper empMapper = sqlSession.getMapper(EmployeeMapper.class);
5、两个重要的配置文件:
- mybatis 全局配置文件:包含数据库连接池信息,事务管理器信息、系统运行环境信息等。
 - SQL 映射文件:保存了每一个sql语句的映射信息,将sql抽取出来。
 
