第 1 章 MyBatis快速入门

news2024/11/27 16:42:34

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">
        select
            B.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_content
        from Blog B
        left outer join Author A on B.author_id = A.id
        left outer join Post P on B.id = P.blog_id
        where 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.coloradmin.cn/o/2206886.html

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

相关文章

DSP 如何在调试时便捷查看数组元素

背景描述: 在CCS调试过程中&#xff0c;需要查看一些变量的值&#xff0c;但是数组只能显示第一个元素的值&#xff0c;不能全部展示出来&#xff0c;这样就不便于查看了。 解决方法: 找到变量显示窗口 选中数组右键 设置开始元素和需要展示的个数 这样就可以把数组展开…

Java->Map和Set

目录 一、搜索树 1.概念 2.查找 3.插入 4.删除 二、搜索 1.Map的使用 1.1关于map的说明 1.2map的常用方法 2.Set的使用 2.1关于set的说明 2.2set的常用方法 三、哈希表 1.概念 2. 哈希冲突 3.冲突避免 3.1哈希函数的设计 3.2负载因子调节 4.解决冲突 4.1闭…

3 机器学习之假设空间

归纳(induction)与演绎(deduction)是科学推理的两大基本手段。前者是从特殊到一般的“泛化”(generalization)过程&#xff0c;即从具体的事实归结出一般性规律&#xff1b;后者则是从一般到特殊的“特化”(specialization)过程&#xff0c;即从基础原理推演出具体状况。例如&a…

一款功能强大的颜色选择工具ColorPicker

ColorPicker 是一款轻量级且功能强大的颜色选择工具&#xff0c;专为设计师、开发者以及需要在日常工作中处理颜色的用户设计。该工具允许用户从屏幕上的任意位置快速获取颜色代码&#xff0c;并提供多种格式的颜色值输出&#xff0c;包括RGB、HEX、HSB等。 ColorPicker的界面…

YOLO的相关改进机制

我的面包多平台有多种关于YOLO的改进&#xff0c;大家尽早关注&#xff0c;不迷路

opencv 答题卡检测项目实现

在教育和考试领域&#xff0c;答题卡自动评分系统能够大大提高效率和准确性。本文将介绍如何使用OpenCV库实现一个简单的答题卡检测项目。这个项目包括读取图像、检测答题卡轮廓、透视变换、二值化处理、检测选择题答案&#xff0c;并最终计算得分。 导入库和定义常量 import …

动态规划-路径问题——931.下降路径最小和

1.题目解析 题目来源&#xff1a;931.下降路径最小和——力扣 测试用例 2.算法原理 1.状态表示 我们可以开辟一个dp表&#xff0c;多开辟一行两列用来存储虚拟位置&#xff0c;dp[i][j]表示从第一行到该位置的最小路径和 2.状态转移方程 由于要找到最小路径和&#xff0c;并且由…

中间件镜像升级策略

进入集群 kubectl edit deployments paas-bmm-v1 -n kube-system 修改容器 abcsys.cn:5000/boc3.7/bmm-web-v4:latest-202410091355

【芯片知识】 | 浅谈NRK3502语音芯片IC的工作原理

随着科技的快速发展&#xff0c;语音技术逐渐渗透到我们生活的各个领域&#xff0c;如智能家居、车载导航、手机通讯等。作为语音技术的核心&#xff0c;语音芯片在其中发挥着重要作用。今天&#xff0c;我们将深入探讨NRK3502这款先进的语音芯片IC的工作原理&#xff0c;以及它…

动态规划-路径问题——174.地下城游戏

1.题目解析 题目来源&#xff1a;174.地下城游戏 测试用例 2.算法原理 1.状态表示 通常dp[i,j]可以表示终点也可以表示起点&#xff0c;在本题中如果表示为终点&#xff0c;即勇士到[i,j]位置所需要的最小生命值&#xff0c;但是由于后续位置的未知无法向后继续判断&#xff…

