第 1 章 MyBatis快速入门

1.1 ORM简介

ORM(Object Relational Mapping,对象——关系映射)框架的主要功能是根据映射配置文件,完成数据在对象模型与关系模型之间的映射,同时出屏蔽了连接数据库、创建 Statement 对象、执行 SQL、读取 ResultSet、转换 JavaBean、关闭 ResultSet、Statement 对象以及数据库连接等操作。

在这里插入图片描述

1.2 常见持久化框架

Hibernate

通过 hbm.xml 映射文件维护 Java 类与数据库表的映射关系。数据库中所有的表都对应一个 Java 类,表中的每一条数据在运行过程中会被映射成相应的 Java 对象。

JPA

Java Persistence API 是EJB 3.0 中持久化部分的规范,但它可以脱离 EJB 的体系单独作为一个持久化规范进行使用。设计上与 Hibernate 相类似。

Spring JDBC

Spring 框架使用模板方式对原生 JDBC 进行的一层封装。

MyBatis

MyBatis 通过映射配置文件或相应注解将 ResultSet 映射为 Java 对象。相较于 Hibernate,MyBatis更加轻量级,可控性也更高。可以直接编写待执行的原生 SQL 语句,比较适合大数据量、高并发等场景。

MyBatis 提供了强大的动态 SQL 功能,可以根据执行时传入的实际参数值接着出完整的、可执行的 SQL 语句。

1.3 MyBatis 示例

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><!-- 定义属性值 --><properties><property name="username" value="root"/><property name="id" value="123"/></properties><!-- 全局配置信息 --><settings><!-- 使全局的映射器启用或禁用缓存 --><setting name="cacheEnabled" value="true"/><!-- 允许JDBC 支持自动生成主键 --><setting name="useGeneratedKeys" value="true"/><!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 --><setting name="defaultExecutorType" value="SIMPLE"/><!-- 指定 MyBatis 所用日志的具体实现 -->
<!--        <setting name="logImpl" value="SLF4J"/>--><!-- 使用驼峰命名法转换字段 --><setting name="mapUnderscoreToCamelCase" value="true"/></settings><!-- 别名定义 --><typeAliases><!-- 配置别名信息,在映射配置文件中可以直接使用别名 --><typeAlias alias="Blog" type="com.example.Blog"/><typeAlias alias="Author" type="com.example.Author"/><typeAlias alias="Post" type="com.example.Post"/></typeAliases><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"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!-- 映射配置文件的位置 --><mappers><mapper resource="com/example/BlogMapper.xml"/></mappers>
</configuration>

BlogMapper.xml

<?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.example.BlogMapper"><!-- 定义映射规则 --><resultMap id="detailedBlogResultMap" type="Blog"><!-- 构造函数映射 --><constructor><idArg column="blog_id" javaType="int"/></constructor><!-- 属性映射 --><result column="blog_title" property="title"/><!-- 对象属性的映射,同时也是一个嵌套映射 --><association property="author" resultMap="authorResultMap"/><!-- 集合属性的映射,也是一个匿名的嵌套映射 --><collection property="posts" ofType="Post"><id column="post_id" property="id"/><result column="post_content" property="content"/></collection></resultMap><resultMap id="authorResultMap" type="Author"><id column="author_id" property="id"/><result column="author_username" property="username"/><result column="author_password" property="password"/><result column="author_email" property="email"/></resultMap><!-- 定义查询语句 --><select id="selectBlogDetails" resultMap="detailedBlogResultMap">selectB.id as blog_id,B.title as blog_title,B.author_id as blog_author_id,A.id as author_id,A.username as author_username,A.password as author_password,A.email as author_email,P.id as post_id,P.blog_id as post_blog_id,P.content as post_contentfrom Blog Bleft outer join Author A on B.author_id = A.idleft outer join Post P on B.id = P.blog_idwhere B.id = #{id}</select>
</mapper>

Main.java

