MyBatis的原始使用

news/2026/1/26 16:07:48/文章来源:https://www.cnblogs.com/huaguoniang/p/19534009

友情:原文链接:https://www.huaguoniang.top/archives/mybatisde-yuan-shi-shi-yong

背景

MyBatis作为java用户的主流ORM框架,在集成了Spring之后,大大提高了我们开发的效率。但是有没有想过,假如没有集成Spring,如何使用MyBatis呢?

本文将通过MyBatis的原始使用(没有依赖Spring,甚至没有IOC注入),来加深对MyBatis的原理理解。

原始使用

1. 依赖

<dependencies><!--mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.15</version></dependency><!--Junit依赖,用来执行单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version></dependency></dependencies>

2. 数据库表

-- auto-generated definition
create table user
(id     int unsigned auto_increment comment 'ID'primary key,name   varchar(100)     null comment '姓名',age    tinyint unsigned null comment '年龄',gender tinyint unsigned null comment '性别, 1:男, 2:女',phone  varchar(11)      null comment '手机号'
)comment '用户表';

3. 实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private Integer id;private String name;private int age;private int gender;private String phone;}

4. Mapper接口类

public interface UserMapper {int insert(User user);
}

5. Mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.qiang.dao.UserMapper"><insert id="insert">insert into User (id, name, age, gender, phone)value (#{id}, #{name}, #{age}, #{gender}, #{phone})</insert></mapper>

6. Service

public class UserServiceImpl {public String addUser(User user){if (user.getName().isEmpty()) {throw new RuntimeException("用户名不能为空");}return DaoUtils.execute(sqlSession -> {UserMapper mapper = sqlSession.getMapper(UserMapper.class);int count = mapper.insert(user);return count>0 ? "添加成功" : "添加失败";});}
}

7. 配置

jdbc.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username=root
password=1234

mybatis.config.xml

<?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><!--    加载resource资源包下的properties文件--><properties resource="jdbc.properties"/><settings><!--将表中字段的下划线自动转换为驼峰--><setting name="mapUnderscoreToCamelCase" value="true"/><!--开启延迟加载--><setting name="lazyLoadingEnabled" value="true"/></settings><!--    设置类型别名   将user /  User 自动映射为com.qiang.entity.User  在mapper.xml中不用写全类名 --><typeAliases><package name="com.qiang.entity"/></typeAliases><!--    配置连接数据库的环境--><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><!--    引入映射文件--><mappers><package name="com.qiang.dao"/></mappers>
</configuration>

8. DaoUtils

public class DaoUtils {private static SqlSessionFactory factory;static {String resource = "mybatis-config.xml";InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream(resource);} catch (IOException e) {System.err.println("read mybatis-config.xml fail");e.printStackTrace();System.exit(1);}// 加载完mybatis-config.xml配置文件之后,会根据其中的配置信息创建SqlSessionFactory对象factory = new SqlSessionFactoryBuilder().build(inputStream);}public static <R> R execute(Function<SqlSession, R> function) {// 创建SqlSessionSqlSession session = factory.openSession();try {R apply = function.apply(session);// 提交事务session.commit();return apply;} catch (Throwable t) {// 异常,回滚事务session.rollback();System.out.println("execute error");throw t;} finally {// 关闭SqlSessionsession.close();}}
}

9. 测试

package com.qiang;import com.qiang.entity.User;
import com.qiang.service.UserServiceImpl;
import org.junit.Test;public class test {private UserServiceImpl userService;@Testpublic void test1(){userService = new UserServiceImpl();String result = userService.addUser(new User(1, "小王", 18, 1, "123456789"));System.out.println(result);}
}

SpringBootStarter使用

Spring Boot Starter集成

    <dependencies><!--mybatis依赖--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>2.5.4</version><scope>test</scope></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.15</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version></dependency></dependencies>
spring:data:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8username: rootpassword: 1234
@Service
public class UserServiceImpl {@Autowiredprivate UserMapper userMapper;public String addUser(User user){int count = userMapper.insert(user);return count>0 ? "添加成功" : "添加失败";}
}
@SpringBootTest
@ComponentScan(basePackages = "com.qiang")
public class test {@Autowiredprivate UserServiceImpl userService;@Testpublic void test1(){String result = userService.addUser(new User(3, "小王2", 18, 1, "123456789"));System.out.println(result);}
}

结语

原始使用的方式:

  • 配置MyBatis-Config

  • 使用Utils读取配置,创建sqlSession

  • 执行的时候,要通过sqlSession获取对应的mapper

  • 使用获取的mapper执行

