三、MyBatis实践:提高持久层数据处理效率(1)(包含mybatis下载官网)

news/2024/10/19 15:04:39/

一、Mybatis简介

1.1 简介

https://mybatis.org/mybatis-3/zh/index.html

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版本

1.2 持久层框架对比

  • JDBC

    • SQL 夹杂在Java代码中耦合度高,导致硬编码内伤

    • 维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见

    • 代码冗长,开发效率低

  • Hibernate 和 JPA

    • 操作简便,开发效率高

    • 程序中的长难复杂 SQL 需要绕过框架

    • 内部自动生成的 SQL,不容易做特殊优化

    • 基于全映射的全自动框架,大量字段的 POJO 进行部分映射时比较困难。

    • 反射操作太多,导致数据库性能下降

  • MyBatis

    • 轻量级,性能出色

    • SQL 和 Java 编码分开,功能边界清晰。Java代码专注业务、SQL语句专注数据

    • 开发效率稍逊于 Hibernate,但是完全能够接收

开发效率:Hibernate>Mybatis>JDBC

运行效率:JDBC>Mybatis>Hibernate

1.3 快速入门(基于Mybatis3方式)

  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);
  2. 项目搭建和准备

    1. 依赖导入

      pom.xml

      <dependencies><!-- mybatis依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.11</version></dependency>
      ​<!-- MySQL驱动 mybatis底层依赖jdbc驱动实现,本次不需要导入连接池,mybatis自带! --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version></dependency>
      ​<!--junit5测试--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.3.1</version></dependency>
      </dependencies>
    2. 实体类准备

      public class Employee {
      ​private Integer empId;
      ​private String empName;
      ​private Double empSalary;//getter | setter
      }
  3. 准备Mapper接口和MapperXML文件

    MyBatis 框架下,SQL语句编写位置发生改变,从原来的Java类,改成XML或者注解定义!

    推荐在XML文件中编写SQL语句,让用户能更专注于 SQL 代码,不用关注其他的JDBC代码。

    如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码!!

    一般编写SQL语句的文件命名:XxxMapper.xml Xxx一般取表名!!

    Mybatis 中的 Mapper 接口相当于以前的 Dao。但是区别在于,Mapper 仅仅只是建接口即可,我们不需要提供实现类,具体的SQL写到对应的Mapper文件,该用法的思路如下图所示:

    1. 定义mapper接口

      包:com.atguigu.mapper

      package com.atguigu.mapper;
      ​
      import com.atguigu.pojo.Employee;
      ​
      /*** t_emp表对应数据库SQL语句映射接口!*    接口只规定方法,参数和返回值!*    mapper.xml中编写具体SQL语句!*/
      public interface EmployeeMapper {
      ​/*** 根据员工id查询员工数据方法* @param empId  员工id* @return 员工实体对象*/Employee selectEmployee(Integer empId);}
    2. 定义mapper xml

      位置: resources/mappers/EmployeeMapper.xml

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <!-- namespace等于mapper接口类的全限定名,这样实现对应 -->
      <mapper namespace="com.atguigu.mapper.EmployeeMapper"><!-- 查询使用 select标签id = 方法名resultType = 返回值类型标签内编写SQL语句--><select id="selectEmployee" resultType="com.atguigu.pojo.Employee"><!-- #{empId}代表动态传入的参数,并且进行赋值!后面详细讲解 -->select emp_id empId,emp_name empName, emp_salary empSalary from t_emp where emp_id = #{empId}</select>
      </mapper>

      注意:

      • 方法名和SQL的id一致

      • 方法返回值和resultType一致

      • 方法的参数和SQL的参数一致

      • 接口的全类名和映射配置文件的名称空间一致

  4. 准备MyBatis配置文件

    mybatis框架配置文件: 数据库连接信息,性能配置,mapper.xml配置等!

    习惯上命名为 mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合 Spring 之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    ​<!-- environments表示配置Mybatis的开发环境,可以配置多个环境,在众多具体环境中,使用default属性指定实际运行时使用的环境。default属性的取值是environment标签的id属性的值。 --><environments default="development"><!-- environment表示配置Mybatis的一个具体的环境 --><environment id="development"><!-- Mybatis的内置的事务管理器 --><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注册:指定Mybatis映射文件的具体位置 --><!-- mapper标签:配置一个具体的Mapper映射文件 --><!-- resource属性:指定Mapper映射文件的实际存储位置,这里需要使用一个以类路径根目录为基准的相对路径 --><!--    对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径,所以这里我们可以以resources目录为基准 --><mapper resource="mappers/EmployeeMapper.xml"/></mappers>
    ​
    </configuration>
  5. 运行和测试

    /*** projectName: com.atguigu.test** description: 测试类*/
    public class MyBatisTest {
    ​@Testpublic 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.关闭SqlSessionsession.commit(); //提交事务 [DQL不需要,其他需要]session.close(); //关闭会话
    ​}
    }

    说明:

    • SqlSession:代表Java程序和数据库之间的会话。(HttpSession是Java程序和浏览器之间的会话)

    • SqlSessionFactory:是“生产”SqlSession的“工厂”。

    • 工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象。

  6. SqlSession和HttpSession区别

    • HttpSession:工作在Web服务器上,属于表述层。

      • 代表浏览器和Web服务器之间的会话。

    • SqlSession:不依赖Web服务器,属于持久化层。

      • 代表Java程序和数据库之间的会话。


