MyBatis01

article/2025/6/24 0:55:38

目录

一、Mybatis

1.1 什么是 MyBatis?

1.2 ORM思想

Hibernate

Mybatis(ibatis)

持久层技术对比

二、mybatis基础操作流程

2.1 引入jar包

2.2 mybatis核心配置文件

2.3 java文件和sql文件相分离

2.4 mybatis框架核心类,内部执行过程

MyBatis的核心类

内部执行流程

三、mybatis面向接口开发

3.1 先创建javabean对象,与数据库表保持一致

3.2  创建mapper接口,针对类中常见的增删改查方法的接口

3.3根据接口中的方法,在sqlMapper映射文件中写sql语句

3.4 测试类


一、Mybatis

1.1 什么是 MyBatis?

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

MyBatis是

框架:半成品,填充代码

支持自定义sql: 可以写sql语句

1.2 ORM思想

映射: 对象关系映射 ORM Object-Relational-Mapping 解决了java类和mysql数据库表的映射问题。

  • Hibernate

SSH框架 :Spring、Struts2、HIbernate

全自动的ORM框架(不需要写sql)

HIbernateUtil.query(User.class); 查询表中所有数据

HIbernateUtil.query(user); 查询当前对象相关的数据

开发效率高,运行效率低。

@TableName("user")
class User{@Column("id");private Integer id;@Oneprivate Role role;@Manyprivate List<Account> list;
}
  • Mybatis(ibatis)

SSM框架:Spring、Springmvc、Mybatis

半自动的ORM框架(需要写sql语句,但是不需要手动的给参数赋值以及手动的封装结果集)

持久层技术对比

对比维度JDBCHibernateMyBatis
底层/框架底层框架(全自动ORM)框架(半自动ORM)
运行效率最高最低中间
开发效率最低最高中间

二、mybatis基础操作流程

MyBatis中文网

2.1 引入jar包

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.17</version>
</dependency>
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope>
</dependency>
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>

2.2 mybatis核心配置文件

数据库环境配置
sqlmapper文件位置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--配置-->
<configuration><!--引入外部属性配置文件--><properties resource="db.properties"></properties><!--数据库连接环境配置  当前使用的默认环境--><environments default="development"><!--单独的环境 id="环境名 唯一标识"--><environment id="development"><!--事务管理 type="jdbc" 使用jdbc的事务管理机制--><transactionManager type="JDBC"/><!--数据源配置  type="POOLED|UNPOOLED" 使用连接池|不使用连接池--><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><!--多个环境--><environment id="test"><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><!--映射器 指定sqlMapper文件位置--><mappers><mapper resource="mapper/AccountMapper.xml"/></mappers>
</configuration>

2.3 java文件和sql文件相分离

先创建javabean对象,与数据库表保持一致

@Data
public class Account {private int id;private String name;private Double money;
}

sqlMapper映射文件

​​​​​​​<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--命名空间 唯一标识-->
<mapper namespace="com.hl.mybatis01.mapper"><!--id=“sql语句唯一标识” resultType="返回结果集类型"--><select id="findAccount" resultType="com.hl.mybatis01.pojo.Account">select * from account where id = #{id}</select>
</mapper>

