MyBatis:基础入门

news2025/7/19 21:02:52

MyBatis基础入门


文章目录

  • MyBatis基础入门
    • 一、MyBatis 简介
    • 二、MyBatis 工作原理
    • 三、MyBatis 与 Hibernate 的对比
      • 1. 原生 Jdbc 存在的问题
      • 2. MyBatis 与 Hibernate 的对比
    • 四、MyBatis demo
      • 1. 引入 Maven 依赖
      • 2. 创建mybatis-config.xml配置文件
      • 3. 编写JavaBean类
      • 4. Mapper层编写查询接口
      • 5. Mapper层所对应 xml 中编写 SQL 语句
      • 6. 编写测试类


一、MyBatis 简介

MyBatis 源起于 Apache 的开源项目 iBatis,2010年这个项目由 Apache Software Foundation 迁移到了 Google code,并且改名为 MyBatis 。2013 年 11 月迁移到 Github。

MyBatis中文文档:https://mybatis.net.cn/

GitHub:https://github.com/mybatis/mybatis-3

MyBatis 是一款优秀的持久层框架,MyBatis 是一个优秀的持久层框架,MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建Connection、创建 Statement、手动设置参数、结果集检索等 JDBC 繁杂的过程代码。

MyBatis 支持自定义 SQL、存储过程以及高级映射。它可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录,将要执行的各种 Statement(statement、preparedStatemnt)配置起来,并通过 Java 对象和 Statement 中的 sql 进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射回 Java POJO 返回。


二、MyBatis 工作原理

MyBatis 基于 XML 配置文件生成 Configuration 和一个个 MappedStatement(包括了参数映射配置、动态 SQL 语句、结果映射配置)

MyBatis 架构图:

在这里插入图片描述

  • Mybatis 核心配置文件(如:sqlMapConfig.xml)在加载解析后,会生成 Configuration 对象,并由
    Configuration 对象得到 SqlSessionFactory,也就是 SqlSession 工厂;
  • 基于 SqlSessionFactory 可以生成 SqlSession 对象;
  • SqlSession 是应用程序和数据库之间交互的一个单线程对象(非线程安全的)不同用户的连接不是同一个,数据库的 C、R、U、D及事务的处理接口;
  • Executor 是 SqlSession 底层的对象,用于执行SQL语句;
  • MapperStatement 也是 SqlSession 底层的对象,用于接收输入映射(SQL语句中的参数),以及做输出映射(即将sql 查询的结果映射成相应的结果(HashMap、JavaBean 等));

SqlSession 对象完成和数据库的交互过程:

  1. 用户程序调用 Mybatis 接口层 api(即 Mapper 接口中的方法);
  2. SqlSession 通过调用 api 的 Statement ID 找到对应的 MappedStatement 对象;
  3. 通过 Executor 将 MappedStatement 对象进行解析、sql 参数转化、动态 sql 拼接,生成 jdbc Statement 对象;
  4. JDBC 执行 sql;
  5. 借助MappedStatement 中的结果映射关系,将返回结果转化成 HashMap、JavaBean 等存储结构并返回。

三、MyBatis 与 Hibernate 的对比

1. 原生 Jdbc 存在的问题

  1. 频繁创建、释放数据库连接造成系统资源浪费,影响系统性能。
    解决: 可以在 sqlMapConfig.xml 中配置数据连接池,使用连接池管理数据库连接。
  2. Sql 语句硬编码到 Java 代码中,不易维护,实际应用中 Sql 变化的可能较大,Sql 变动需要改变 Java代码。
    解决: Mybatis 将 Sql 语句配置在 XXXXmapper.xml 文件中与 Java 代码分离。
  3. 向 Sql 语句传参数麻烦,因为 Sql 语句的 where 条件不一定,可能多也可能少,占位符需要和参数一一对应(硬编码)。
    解决: Mybatis 自动将 Java 对象映射至 Sql 语句,通过 statement 中的 parameterType 定义输入参数的类型。
  4. 对结果集解析麻烦(查询列硬编码),Sql 变化会导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 Pojo对象解析比较方便。
    解决: Mybatis 自动将 Sql 执行结果映射至 Java 对象,通过 statement 中的 resultType定义输出结果的类型。