Spring Boot + mybatis-spring-boot-starter的方式

  • 自动创建 SqlSessionFactory(单例托管到 Spring 容器)

  • 自动创建 SqlSession 并绑定到 当前线程SqlSessionTemplate

  • 事务直接交给 Spring 的声明式事务 (@Transactional),底层帮你 commit / rollback / close
    ---- 模板代码全没了,不需要 DaoUtils


我们要学的是MyBatis的框架原理,所以先从MyBatis的原始使用入手,学习一下基本的执行步骤,后续会慢慢深入到更加细节的内容中。

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

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

相关文章

Dify 接入Coze 平台语音合成插件(MCP 服务)实战教程

&#x1f310; 简介 在 AI 应用开发中&#xff0c;语音合成&#xff08;Text-to-Speech, TTS&#xff09; 是提升用户体验的重要功能。本文将详细介绍如何在 Coze 平台上&#xff0c;通过 MCP 服务&#xff08;HTTP 类型&#xff09; 接入第三方语音合成插件&#xff0c;并完成…

java 社招面试题:Redis 如何做大量数据插入?

大家好,我是 31 岁、依旧热爱折腾技术的小米。 有一次,我凌晨两点被拉进一个紧急会议。线上没挂,接口也没超时,但业务同学一句话把我整清醒了:“历史数据导入 Redis,要 6 个小时,老板等不了。” 那一刻,我脑子里只剩一个问题:Redis,不就是个快得离谱的内存数据库吗…

加州大学构建基于全连接神经网络的片上光谱仪,在芯片级尺寸上实现8纳米的光谱分辨率

如今&#xff0c;智能手机摄像头已进入亿级像素时代&#xff0c;能够捕捉细节丰富的图像&#xff0c;却依然无法像专业光谱仪那样解析物质的化学成分&#xff0c;例如实现水果糖度的无损检测、皮肤健康评估或环境中微量污染物的识别。这一能力差距的关键&#xff0c;在于手机等…

TRELLIS.2:采用 O-Voxel 技术,高效生成复杂 3D 几何与材质;Patient Churn Prediction 数据集:帮助识别有流失风险的患者

当前&#xff0c;从图片生成可用 3D 模型仍然费时费力&#xff0c;传统流程耗时且高度依赖专业建模师手动操作。即便有 AI 辅助&#xff0c;处理复杂形状、透明材质或开放表面时&#xff0c;模型常效果不佳或出现异常结构&#xff0c;且难以生成可直接用于游戏、电商的带逼真材…

加过滤抗干扰的电化学氧电池O2-C2在烟气分析仪上的氧气监测

一、什么是烟气分析仪烟气分析仪是利用传感器对大气环境中的O2&#xff0c;CO&#xff0c;NO&#xff0c;NO2&#xff0c; NOx&#xff0c;SO2&#xff0c;烟尘&#xff0c;排烟温度&#xff0c;烟道压力&#xff0c;燃烧效率及过剩空气系数等烟气含量进行连续测量分析的设备。…

OpenCode 企业级 Docker 部署完整指南

OpenCode 是一个开源的 AI 编程助手与代码代理&#xff08;coding agent&#xff09;&#xff0c;旨在让开发者在终端、IDE 或桌面环境下高效地与 AI 协同开发、分析、生成和重构代码。它支持多种大型语言模型&#xff08;LLM&#xff09;&#xff0c;包括 Claude、OpenAI、Goo…

最全的光模块介绍

光模块&#xff08;Optical Modules&#xff09;作为光纤通信中的重要组成部分&#xff0c;是实现光信号传输过程中光电转换和电光转换功能的光电子器件。 光模块工作在OSI模型的物理层&#xff0c;是光纤通信系统中的核心器件之一。它主要由光电子器件&#xff08;光发射器、光…

基于spring的毕业生就业跟踪系统[spring]-计算机毕业设计源码+LW文档

摘要&#xff1a;随着高等教育的普及&#xff0c;毕业生数量逐年增加&#xff0c;就业跟踪成为高校了解毕业生就业状况、优化人才培养方案的重要手段。本文介绍了一个基于Spring框架的毕业生就业跟踪系统的设计与实现。该系统采用B/S架构&#xff0c;利用Spring、Spring MVC、M…

交换机如何搭配光模块使用,这几种方法非常实用

在企业网络部署、数据中心建设都离不开光模块与交换机。光模块主要是用来将电信号与光信号进行转换&#xff0c;而交换机则是对光电信号起到转发作用。在众多光模块中&#xff0c;SFP光模块是目前被应用的最多的光模块之一&#xff0c;在与交换机搭配使用时采用不同的连接方式可…

