ORM、Mybatis和Hibernate、Mybatis使用教程、parameterType、resultType、级联查询案例、resultMap映射

DAY21.1 Java核心基础

ORM

Object Relationship Mapping 对象关系映射

面向对象的程序到—关系型数据库的映射

比如java – MySQL的映射

ORM框架就是实现这个映射的框架

Hibernate、Mybatis、MybatisPlus、Spring Data JPA、Spring JDBC

Spring Data JPA的底层就是Hibernate

Mybatis和Hibernate

Mybatis是一个JDBC封装的工具,是帮助开发者实现数据持久化 工作的框架

Mybatis和Hibernate的区别?

Mybatis:半自动框架,Mybatis没有实现java对象到数据库表的映射,只实现了java程序和sql之间的映射

Hibernate:全自动框架,开发者只需要调用接口就可以完成相关的操作,整个框架已经封装好,不需要开发者关注

但是全自动框架不灵活,有些业务场景实现并不方便,半自动框架灵活,可以根据具体业务来写sql,更适合现代企业级项目的开发

Mybatis的优缺点

优点:

  • 极大简化了JDBC的开发
  • 更好上手,有更好的灵活性
  • 通过定义sql在xml文件里面降低程序的耦合度
  • 支持动态sql,可以根据业务灵活实现需求

缺点:

  • 数据库迁移的时候需要更改大量的sql语句
  • 相较于Hibernate,需要完成更多的工作,定义sql,设置sql与数据库表的关系

使用教程

使用原生接口:

创建maven工程,导入相关依赖

    <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.31</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.8</version></dependency>

创建实体类User

@Data
public class User  {private Integer id;private String name;private String pwd;private String email;
}

在resource创建一个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><!-- 配置MyBatis运行环境 --><environments default="development"><environment id="development"><!-- 配置JDBC事务管理 --><transactionManager type="JDBC"></transactionManager><!-- 数据源 --><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mytest1"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments>
</configuration>

两种使用方式:

  • 使用原生接口

  • 使用mapper代理

使用原生接口

创建mapper文件

namespace:通常设置为文件所在包名和文件

UserMapper.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.shuwu.mapper.UserMapper"><select id="get" parameterType="int" resultType="com.shuwu.entity.User">select * from user where id = #{id}</select>
</mapper>

在配置文件添加注册mapper,让配置文件可以扫描到

<mappers><mapper resource="com/shuwu/mapper/UserMapper.xml"></mapper>
</mappers>

测试用例:

public class Test {public static void main(String[] args) {// 找到类加载器,通过配置文件的输入流然后创建一个SqlSession工厂InputStream resourceAsStream = Test.class.getClassLoader().getResourceAsStream("com/mybatis-config.xml");SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();SqlSessionFactory build = sqlSessionFactoryBuilder.build(resourceAsStream);// 获取sqlsessionSqlSession sqlSession = build.openSession();// 调用Mybatis原生接口执行sqlString statement = "com.shuwu.mapper.UserMapper.get";User user = sqlSession.selectOne(statement, 1);System.out.println(user);}
}

测试结果:

image-20250407105705462

要确保数据库里面有对应的表结构

1、通过配置文件创建 MyBatis 环境(数据源、Mapper)

2、构建环境需要使用 SqlSessionFactory

使用mapper代理实现自定义接口

自定义接口,开发者只需要定义,不需要实现

定义mapper接口

public interface UserMapper {public User getUserById(Integer id);public List<User> getAllUser();
}

mapper接口映射的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.shuwu.mapper.UserMapper"><select id="getUserById" resultType="com.shuwu.entity.User">select * from user where id = #{id}</select><select id="getAllUser" resultType="com.shuwu.entity.User">select * from user</select>
</mapper>

要注意!!

  • namespace需要指定到mapper接口的文件
  • 方法名和xml里面的id必须一致
  • 返回值的resultType的放回类型必须一致
  • 方法传递参数名字必须对应,如果不一致可以用@Param来声明参数名字

比如:

