• SSM - Springboot - MyBatis-Plus 全栈体系(十三)


    第三章 MyBatis

    • MyBatis 实践:提高持久层数据处理效率

    一、MyBatis 简介

    1. 简介

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

    • MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

    在这里插入图片描述

    • 此处使用 3.5.11 版本

    2. 持久层框架对比

    • JDBC

      • SQL 夹杂在 Java 代码中耦合度高,导致硬编码内伤
      • 维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见
      • 代码冗长,开发效率低
    • Hibernate 和 JPA

      • 操作简便,开发效率高
      • 程序中的长难复杂 SQL 需要绕过框架
      • 内部自动生成的 SQL,不容易做特殊优化
      • 基于全映射的全自动框架,大量字段的 POJO 进行部分映射时比较困难。
      • 反射操作太多,导致数据库性能下降
    • MyBatis

      • 轻量级,性能出色
      • SQL 和 Java 编码分开,功能边界清晰。Java 代码专注业务、SQL 语句专注数据
      • 开发效率稍逊于 Hibernate,但是完全能够接受
    • 开发效率:Hibernate>Mybatis>JDBC

    • 运行效率:JDBC>Mybatis>Hibernate

    3. 快速入门(基于 MyBatis3 方式)

    3.1 准备数据模型
    CREATE DATABASE `mybatis-example`;
    
    USE `mybatis-example`;
    
    CREATE TABLE `t_emp`(
      emp_id INT AUTO_INCREMENT,
      emp_name CHAR(100),
      emp_salary DOUBLE(10,5),
      PRIMARY KEY(emp_id)
    );
    
    INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("tom",200.33);
    INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("jerry",666.66);
    INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("andy",777.77);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    3.2 项目搭建和准备
    3.2.1 项目搭建

    在这里插入图片描述

    3.2.2 依赖导入
    • pom.xml
    <dependencies>
      
      <dependency>
          <groupId>org.mybatisgroupId>
          <artifactId>mybatisartifactId>
          <version>3.5.11version>
      dependency>
    
      
      <dependency>
          <groupId>mysqlgroupId>
          <artifactId>mysql-connector-javaartifactId>
          <version>8.0.25version>
      dependency>
    
      
      <dependency>
          <groupId>org.junit.jupitergroupId>
          <artifactId>junit-jupiter-apiartifactId>
          <version>5.3.1version>
      dependency>
    dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    3.2.3 实体类准备
    public class Employee {
    
        private Integer empId;
    
        private String empName;
    
        private Double empSalary;
    
        //getter | setter
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    3.3 准备 Mapper 接口和 MapperXML 文件
    • MyBatis 框架下,SQL 语句编写位置发生改变,从原来的 Java 类,改成XML或者注解定义!
    • 推荐在 XML 文件中编写 SQL 语句,让用户能更专注于 SQL 代码,不用关注其他的 JDBC 代码。
    • 如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码!!
    • 一般编写 SQL 语句的文件命名:XxxMapper.xml Xxx 一般取表名!!
    • Mybatis 中的 Mapper 接口相当于以前的 Dao。但是区别在于,Mapper 仅仅只是建接口即可,我们不需要提供实现类,具体的 SQL 写到对应的 Mapper 文件,该用法的思路如下图所示:

    在这里插入图片描述

    3.3.1 定义 mapper 接口
    • 包:com.alex.mapper
    package com.alex.mapper;
    
    import com.alex.pojo.Employee;
    
    /**
     * t_emp表对应数据库SQL语句映射接口!
     *    接口只规定方法,参数和返回值!
     *    mapper.xml中编写具体SQL语句!
     */
    public interface EmployeeMapper {
    
        /**
         * 根据员工id查询员工数据方法
         * @param empId  员工id
         * @return 员工实体对象
         */
        Employee selectEmployee(Integer empId);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    3.3.2 定义 mapper xml
    • 位置: resources/mappers/EmployeeMapper.xml
    
    DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.alex.mapper.EmployeeMapper">
    
        
        <select id="selectEmployee" resultType="com.alex.pojo.Employee">
            
            select emp_id empId,emp_name empName, emp_salary empSalary from
               t_emp where emp_id = #{empId}
        select>
    mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 注意:
      • 方法名和 SQL 的 id 一致
      • 方法返回值和 resultType 一致
      • 方法的参数和 SQL 的参数一致
      • 接口的全类名和映射配置文件的名称空间一致
    3.4 准备 MyBatis 配置文件
    • mybatis 框架配置文件: 数据库连接信息,性能配置,mapper.xml 配置等!
    • 习惯上命名为 mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合 Spring 之后,这个配置文件可以省略,所以操作时可以直接复制、粘贴。
    
    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-example"/>
            <property name="username" value="root"/>
            <property name="password" value="root"/>
          dataSource>
        environment>
      environments>
    
      <mappers>
        
        
        
        
        <mapper resource="mappers/EmployeeMapper.xml"/>
      mappers>
    
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    3.5 运行和测试
    /**
     * projectName: com.alex.test
     *
     * description: 测试类
     */
    public class MyBatisTest {
    
        @Test
        public void testSelectEmployee() throws IOException {
    
            // 1.创建SqlSessionFactory对象
            // ①声明Mybatis全局配置文件的路径
            String mybatisConfigFilePath = "mybatis-config.xml";
    
            // ②以输入流的形式加载Mybatis配置文件
            InputStream inputStream = Resources.getResourceAsStream(mybatisConfigFilePath);
    
            // ③基于读取Mybatis配置文件的输入流创建SqlSessionFactory对象
            SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
            // 2.使用SqlSessionFactory对象开启一个会话
            SqlSession session = sessionFactory.openSession();
    
            // 3.根据EmployeeMapper接口的Class对象获取Mapper接口类型的对象(动态代理技术)
            EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
    
            // 4. 调用代理类方法既可以触发对应的SQL语句
            Employee employee = employeeMapper.selectEmployee(1);
    
            System.out.println("employee = " + employee);
    
            // 4.关闭SqlSession
            session.commit(); //提交事务 [DQL不需要,其他需要]
            session.close(); //关闭会话
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 说明:

      • SqlSession:代表 Java 程序和数据库之间的会话。(HttpSession 是 Java 程序和浏览器之间的会话)
      • SqlSessionFactory:是“生产”SqlSession 的“工厂”。
      • 工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象。
    3.6 SqlSession 和 HttpSession 区别
    • HttpSession:工作在 Web 服务器上,属于表述层。
      • 代表浏览器和 Web 服务器之间的会话。
    • SqlSession:不依赖 Web 服务器,属于持久化层。
      • 代表 Java 程序和数据库之间的会话。
        在这里插入图片描述
  • 相关阅读:
    python - 第15章 GUI的最终选择 Tkinter
    暖阳脚本_ 将Agent技术的灵活性引入RPA,清华等发布自动化智能体ProAgent
    剑指offer(C++)-JZ31:栈的压入、弹出序列(数据结构-队列 & 栈)
    Shell基础— Bash的基本功能(一)
    一文搞懂 Webpack 多入口配置
    经验分享,两个在线图片处理网站在线抠图和删除不需要的元素
    怎么去除视频上的文字?一篇教你:视频上的文字水印怎么去除
    vscode安装
    优化规则与表达式下推的黑名单
    目标检测网络之Fast-RCNN
  • 原文地址:https://blog.csdn.net/sgsgkxkx/article/details/133187023