2. MyBatis 与 Hibernate 的对比

Hibernate 自动生成表,生成关系对于单表的 CRUD 不用写 Sql\Hql。mybtais 对于多表连接查询等等更加方便 因为 Sql 写起来简单:

  • MyBatis 半自动化模式操作数据,Hibernate 完全面向对象操作数据;
  • MyBatis 运行的性能高于 Hibernate 的性能,因为 Hql 要转化为 Sql,DB 才能识别;
  • MyBatis 的开发效率低于 Hibernate 的开发速度,写 Sql,写配置;
  • MyBatis 应用在互联网项目的开发,Hibernate 用在传统的 MIS 系统开发。

四、MyBatis demo

1. 引入 Maven 依赖

        <!--    Mysql数据库驱动    -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>
        <!--    MyBatis    -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <!--    junit测试类    -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>

2. 创建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.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
				<property name="username" value="root" />
				<property name="password" value="root" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
	<mappers>
		<mapper resource="EmployeeMapper.xml" />
	</mappers>
</configuration>

3. 编写JavaBean类

public class Employee {

    private Integer id;
    private String lastName;
    private String email;
    private String gender;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    @Override
    public String toString() {
        return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + "]";
    }
    
}

4. Mapper层编写查询接口

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

}

5. Mapper层所对应 xml 中编写 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">
<mapper namespace="com.lizhengi.demo.mybatis.bean.dao.mapper.EmployeeMapper">
    <!-- 
    namespace:名称空间;指定为接口的全类名
    id:唯一标识
    resultType:返回值类型
    #{id}:从传递过来的参数中取出id值
    public Employee getEmpById(Integer id);
     -->
    <select id="getEmpById" resultType="com.lizhengi.demo.mybatis.bean.Employee">
        select id, last_name lastName, email, gender
        from tbl_employee
        where id = #{id}
    </select>
</mapper>

6. 编写测试类

/**
 * 1、接口式编程
 * 	原生:		Dao		====>  DaoImpl
 * 	mybatis:	Mapper	====>  xxMapper.xml
 * 
 * 2、SqlSession代表和数据库的一次会话;用完必须关闭;
 * 3、SqlSession和connection一样她都是非线程安全。每次使用都应该去获取新的对象。
 * 4、mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。
 * 		(将接口和xml进行绑定)
 * 		EmployeeMapper empMapper =	sqlSession.getMapper(EmployeeMapper.class);
 * 5、两个重要的配置文件:
 * 		mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息等...系统运行环境信息
 * 		sql映射文件:保存了每一个sql语句的映射信息:
 * 					将sql抽取出来。	
 */
public class MyBatisTest {

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

	/**
	 * 1、根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 有数据源一些运行环境信息
	 * 2、sql映射文件;配置了每一个sql,以及sql的封装规则等。 
	 * 3、将sql映射文件注册在全局配置文件中
	 * 4、写代码:
	 * 		1)、根据全局配置文件得到SqlSessionFactory;
	 * 		2)、使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查
	 * 			一个sqlSession就是代表和数据库的一次会话,用完关闭
	 * 		3)、使用sql的唯一标志来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的。
	 */