package com.example;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;public class Main {public static void main(String[] args) throws IOException {String resource = "com/example/mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);// 加载 mybatis-config.xml 配置文件,创建 SqlSessionFactory 对象SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 创建 SqlSession 对象SqlSession sqlSession = sqlSessionFactory.openSession();try {Map<String, Object> parameter = new HashMap<>();parameter.put("id", 1);// 执行 select 语句,将 ResultSet 结果集映射成对象并返回Blog blog = sqlSession.selectOne("com.example.BlogMapper.selectBlogDetails", parameter);// 输出查询结果System.out.println(blog);} finally {// 关闭 SqlSession 对象sqlSession.close();}}
}

完整代码已同步上传至 gitee

1.4 MyBatis 整体架构

在这里插入图片描述

1.4.1 基础支持层
  • 反射模块:对 Java 原生的反射进行了良好的封装
  • 类型转换模块:1. 别名机制;2. JDBC 类型与 Java 类型之间相互转换
  • 日志模块:集成第三方日志框架,如 Log4j、Log4j2、slf4j 等
  • 资源加载模块:封装类加载器
  • 解析器模块:1. 封装 XPath,2. 处理动态 SQL 的占位符
  • 数据源模块:连接池、检测连接状态等
  • 事务管理:与 Spring 集成,由 Spring 管理事务
  • 缓存模块:提供一级缓存和二级缓存
  • Binding模块:将用户自定义的 Mapper 接口与映射配置文件关联起来

在这里插入图片描述

1.4.2 核心处理层
  • 配置解析,解析 mybatis-config.xml 配置文件、映射配置文件以及 Mapper 接口中的注解信息

  • SQL 解析与 scripting 模块,解析动态 SQL

  • SQL 执行,如图

    在这里插入图片描述

  • 插件

1.4.3 接口层

核心:SqlSession,定义了 MyBatis 暴露给应用程序调用的 API

1.5 本章小结

  1. ORM 框架的相关概念及价值
  2. 常用的 ORM 框架
  3. MyBatis 使用示例
  4. MyBatis 整体构架

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(Linux驱动学习 - 8).信号异步通知

一.异步通知简介 1.信号简介 信号类似于我们硬件上使用的“中断”&#xff0c;只不过信号是软件层次上的。算是在软件层次上对中断的一种模拟&#xff0c;驱动可以通过主动向应用程序发送信号的方式来报告自己可以访问了&#xff0c;应用程序获取到信号以后就可以从驱动设备中…

【技术】Jaskson的序列化与反序列化

文章目录 概念解释1.Jasksona.JSONJSON 的基本特点JSON 的基本结构JSON 示例 b.ObjectMapper类 2.序列化与反序列化a.序列化对象序列化集合序列化ListSetMap b.反序列化反序列化单个对象反序列化集合对象 概念解释 1.Jaskson Jackson 是一个用于处理 JSON 数据的 Java 库,所以…

k8s实战-1

k8s实战-1 一、资源创建方式1.命令行2.yaml 二、命名空间三、Pod总结 一、资源创建方式 1.命令行 就是直接通过命令的方式创建&#xff0c;比如我要创建namespace&#xff0c; kubectl create namespace hello删除&#xff1a; kubectl delete -f hello2.yaml 简单来说&am…

用java编写飞机大战

游戏界面使用JFrame和JPanel构建。背景图通过BG类绘制。英雄机和敌机在界面上显示并移动。子弹从英雄机发射并在屏幕上移动。游戏有四种状态&#xff1a;READY、RUNNING、PAUSE、GAMEOVER。状态通过鼠标点击进行切换&#xff1a;点击开始游戏&#xff08;从READY变为RUNNING&am…

无人机单目+激光+IMU复杂弧形(隧道)退化场景SLAM技术详解

无人机在复杂弧形&#xff08;如隧道&#xff09;退化场景中的SLAM&#xff08;同时定位与地图构建&#xff09;技术&#xff0c;结合单目相机、激光雷达&#xff08;LiDAR&#xff09;和惯性测量单元&#xff08;IMU&#xff09;时&#xff0c;能够显著提升定位与建图的准确性…

在忘记密码的情况下重新访问手机?5种忘记密码解锁Android手机的方法

无需密码即可访问Android手机。 即使你忘记了密码&#xff0c;你也可以解锁你的Android手机&#xff0c;但你通常需要将手机恢复出厂设置。 您可以通过执行出厂恢复或使用“查找我的设备”网站解锁大多数Android手机。 如果你不再有密码&#xff0c;这里有五种解锁安卓手机的…

E37.【C语言】动态内存管理练习题

目录 1. 答案速查 分析 源代码分析 反汇编代码分析(底层) 2. 答案速查 分析 3. 答案速查 分析 VS逐步调试 1. 求下列代码的执行结果 #include <stdio.h> char* GetMemory(void) {char p[] "hello world";return p; }void Test(void) {char* str…

分层解耦-03.IOCDI-入门

一. IOC&DI入门 二.控制转移注解Component 因为dao和service接口的实现类对象需要传入到service和controller中&#xff0c;因此需要将dao和service代码加上Component注解&#xff0c;使之实现控制反转&#xff0c;将实现类对象交给IOC容器管理&#xff0c;成为IOC容器中…

Web安全 - 阶段性总结回顾_风险评估

文章目录 OWASP 2023 TOP 10用户数据的威胁评估密码盗窃XSS 漏洞SQL 注入CSRF 漏洞 资产数据的威胁评估SSRF 漏洞反序列化漏洞插件漏洞后门 认证和授权的安全防护检测与过滤加强认证补丁管理 进一步防护手段最小权限原则WAFIDS 小结 OWASP 2023 TOP 10 OWASP Top 10 概述 OWASP…

数据结构与算法——动态规划算法简析

1.初步了解动态规划 由于本篇博客属于动态规划的初阶学习&#xff0c;所以大多都是简单的表示&#xff0c;更深层次的学术用语会在之后深度学习动态规划之后出现&#xff0c;本文主要是带各位了解一下动态规划的大致框架 1.1状态表示 通常的我们会开辟一个dp数组来存储需要表示…

C++ WebDriver扩展

概述 WebDriver协议基于HTTP&#xff0c;使用JSON进行数据传输&#xff0c;定义了client与driver之间的通信标准。无论client的实现语言&#xff08;如Java或C#&#xff09;&#xff0c;都能通过协议中的endpoints准确指示driver执行各种操作&#xff0c;覆盖了Selenium的所有功…

【C语言】预处理指令详解

目录 一、预定义符号 二、#define 定义常量 三、#define 定义宏 &#xff08;1&#xff09;宏定义的使用 &#xff08;2&#xff09;带副作用的宏参数 &#xff08;3&#xff09;宏替换的规则 &#xff08;4&#xff09;宏与函数对比 &#xff08;5&#xff09;#和## …

基于单片机的书库环境监测

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DHT11湿度传感器检测湿度&#xff0c;DS18B20温度传感器检测温度&#xff0c; 采用滑动变阻器连接数模转换器模拟二氧化碳和氧气浓度检测&#xff0c;各项数值通过lc…

SQL第12课——联结表

三点&#xff1a;什么是联结&#xff1f;为什么使用联结&#xff1f;如何编写使用联结的select语句 12.1 联结 SQL最强大的功能之一就是能在数据查询的执行中联结&#xff08;join)表。联结是利用SQL的select能执行的最重要的操作。 在使用联结前&#xff0c;需要了解关系表…

免费高可用软件

高可用软件是指那些能够提供高可用性、高可靠性的软件&#xff0c;它们在各种应用场景下都能确保系统的稳定运行。以下是四款免费的高可用软件&#xff0c;它们在不同领域都表现出色&#xff0c;能够满足各种高可用性需求。 一、PanguHA PanguHA是一款专为Windows平台设计的双…

使用正则表达式删除文本的奇数行或者偶数行

用智谱清言和kimi搜出来的结果都没法在notepad生效&#xff0c;后面在overflow上找到的答案比较靠谱。 查找&#xff1a;^[^\n]*\n([^\n]*) 替换&#xff1a;\1 删除偶数行 查找&#xff1a;^([^\n]*)\n[^\n]* 替换&#xff1a;\1 代码解释 ^&#xff1a;这个符号代表字符…

RabbitMQ 集群

文章目录 集群搭建使用 Docker-Compose 镜像队列搭建步骤工作原理镜像策略主从同步 同步延迟 集群搭建 参考&#xff1a; docker中安装并启动rabbitMQ Docker中搭建RabbitMQ集群 使用 Docker-Compose 这里提供一个脚本来使用 docker-compose 完成RabbitMQ集群的配置及启动…

机器学习-树模型算法

机器学习-树模型算法 一、Bagging1.1 RF1.2 ET 二、Boosting2.1 GBDT2.2 XGB2.3 LGBM 仅个人笔记使用&#xff0c;感谢点赞关注 一、Bagging 1.1 RF 1.2 ET 二、Boosting 2.1 GBDT 2.2 XGB 2.3 LGBM LightGBM&#xff08;Light Gradient Boosting Machine) 基本算法原理…

基于单片机的烧水壶系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC单片机&#xff0c;采用四个按键&#xff0c;通过DS18B20检测温度&#xff0c;开机显示实时温度 第一个按键为切换功能按键&#xff0c;按下后&#xff0c;可以设置烧水温度的大小&…

五子棋双人对战项目(6)——对战模块(解读代码)

目录 一、约定前后端交互接口的参数 1、房间准备就绪 &#xff08;1&#xff09;配置 websocket 连接路径 &#xff08;2&#xff09;构造 游戏就绪 的 响应对象 2、“落子” 的请求和响应 &#xff08;1&#xff09;“落子” 请求对象 &#xff08;2&#xff09;“落子…