http://www.ppmy.cn/news/1540273.html

相关文章

探索 C# 的进阶特性

随着 C# 语言的不断演进&#xff0c;越来越多的特性被引入&#xff0c;提升了代码的可读性和性能。这些进阶特性为开发者提供了更多简洁而强大的工具&#xff0c;用来编写高效、优雅的代码。本文将介绍 C# 中的一些重要进阶特性&#xff0c;包括属性模式匹配、异常过滤器、记录…

网站建设完成后,多久需要升级迭代一次

网站建设完成后&#xff0c;一般每隔几个月就会进行一次迭代升级。以下是关于网站迭代周期和原因的具体分析&#xff1a; 更新频率&#xff1a;网站在建设完成后&#xff0c;一般每隔几个月就会进行一次迭代升级。这种周期性的更新有助于保持网站的现代感和竞争力。更新目的&a…

微信小程序定位判断点位是否在某个范围内(腾讯地图转百度地图)

业务:比较微信小程序定位是否在系统设置的某个位置的某个范围内 问题:微信小程序的定位是拿的腾讯地图的经纬度(假设为点A),系统设置的某个位置是百度地图的经纬度(假设为点B),需要判断点A是否在点B的Range(米)范围内 解决方案:将腾讯点A的经纬度转换为百度地图的经纬度后再进行…

iptables限速规则

环境&#xff1a; iptables服务器&#xff1a;172.16.12.33 client&#xff1a;192.168.1.2 1、在防火墙上配置客户端的下载速度是1M/s &#xff08;1个包是1.3KB&#xff09; #限速客户端每秒的下载速度是1024KB&#xff0c;超出限制的流量就丢弃 [rootiptables-172-16-12-…

Web安全常见问题

OSI七层模型和HTTP请求 OSI 物理层-数据链路层-网络层-传输层-会话层-表示层-应用层 五层协议 物理层-数据链路层-网络层-传输层-应用层 HTTP请求类型&#xff1a; GET 请求的数据在url头 POST 请求的数据在请求体 PUT 更新资源 DELETE 删除 CONNECT http/1.1协议中预留…

HIKROBOT_SDK_text1——机器人控制权

1.切换示教员&#xff0c;然后在示教器释放掉控制权 2.连接机器人代码 #include <memory> #include <Windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h>#include "MP_Public_API.h"int main() {int64_t llRet…

自动化生成工作流?英伟达提出ComfyGen:通过LLM来匹配给定的文本提示与合适的工作流程

ComfyGen的核心在于通过LLM来匹配给定的文本提示与合适的工作流程。该方法从500个来自用户的多样化提示生成图像&#xff0c;随后使用一系列美学预测模型对生成结果进行评分。这些评分与相应的工作流程形成了一个训练集&#xff0c;包含提示、工作流程及其得分的三元组。 然后…

Nature Communications 英国伦敦大学等提出仿生自适应多平面触觉系统,实现机械与振动双重感知结合

触觉&#xff0c;作为人类感知外界并与之互动的重要方式&#xff0c;赋予了人类以辨识物体多重特性&#xff08;诸如纹理、硬度、可塑性及重量&#xff09;与捕捉微妙线索&#xff08;例如感知心跳或精准定位动脉振动&#xff09;的能力。这一感官机制不仅深化了人类对周围世界…