	@Test
	public void test01() throws IOException {
		// 1、获取sqlSessionFactory对象
		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
		// 2、获取sqlSession对象
		SqlSession openSession = sqlSessionFactory.openSession();
		try {
			// 3、获取接口的实现类对象
			//会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
			EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
			Employee employee = mapper.getEmpById(1);
			System.out.println(mapper.getClass());
			System.out.println(employee);
		} finally {
			openSession.close();
		}
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/8005.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java开发高质量代码建议1:三元操作符的类型务必一致

在Java开发中&#xff0c;三元操作符是 if-else 的简化写法&#xff0c;在项目中使用它的地方很多&#xff0c;也非常好用&#xff0c;但是好用又简单的东西并不表示就可以随便用&#xff0c;如下代码: public class Main {public static void main(String[] args) {int i 90…

ZYNQ之FPGA学习----Vivado功能仿真

1 Vivado功能仿真 阅读本文需先学习: FPGA学习----Vivado软件使用 典型的FPGA设计流程&#xff0c;如图所示&#xff1a; 图片来自《领航者ZYNQ之FPGA开发指南》 Vivado 设计套件内部集成了仿真器 Vivado Simulator&#xff0c;能够在设计流程的不同阶段运行设计的功能仿真和…

搞笑段子很皮的文案系列001,可爱有趣文案系列合集

大家好&#xff0c;我是我赢助手&#xff0c;专注于自媒体短视频去水印、去重和文案提取运营。 今天给大家分享下收集的一些文案&#xff1a;搞笑段子很皮的文案系列 1. 女人之间不用吵架&#xff0c;你比她漂亮就行了。 2. 暧昧&#xff0c;把这两个字拆开&#xff0c;就是真…

docker centos7容器中文乱码问题解决

中文乱码与yum安装失败问题 如下图所示&#xff0c;往文件里输入内容&#xff1a;测试中文乱码问题&#xff0c;结果发现乱码。 甚至如果文件名带有中文也会乱码。 执行locale命令&#xff0c;如下所示。 LANGen_US.UTF-8 LC_CTYPE"en_US.UTF-8" LC_NUMERIC"…

C++:重定义:符号重定义:变量重定义(二):解决变量重定义

C&#xff1a;重定义&#xff1a;符号重定义&#xff1a;变量重定义_hongwen_yul的博客-CSDN博客 上一篇文章中&#xff0c;我们知道解决变量重复定义其中一个办法是&#xff1a;尽量不要头文件中定义变量&#xff0c;头文件只做变量的声明。但是如果我们一定要在头文件中定义…

【2022最新核心面试资料 】最强Java面试八股文秋招offer召唤术!入职薪资53k

前言 我分享的这份秋招 Java 后端开发面试总结包含了 JavaOOP、Java 集合容器、Java 异常、并发编程、Java 反射、Java 序列化、JVM、Redis、Spring MVC、MyBatis、MySQL 数据库、消息中间件 MQ、Dubbo、Linux、ZooKeeper、 分布式 &数据结构与算法等 25 个专题技术点&…

图像生成模型简介

因为DALLE 2是基于CLIP和GLIDE模型写的&#xff0c;作者在写论文的时候弄得十分简略&#xff0c;所以直接看那篇论文可能并不会获得很多信息。今天先帮大家区分一下几个生成模型的区别。 GAN 图片来源&#xff1a;What are Diffusion Models? | LilLog (lilianweng.github.io)…

rsync远程同步

目录 一、rsync简介 1.1 rsync介绍 1.2 rsync同步方式 二、rsync特性 三、rsync与cp、scp对比 四、rsync命令 五、rsync本地复制实例 六、配置源的两种表示方法 七、Rsync 同步源 八、配置 Rsync 下行同步 九、inotify简介 十、配置RsyncInotify 实时同步 十一、r…

【linux kernel】基于ARM64分析linux内核的链接脚本vmlinux.lds.S

文章目录一、导读二、链接器是什么三、链接脚本四、linux内核的链接脚本4-1 头文件包含描述4-2 参数设置和宏定义描述4-3 SECTIONS内容分析五、linux内核的“头”六、总结一、导读 在linux内核中&#xff0c;arch目录下放置的是关于linux内核所支持的具体架构相关的代码描述文…

EFK部署centos7.9(一)ES单节点部署

Elasticsearch部署 系统类型&#xff1a;Centos7.9 节点IP&#xff1a;192.168.11.139 软件版本&#xff1a;jdk-8u121-linux-x64.tar、elasticsearch-6.5.4.tar. 1.首先上传jdk的包 tar xzf jdk-8u121-linux-x64.tar.gz -C /usr/local/ 解压jdk的包 cd /usr/local/ 切…

逻辑回归预测瘀血阻络证||LogRegression 二分类 python3

要求 把数据集分为训练集和测试集使用逻辑回归训练、预测&#xff0c;得出相应的分类指标准确率accuracy&#xff0c;精确率precision&#xff0c;召回率recall&#xff0c;F1-score&#xff0c;并画出最终的ROC曲线&#xff0c;得出AUC值。 数据格式 664条样本 每条103个属性…

列的类型定义——整形类型

文章目录 前言一、整数类型的附带属性 类型名称后面的小括号unsignedauto_increment总结前言 1&#xff09;采用26字母和0-9的自然数加上下互相 ‘_’ 组成&#xff0c;命名简洁明确&#xff0c;多个单词用下划线 ‘_’ 隔开 2&#xff09;全部小写命名&#xff0c;尽量避免出…

猿创征文|计算机专业硕博研究生提高效率的10款科研工具

前言 大家好&#xff0c;我是帝都某高校的一名在读研究生&#xff0c;研究方向为人工智能安全、强化学习、漏洞挖掘。今天想跟各位计算机相关专业的硕士生、博士生们分享几款超级实用并且能够提高科研效率的工具&#xff01;&#xff01;&#xff01;希望能够得到大家的一键四…

【角点检测】 基于各向异性高斯方向导数滤波器实现图像角点检测附matlab代码

1 内容介绍 为了改进噪声鲁棒性和定位准确性,利用各向异性高斯方向导数滤波器,提出多方向角点检测算法.该算法利用一组各向异性高斯方向导数滤波器对输入图像进行卷积处理得到各个方向的滤波器响应.对于每个像素点,利用它与周围邻近像素点的滤波器响应的相关信息构造局部自相关…

Revit导入Cad图元丢失不正确解决和链接CAD功能

一、导入Cad图元丢失或者图元不正确解决&#xff1a; 导入Cad的时候我们会遇到导入图元丢失或者图元不正确等情况&#xff0c;具体解决如下 01.天正画图时一定要导出t3格式&#xff0c;因为Revit只识别t3版本 02.Cad画图时&#xff0c;最后一定要将图元炸开&#xff0c;然后在框…

NVIDIA NCCL 源码学习(五)- 路径计算

上节NCCL完成了对机器PCI系统拓扑的建图&#xff0c;其中建好的图如下所示&#xff0c;其中GPU之间是通过NVLink连接起来的 为了方便之后的搜索channel&#xff0c;接下来NCCL会先计算GPU和NIC节点到其他任意节点之间的最优路径&#xff0c;以及对应的带宽&#xff0c;即最优路…

Vue3基础——Composition API初体验、合成API详解、setup、Provide 和 inject

文章目录p19 组合式 API (Composition API)初体验p20 Vue3合成API详解p21 setup中使用生命周期函数p22 Provide 和 injectp19 组合式 API (Composition API)初体验 <template><h1 click"add">计数count: {{ count }}</h1><h1 click"incre…

51单片机笔记:定时器/计数器

单片机笔记 定时器/计数器 定时器/计数器的结构 AT89S51内部两个16位定时器/计数器&#xff1a;T0(P3.4)&#xff0c;T1(P3.5)&#xff0c;定时器/计数器T0由特殊寄存器TH0,TL0构成&#xff0c;T1由特殊功能寄存器TH1&#xff0c;TL1构成 T0,T1都有定时器和计数器两种工作模…

DuckDB学习-初识tpcds

DuckDB学习-1 文章目录DuckDB学习-1跑TPC-DS编译DuckDB支持TPC-DS扩展执行数据生成及查询TPC-DS简单分析&#xff08;v3.2.0&#xff09;事实表维度表跑TPC-DS 编译DuckDB支持TPC-DS扩展 下载代码&#xff0c;然后进源码目录&#xff0c;执行下面两个步骤。 export BUILD_TPC…

Word控件Spire.Doc 【文本】教程(19) ;如何在 C#、VB.NET 中通过 Word 中的正则表达式查找和替换文本

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…