2.4 mybatis框架核心类,内部执行过程

  • MyBatis的核心类

  1. 资源加载
    Resources 加载配置文件(如 mybatis-config.xml

  2. 工厂构建
    SqlSessionFactoryBuilder 解析配置,创建单例 SqlSessionFactory

  3. 会话创建
    SqlSessionFactory 为每个数据库操作创建独立的 SqlSession

  4. SQL 执行

    • 直接执行映射语句(已废弃方式)

    • 推荐方式:通过 getMapper() 获取 Mapper 接口代理

  • 内部执行流程

@Test
void query() throws IOException {//1、加载mybatis核心配置文件InputStream in = Resources.getResourceAsStream("mybatis-config.xml");//2、创建SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);//3、基于工厂获取会话连接SqlSession session = factory.openSession();//4、获取SqlMapper文件//5、执行sql语句   ——45一起执行Account account = session.selectOne("com.hl.mybatis01.mapper.findAccount", 1);System.out.println(account);//6、关闭流程session.close();}

三、mybatis面向接口开发

3.1 先创建javabean对象,与数据库表保持一致

@Data
public class Account {private int id;private String name;private Double money;
}

3.2  创建mapper接口,针对类中常见的增删改查方法的接口

package com.hl.mybatis01.mapper;import com.hl.mybatis01.pojo.Account;import java.util.List;public interface AccountMapper {
//    根据id查询单个账户Account findAccount(int id);
//    查询所有的账户List<Account> findAllAccount();
//更新一个账户  根据id更余额int updateAccount(Account account);
//    删除一个用户int deleteAccount(int id);
//    新增一个账户int insertAccount(Account account);}

3.3根据接口中的方法,在sqlMapper映射文件中写sql语句

其中的映射关系

  • 命名空间=接口全路径
  • sql的id=接口里面的方法名
  • resultType返回结果类型和方法的返回值类型一致
<?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.hl.mybatis01.mapper.AccountMapper">
<!--    写sql语句  id="sql语句的唯一标识"   resultType="返回结果集类型"--><select id="findAccount" resultType="com.hl.mybatis01.pojo.Account">select * from account where id = #{id}</select><!--    //    查询所有的账户-->
<!--    List<Account> findAllAccounts();--><select id="findAllAccount" resultType="com.hl.mybatis01.pojo.Account">select * from account</select>
<!--    //更新一个账户  根据id更余额--><!--    int updateAccount(Account account);--><update id="updateAccount" >update account set money= #{money} where id = #{id}</update><!--    //    删除一个用户-->
<!--    int deleteAccount(int id);--><delete id="deleteAccount">delete from account where id = #{id}</delete>
<!--    //    新增一个账户-->
<!--    int insertAccount(Account account);--><insert id="insertAccount">insert into account (name, money) values (#{name}, #{money})</insert></mapper>

3.4 测试类

package com.hl.mybatis01;import com.hl.mybatis01.mapper.AccountMapper;
import com.hl.mybatis01.pojo.Account;
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 org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;//@SpringBootTest
class MyBatis01ApplicationTests {
/*
MyBatis的核心类
Resources类
SqlSessionFactoryBuilder工厂建造者类
SqlSessionFactory工厂类
SqlSession会话*/@Testvoid query() throws IOException {
//        1、加载mybatis核心配置文件InputStream in=Resources.getResourceAsStream("mybatis-config.xml");
//        2、创建SqlSessionFactory工厂SqlSessionFactory factory= new SqlSessionFactoryBuilder().build(in);
//        3、基于工厂获取会话连接SqlSession session=factory.openSession();
//        4、获取SqlMapper文件   引号是sql语句的唯一标识=命名空间的唯一标识加sql语句的id
//        先获取接口文件,找到接口对象AccountMapper accountMapper = session.getMapper(AccountMapper.class);
//        5、执行sql语句
//        执行sql语句,得到account对象
//查询按id查询单个账户Account account = accountMapper.findAccount(1);System.out.println(account);
//查询全部List<Account> list = accountMapper.findAllAccount();System.out.println(list);//修改Account account1 = new Account();account1.setId(1);account1.setMoney(23450.0);int num = accountMapper.updateAccount(account1);System.out.println("更新的数据条数:" + num);
//新增Account account2 = new Account();account2.setName("王五");account2.setMoney(1000.0);int num2 = accountMapper.insertAccount(account2);System.out.println("插入的数据条数:" + num2);
//删除int num3 = accountMapper.deleteAccount(4);System.out.println("删除的数据条数:" + num3);//        !!!提交事务,如果不提交事务,数据不会更新到数据库,只针对增删改有效,产讯无效session.commit();//        6、关闭流程session.close();}}


http://www.hkcw.cn/article/WCejkStoOK.shtml

相关文章

C56-亲自实现字符串拷贝函数

一 strcpy简介 功能&#xff1a;将源字符串&#xff08;包括 \0&#xff09;复制到目标地址。 原型&#xff1a; char *strcpy(char *dest, const char *src);参数&#xff1a; dest&#xff1a;目标地址&#xff08;需足够大&#xff09;。src&#xff1a;源字符串&#xf…

设计模式——简单工厂模式(创建型)

摘要 本文主要介绍了简单工厂模式&#xff0c;包括其定义、结构、实现方式、适用场景、实战示例以及思考。简单工厂模式是一种创建型设计模式&#xff0c;通过工厂类根据参数决定创建哪一种产品类的实例&#xff0c;封装了对象创建的细节&#xff0c;使客户端无需关心具体类的…

山东大学软件学院项目实训-基于大模型的模拟面试系统-面试官和面试记录的分享功能(2)

本文记录在发布文章时&#xff0c;可以添加自己创建的面试官和面试记录到文章中这一功能的实现。 前端 首先是在原本的界面的底部添加了两个多选框&#xff08;后期需要美化调整&#xff09; 实现的代码&#xff1a; <el-col style"margin-top: 1rem;"><e…

【Hot 100】121. 买卖股票的最佳时机

目录 引言买卖股票的最佳时机我的解题 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标题&#xff1a;【Hot 100】121. 买卖股票的最佳时机❣️ 寄语&#xff1a;书到用时方恨少&#xff0c;事非经过不知难&#xff01; 引…

《Spring Cloud Gateway 快速入门:从路由到自定义 Filter 的完整教程》​

1.网关介绍 在前面的学习中&#xff0c;我们通过Eureka和Nacos解决了辅助注册&#xff0c;使用Spring Cloud LoadBalance解决了负载均衡的问题&#xff0c;使用OpenFeign解决了远程调用的问题。 但是当前的所有微服务的接口都是直接对外暴露的&#xff0c;外部是可以直接访问…

高并发抽奖系统优化方案

引子 最近接触了一个抽奖的项目&#xff0c;由于用户量比较大&#xff0c;而且第三方提供的认证接口并发量有限&#xff0c;为了保证服务的高可用性&#xff0c;所以对高并限制发有一定的要求。经过一系列研究和讨论&#xff0c;做出了以下一些优化方案。 需求分析 根据用户量…

【Doris基础】Apache Doris中的Segment详解:存储与查询的核心组件

目录 1 Segment概述 1.1 什么是Segment 1.2 Segment的重要性 2 Segment的物理结构 2.1 Segment文件组成 2.2 列数据存储格式 3 Segment的生命周期 3.1 Segment创建 3.2 Segment合并(Compaction) 3.3 Segment过期与清理 4 Segment与查询处理 4.1 查询中的Segment剪枝…

JAVA中的枚举

代码示例 理论 枚举的行为多态 public enum MyLockStrategy {SKIP_FAST(){Overridepublic boolean tryLock(RLock lock, MyLock prop) throws InterruptedException {return lock.tryLock(0, prop.leaseTime(), prop.unit());}},FAIL_AFTER_RETRY_TIMEOUT(){Overridepublic bo…

电脑驱动程序更新工具, 3DP Chip 中文绿色版,一键更新驱动!

介绍 3DP Chip 是一款免费的驱动程序更新工具&#xff0c;可以帮助用户快速、方便地识别和更新计算机硬件驱动程序。 驱动程序更新工具下载 https://pan.quark.cn/s/98895d47f57c 软件截图 软件特点 简单易用&#xff1a;用户界面简洁明了&#xff0c;操作方便&#xff0c;…

day61—DFS—省份数量(LeetCode-547)

题目描述 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市&#xff0c;组内不含其他没有相连的城市…

MySql(十)

目录 准备工作 1&#xff09;准备一张表 2&#xff09;插入数据 1.排序 1--asc 升序 2--desc 降序 3--组合排序 2.聚合函数 1.count(字段名) 2.sum(字段名) 3.max(字段名) 4.min(字段名) 5.avg(字段名) 准备工作 1&#xff09;准备一张表 CREATE table role(roleid INT PRIMAR…

LabVIEW Val (Sgnl) 属性

在 LabVIEW 事件驱动架构中&#xff0c;Val (Sgnl) 属性&#xff08;Value (Signaling)&#xff09;是实现编程触发与用户交互行为一致性的关键技术。与普通 Value 属性不同&#xff0c;Val (Sgnl) 在修改控件值的同时强制生成值改变事件&#xff0c;确保程序逻辑与 UI 交互保持…

解常微分方程组

Euler法 function euler_method % 参数设置 v_missile 450; % 导弹速度 km/h v_enemy 90; % 敌艇速度 km/h % 初始条件 x0 0; % 导弹初始位置 x y0 0; % 导弹初始位置 y xe0 120; % 敌艇初始位置 y t0 0; % 初始时间 % 时间步长和总时间 dt 0.01; % 时间步长 t_final …

「Java教案」数据类型、变量与常量

课程目标 1&#xff0e;知识目标 能够根据Java基本数据类型的分类、存储规则及适用场景&#xff0c;合理的选择数据类型。能在合适的场景下正确声明和定义变量和常量。能够根据显式和隐式数据类型转换的规则与风险&#xff0c;合理的进行数据类型转换。 2&#xff0e;能力目…

本地部署基于 Kibana 开源搜索引擎 Elasticsearch 并实现外部访问

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。Kibana 是一个开源可视化工具&#xff0c;用于与 Elasticsearch 进行集成&#xff0c;提供大量数据分析。 本文将详细的介绍如何利用 Docker 在本地部署…

【Ollama】windows部署ollama并运行模型

一、Ollama安装 1.下载Ollama 官网&#xff1a;https://ollama.com/ 2.安装 点击下载 安装完成后打开cmd窗口 键盘按住WinR输入cmd 3.Ollama常用指令 指令说明ollama list查看本地已下载的模型列表ollama pull <模型名>下载模型&#xff08;如 ollama pull llama…

Linux入门(十二)服务管理

服务本质就是进程&#xff0c;但是在后台运行&#xff0c;通常会监听某个端口&#xff0c;等等其他的程序来访问 systemctl 管理指令 systemctl [start | stop | restart | reload | status ] systemctl status NetworkManagersystemctl 服务是在/usr/lib/systemd/system 查看 …

在Ubuntu20.04上安装ROS Noetic

本章教程,主要记录在Ubuntu20.04上安装ROS Noetic。 一、添加软件源 sudo sh -c . /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list二、设置秘钥 …

Linux 库制作与原理

文章目录 1. 库的概念2. 静态库2.1 静态库的制作2.2 静态库的原理 3. 动态库的制作4.ELF文件4.1 ELF文件内容4.2 ELF文件链接与加载 5. ELF与进程地址空间&#xff0c;动静态链接和库5.1 ELF与静态链接5.2 ELF与进程地址空间5.3 ELF与动态链接、动态库5.3.2 动态库5.3.2 动态链…

26考研——文件管理_文件目录(4)

408答疑 文章目录 二、文件目录1、目录的作用与结构1.1、目录的基本概念1.2、目录的组织形式1.2.1、单级目录结构1.2.2、两级目录结构1.2.3、多级&#xff08;树形&#xff09;目录结构1.2.4、无环图目录结构 1.3、目录的实现方式1.3.1、线性列表1.3.2、哈希表 2、文件共享与链…