如何判断外包建站公司靠谱与否?2024外包网站设计公司哪家好top3

要知道一家网站建设公司靠不靠谱&#xff0c;看他们合作过哪些公司就能知道个大概。 如果服务对象有各行业的头肩部企业&#xff0c;那这家网站建设公司在专业性上肯定是有保障的。 但是&#xff0c;靠谱并不意味着适合自己。 靠谱的网站建设公司其实在技术上都大差不差&…

我用这四款翻译工具,轻松搞定英文在线翻译

作为一名喜欢搜罗各种办公软件的打工人&#xff0c;今天我要和大家聊聊一个我们工作中不可或缺的技能——英文翻译。首先&#xff0c;我们得承认&#xff0c;翻译工作有时候真的很让人头疼&#xff0c;尤其是当我们面对一堆专业术语和长篇大论时。但自从我发现了这些翻译神器&a…

Linux系统:apt-get update 和apt update区别

apt-get update 和apt update区别 ‌apt-get update和apt update的主要区别在于它们所属的命令集以及在现代Ubuntu系统中的使用推荐。‌ ‌所属命令集‌&#xff1a;apt-get update是apt-get命令的一部分&#xff0c;而apt update是apt命令的一部分。apt是apt-get的替代工具&am…

《Image Processing GNN: Breaking Rigidity in Super-Resolution》CVPR2024

摘要 这篇论文提出了一种名为Image Processing Graph Neural Networks (IPG) 的模型&#xff0c;旨在通过利用图的灵活性来突破超分辨率&#xff08;Super-Resolution, SR&#xff09;中的固有刚性问题。在现有的SR模型中&#xff0c;无论是基于卷积神经网络&#xff08;CNNs&…

新手小白想快速上手Mac的使用必看问题

相信不论是现在还是将来&#xff0c;肯定还是会有Mac小白的存在&#xff0c;对于大多数人来说&#xff0c;从小接触Windows的机会比较多&#xff0c;Windows的使用也是比较多&#xff0c;但是有些朋友在大学的时候想体验一下Mac的感觉&#xff0c;于是果断下单&#xff0c;又或…

[C语言] 函数详解:库函数与自定义函数

文章目录 函数的概念库函数和自定义函数库函数使用库函数示例常用库函数及头文件 自定义函数自定义函数的基本结构示例&#xff1a;实现两个数的求和函数自定义函数的好处 函数的返回值有返回值的函数无返回值的函数 函数的声明与调用声明函数在另一个文件中调用函数示例&#…

51单片机的智能小区安防系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块时钟模块温度传感器烟雾传感器CO传感器红外感应传感器IC卡蓝牙继电器按键、蜂鸣器、LED等模块构成。适用于智能小区安防、智能家居安防等相似项目。 可实现功能: 1、LCD1602实时显示北京时间、温度、烟雾浓度和CO浓…

Kylin系统安装VMwareTools工具

如下图所示&#xff0c;安装好Kylin系统之后&#xff0c;还未安装VMwareTools工具&#xff0c;导致系统画面无法填充虚拟机 正常安装了VMwareTools工具后的系统画面 所以&#xff0c;接下来我们介绍一下如何在Kylin系统下安装VMwareTools工具 首先&#xff0c;点击VMware工具栏…

Android常用布局

目录 布局文件中常见的属性 1. 基本布局属性 1&#xff09;android:layout_width 2&#xff09;android:layout_height 3&#xff09;android:layout_margin 4&#xff09;android:padding 2. 线性布局 (LinearLayout) 属性 1&#xff09;android:orientation 2&#xff09;and…

深度学习神经网络笔记--卷积神经网络

为什么要用卷积 捕捉特征&#xff0c;如文末的图&#xff09;不受位置影响&#xff08;左右&#xff0c;前后&#xff0c;上下&#xff09;可以参考下图&#xff1a;卷积操作 可移动的小窗口与图像数据逐元素相乘后相加小窗口是滤波器&#xff0c;卷积核&#xff0c;&#xff0…