JVM 标准到底如何定义类加载

内容来自 JVMS Chapter 5 – Loading, Linking, and Initialization&#xff08;类加载、链接、初始化&#xff09;&#xff0c;这是 JVM 规范中对类加载的正式描述。这不是教材版&#xff0c;而是接近 JVM 规范原文的专业总结版。 JVM 不定义类加载器的层次结构、不强制双亲委…

大厂Java面试汇总(2026年面试真题答案解析)

进大厂是大部分程序员的梦想&#xff0c;而进大厂的门槛也是比较高的&#xff0c;所以这里整理了一份阿里、美团、滴滴、头条等大厂面试大全&#xff0c;其中概括的知识点有&#xff1a;Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spr…

指纹浏览器内核层沙箱隔离技术的设计与实现

在多账号合规运营场景下&#xff0c;指纹浏览器的核心技术壁垒在于底层隔离的有效性&#xff0c;传统应用层参数伪装方案因未解决资源共享问题&#xff0c;极易被平台风控系统识别。本文从内核改造角度&#xff0c;深入分析进程级沙箱隔离的技术实现&#xff0c;包括资源隔离的…

动态指纹生成技术在指纹浏览器中的应用与对抗策略

随着平台风控系统进入机器学习与大数据分析阶段&#xff0c;静态指纹伪装方案因特征固定、仿真度低、易被拟合等问题&#xff0c;抗检测能力持续下滑。动态指纹生成技术通过实时生成高仿真、差异化的设备指纹&#xff0c;成为指纹浏览器突破风控的核心技术&#xff0c;本文从指…

多维融合破局,智测锂电未来 —— 维视智造 VisionCon 重磅发布锂电蓝膜检测创新方案

2026 年 1 月 22 日&#xff0c;古城西安迎来行业盛会 —— 由雅时国际商讯倾力打造的 VisionCon 视觉系统设计技术会议盛大启幕&#xff0c;本次会议以 “机器视觉赋能数智化生产” 为核心主题&#xff0c;汇聚全球机器视觉领域的技术先锋、行业大咖与企业代表&#xff0c;聚焦…

UNet人脸融合夜间拍摄能用吗?光线均匀更重要

UNet人脸融合夜间拍摄能用吗&#xff1f;光线均匀更重要 很多人第一次尝试UNet人脸融合时&#xff0c;都会遇到一个扎心的问题&#xff1a;白天拍的照片效果自然&#xff0c;晚上或室内灯光下拍的图&#xff0c;融合后却像戴了面具——肤色不均、五官模糊、边界生硬&#xff0…

CH340驱动在Windows系统的安装与调试完整指南

以下是对您提供的博文内容进行 深度润色与结构重构后的专业级技术文章 。我以一名嵌入式系统教学博主 资深驱动开发工程师的双重身份&#xff0c;对原文进行了全面升级&#xff1a; ✅ 彻底去除AI痕迹 &#xff1a;摒弃模板化表达、空洞总结和机械罗列&#xff0c;代之以…

新手必看:aarch64汇编启动文件.S常见写法梳理

以下是对您提供的博文内容进行深度润色与结构重构后的技术文章。整体遵循您的全部要求&#xff1a;✅ 彻底去除AI痕迹&#xff0c;语言自然如资深嵌入式工程师面对面讲解&#xff1b;✅ 打破模块化标题束缚&#xff0c;以逻辑流替代“引言/小节/总结”套路&#xff1b;✅ 核心知…

langchain 快速入门(五):Langgraph应用,执行流程由线转图

简介 Langgraph是langchain框架提供的一个组件,langgraph能够解决AI执行流程中迭代、循环或者根据结果返回上一步,与之前讲的chain链相比,能够实现更加复杂的AI执行流。 langgraph 从chain转到langgraph从数学的角度…

2026雅思网课一对一培训机构排行推荐,精准适配全阶段备考提分需求

在雅思备考赛道中,培训选课始终是考生绕不开的核心难题。官方数据显示,中国大陆学术类雅思考生整体均分为5.9分,其中写作5.7分、口语5.5分持续低于全球均值,多数考生在考试冲刺阶段因缺乏优质提分技巧、靠谱的个性…

【2026最新】盘点管道岩棉保温行业趋势及五大知名施工企业

一、行业发展核心驱动力盘点(一)政策导向赋能行业升级在“双碳”战略目标的引领下,各行业节能改造进程持续提速,政府出台的专项补贴政策与强制性规范(例如《公共建筑节能设计标准》),正加速岩棉材料对传统保温材料的…