 public User getUserById(@Param("id") Integer id2);

增加、删除、修改用户

<?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.shuwu.mapper.UserMapper"><insert id="addUser">insert into user(name,pwd,email) values(#{name},#{pwd},#{email})</insert><update id="updateUser" parameterType="com.shuwu.entity.User">update user set name=#{name},pwd=#{pwd},email=#{email} where id = #{id}</update><delete id="deleteUser" parameterType="integer">delete from user where id = #{id}</delete><select id="getUserById" resultType="com.shuwu.entity.User">select * from user where id = #{id}</select><select id="getAllUser" resultType="com.shuwu.entity.User">select * from user</select>
</mapper>
public interface UserMapper {public User getUserById(@Param("id") Integer id2);public List<User> getAllUser();public int addUser(User user);public int deleteUser(@Param("id") Integer id);
}
public static void main(String[] args) {// 找到类加载器,然后创建一个工厂InputStream resourceAsStream = Test.class.getClassLoader().getResourceAsStream("com/mybatis-config.xml");SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();SqlSessionFactory build = sqlSessionFactoryBuilder.build(resourceAsStream);// 获取sqlsessionSqlSession sqlSession = build.openSession();// 获取接口的代理对象UserMapper mapper = sqlSession.getMapper(UserMapper.class);// 添加用户mapper.addUser(new User(null,"shuwu","123","123@qq.com"));// 根据id删除用户mapper.deleteUser(4);// 根据User的id修改用户信息mapper.updateUser(new User(1,"shuwu","123","123@qq.com"));// 提交事务sqlSession.commit();
}

增删改 数据库的时候要注意需要提交事务,不然MySQL只会保存不会添加进数据库

sqlSession.commit();

Mapperxml

全局配置文件 mybatis-config.xml

Mapper 配置文件 UserMapper.xml

mybatis-config.xml:主要用来定义数据源信息和一些基本配置,事务管理、打印 SQL,开启二级缓存、设置延迟加载

UserMapper.xml:定义对应接口方法的 SQL 实现,需要在 mybatis-config.xml 中进行注册才可以使用

半自动化的 ORM 框架,SQL 需要开发者自定义,MyBatis 关注的是 Java 对象和 SQL 之间的关系,SQL 语句是在 Mapper.xml 中定义

parameterType

参数数据类型介绍

包装类型

Integer类型

public int deleteUser(@Param("id") Integer id);
<delete id="deleteUser" parameterType="integer">delete from user where id = #{id}
</delete>

用户的SQL语句是where id = #{id},这里的id可能是int或Integer。如果调用这个方法时传入的是单个参数,比如Integer,MyBatis会自动识别参数类型,不需要显式指定parameterType。

String类型

public User getByUserName(@Param("name") String name);
<select id="getByUserName" resultType="com.shuwu.entity.User">select * from user where name=#{name}
</select>

基本数据类型

int、flout、double…

public User getByAge(int age);
<select id="getByAge" parameterType="int" resultType="com.southwind.entity.User">select * from user where age = #{age}
</select>

实体类

public List<User> getAllUser();
<select id="getAllUser" resultType="com.shuwu.entity.User">select * from user
</select>

5、多个参数

public User getUsernameAndAge(String username,Integer age);
<select id="getUsernameAndAge" resultType="com.southwind.entity.User">select * from user where username = #{param1} and age = #{param2}
</select>

resultType

返回类型

1、基本数据类型

public int getCount();
<select id="getCount" resultType="int">select count(*) from user
</select>

2、包装类

public Integer getCount2();
<select id="getCount2" resultType="java.lang.Integer">select count(*) from user
</select>

3、String

public String getUsernameById(Integer id);
<select id="getUsernameById" parameterType="java.lang.Integer" resultType="java.lang.String">select username from user where id = #{id}
</select>

4、实体类

public User getById(Integer id);
<select id="getById" parameterType="java.lang.Integer" resultType="com.southwind.entity.User">select * from user where id = #{id}
</select>

级联查询

实际开发中常见的是一对多和多对多关系

如果要查询学生信息和班级信息的关系呢?

SELECT student.id sid, student.`name` sname,class.id cid,class.`name` cname from student,class where student.cid = class.id

怎么在java程序中实现呢

先定义一个可以接收这个参数的student对象

@Data
public class Student  {private Integer id;private String name;private Class clazz;
}
@Data
public class Class  {private Integer id;private String name;
}

但是有时候这个字段和数据库里面的字段不匹配怎么办呢?

这个clazz怎么和数据库对应呢?

这个时候就需要写一个字段映射了

mapper接口

public List<Student> getAllStudent();

xml映射

通过使用 resultMap="StudentMap"来设置一个返回值的字段映射

<resultMap id="StudentMap" type="com.shuwu.entity.Student"><id property="id" column="sid"/><result property="name" column="sname"/><association property="clazz" javaType="com.shuwu.entity.Class"><id property="id" column="cid"/><result property="name" column="cname"/></association></resultMap><select id="getAllStudent" resultType="com.shuwu.entity.Student" resultMap="StudentMap">SELECT student.id sid, student.`name` sname,class.id cid,class.`name` cname from student,class where student.cid = class.id
</select>

测试输入:

System.out.println(mapper.getAllStudent());

image-20250407225235917

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

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

相关文章

【学习自用】配置文件中的配置项

server.port服务器端口&#xff0c;常被用于指定应用程序运行时所监听的端口号spring.datasource.url用于配置数据源的数据库连接URLspring.datasource.username用于指定连接数据库的用户名spring.datasource.password用于配置数据源时设置数据库连接密码的属性mybatis.mapper-…

使用protobuf编译提示无法打开包括文件: ‘absl/log/absl_log.h’: No such file or directory

问题原因 Protobuf 依赖 Abseil&#xff1a; Protobuf 3.20 版本开始依赖 Abseil&#xff0c;但你的系统未正确安装或配置 Abseil。 头文件路径未包含&#xff1a; 编译器找不到 absl/log/absl_log.h&#xff0c;可能是因为 Abseil 未正确安装或未在项目中设置包含路径。 …

Spring AI Alibaba 文档检索使用

一、文档检索 (Document Retriever)简介 1、核心概念 文档检索&#xff08;DocumentRetriever&#xff09;是一种信息检索技术&#xff0c;旨在从大量未结构化或半结构化文档中快速找到与特定查询相关的文档或信息。文档检索通常以在线(online)方式运行。 DocumentRetriever通…

前端面试核心知识点整理:从 JavaScript 到 Vue 全解析

一、JavaScript 异步编程核心:Promise 与 async/await 1. Promise 深度解析 定义:Promise 是处理异步操作的对象,代表一个异步操作的最终状态(成功 / 失败)。三种状态: pending(进行中):初始状态,异步操作未完成。fulfilled(已成功):异步操作成功,调用 resolve …

音视频(四)android编译

前言 前面已经讲了在windows上应用了&#xff0c;这章主要讲述android上编译 1&#xff1a;环境 git 如果失败 直接跑到相应网站 手动下载 ubuntu22.* android ndk r21e download:https://developer.android.google.cn/ndk/downloads/index.html?hluk 为什么用这个&#xff0…

【kind管理脚本-3】脚本函数说明文档 —— 便捷使用 kind 创建、删除、管理集群脚本

下面是一份详细的说明文档&#xff0c;介绍该脚本的功能、用法及各部分的含义&#xff0c;供您参考和使用&#xff1a; Kind 集群管理脚本说明文档 此脚本主要用于管理 Kind&#xff08;Kubernetes IN Docker&#xff09;集群&#xff0c;提供创建、删除、导出 kubeconfig、加…

【计算机行业发展与重塑】

计算机行业正经历前所未有的变革&#xff0c;AI技术的爆发式发展与产业升级的深度融合&#xff0c;正在重塑行业格局与就业市场。以下从行业趋势、AI的核心价值、就业需求三个维度展开分析。 一、行业趋势&#xff1a;AI驱动下的多极增长 AI成为核心引擎 生成式AI的突破&#…

(高频SQL50题)1667. 修复表中的名字

问题 表&#xff1a; Users ------------------------- | Column Name | Type | ------------------------- | user_id | int | | name | varchar | ------------------------- user_id 是该表的主键(具有唯一值的列)。 该表包含用户的 ID 和名字…

基于人工智能的医学影像关联分析:利用潜在空间几何混杂因素校正法|文献速递-深度学习医疗AI最新文献

Title 题目 AI-based association analysis for medical imaging using latent-spacegeometric confounder correction 基于人工智能的医学影像关联分析&#xff1a;利用潜在空间几何混杂因素校正法 01 文献速递介绍 人工智能&#xff08;AI&#xff09;已成为各个领域的…

开源免费虚拟化软件PVE功能介绍

Proxmox VE&#xff08;PVE&#xff09;提供了一个基于 Web UI&#xff08;管理界面&#xff09;的虚拟化管理平台&#xff0c;用户可以通过浏览器管理 虚拟机&#xff08;VM&#xff09;、容器&#xff08;LXC&#xff09;、存储、网络、备份、用户权限等。 一、PVE Web 界面…

新球体育比分状态监控

文章目录 目标分析监控逻辑代码目标分析 网页监控地址:aHR0cHM6Ly9saXZlLnRpdGFuMDA3LmNvbS9pbmRleDJpbjEuYXNweD9pZD0x 监控逻辑 比分等数据主要是依赖JS加载得到,通过ajax后端进行渲染 代码 # -*- coding: utf-8 -*-import warnings warnings.filterwarnings(ignore) f…

【lodash的omit函数详解 - 从入门到精通】

lodash的omit函数详解 - 从入门到精通 小白视角&#xff1a;什么是omit&#xff1f; omit在英文中意为"忽略"或"省略"。在编程中&#xff0c;它就是从一个对象中删除不需要的属性&#xff0c;返回一个新对象。 // 原始对象 const person {name: "…

软考笔记9——数据库技术基础

第九章节——数据库技术基础 数据库技术基础 第九章节——数据库技术基础一、基本概念1. 数据库与数据库系统2. 数据库的三级模式2.1 内模式2.2 概念模式2.3 外模式2.4 数据库的两级映射2.5 数据库设计的基本步骤 二、数据模型1. 基本概念2. E-R模型2.1 实体2.2 联系2.3 属性 3…

Django分页教程及示例

推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 完整代码示例:结论Django的分页模块允许你将大量数据分割成更小的块(页面)。这对于以可管理的方式显示项目列表,如博客文章或产品…

int 与 Integer 的区别详解

1. 本质区别 特性intInteger类型基本数据类型&#xff08;Primitive&#xff09;包装类&#xff08;Wrapper Class&#xff09;存储位置栈&#xff08;或作为对象成员在堆中&#xff09;堆&#xff08;对象实例&#xff09;默认值0null&#xff08;可能导致 NullPointerExcept…

mariadb使用docker compose方式安装

问题 本地mac m1上面的mysql和mariadb突然不用使用了&#xff0c;重新安装也不想&#xff0c;最近mac系统也更新了&#xff0c;brew也更新了&#xff0c;重新安装mariadb还是不能正常使用&#xff0c;现在我打算使用docker来安装本地的mariadb了。 默认配置文件my.cnf 从容器…

基于React + Antd + Java的OFD文件上传预览实现方案(OFD文件转图片)

一、前端实现方案(React + Antd) import React, {useState } from react; import {Upload, Button, Image, Carousel } from antd; import {UploadOutlined } from @ant-design/icons;const OFDUploadPreview = () => {const [previewImages, setPreviewImages] = useSta…

从零构建大语言模型全栈开发指南:第四部分:工程实践与部署-4.3.1LangChain与Dify平台实战:从RAG到Agent工作流

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 LangChain与Dify平台实战:从RAG到Agent工作流 - 4.3.1 LangChain与Dify平台实战:从RAG到Agent工作流1. LangChain核心组件与RAG架构设计1.1 LangChain核心模块1.2 RAG架构实现流程2. RAG实战:企业知识…

操作 Office Excel 文档类库Excelize

Excelize 是 Go 语言编写的一个用来操作 Office Excel 文档类库&#xff0c;基于 ECMA-376 OOXML 技术标准。可以使用它来读取、写入 XLSX 文件&#xff0c;相比较其他的开源类库&#xff0c;Excelize 支持操作带有数据透视表、切片器、图表与图片的 Excel 并支持向 Excel 中插…

R Excel 文件:高效数据处理与可视化工具的完美结合

R Excel 文件&#xff1a;高效数据处理与可视化工具的完美结合 引言 在数据分析和处理领域&#xff0c;R语言因其强大的数据处理能力和丰富的可视化功能而备受青睐。而Excel作为最常用的电子表格软件&#xff0c;其广泛的应用也使得R与Excel的结合成为数据处理与可视化的理想…