SpringBoot新手快速入门系列教程六:基于MyBatis的一个简单Mysql读写例子

MyBatis和JPA是两种不同的Java持久层框架,各有其优缺点。以下是它们的比较:

MyBatis

优点
  1. 灵活性高:MyBatis允许手动编写SQL查询,可以完全控制SQL执行过程,非常适合复杂的查询和需要高度优化的查询。
  2. SQL分离:SQL语句可以单独存放在XML文件中,便于维护和管理。
  3. 易于学习和使用:MyBatis的学习曲线相对较低,开发者只需掌握SQL和基本的配置即可使用。
  4. 数据库无关性:MyBatis支持多种数据库,可以方便地切换数据库。
  5. 性能:由于手动编写SQL,可以对SQL进行细粒度的优化,性能上有优势。
缺点
  1. 代码冗余:需要手动编写SQL和映射配置,代码量较大,容易出现重复代码。
  2. 缺乏对象关系映射:MyBatis主要处理SQL和数据库的映射,缺乏JPA那样的对象关系映射能力,不适合复杂的对象关系管理。
  3. 维护成本高:由于手动编写SQL,随着项目复杂度增加,维护和管理SQL语句的成本也会增加。

JPA (Java Persistence API)

优点
  1. 对象关系映射:JPA提供了强大的对象关系映射能力,能自动处理对象与数据库表之间的关系,减少了开发者手动处理的工作量。
  2. 自动生成SQL:JPA可以根据实体类自动生成SQL语句,简化了开发过程。
  3. 统一接口:JPA提供了统一的接口,方便切换不同的JPA实现(如Hibernate、EclipseLink等)。
  4. 缓存机制:JPA支持一级和二级缓存机制,可以提高查询性能。
  5. 规范化:作为Java EE的一部分,JPA是一个标准,具有较好的兼容性和可移植性。
缺点
  1. 性能问题:由于自动生成SQL,可能生成的SQL不够优化,影响性能。
  2. 学习曲线陡峭:JPA的学习曲线较高,需要理解实体类、关系映射、查询语言(JPQL)等概念。
  3. 灵活性不足:对一些复杂查询或性能要求较高的查询,JPA的自动生成SQL可能无法满足需求,手动优化SQL的能力有限。
  4. 配置复杂:对于大型项目,JPA的配置和调优可能相对复杂。

总结

  • MyBatis 适合对SQL控制要求高、查询复杂、性能要求高的项目。
  • JPA 适合需要对象关系映射、开发效率高、对标准化和兼容性有要求的项目。

本教程会省略很多IDEA的基础用法以及,MySql的基础知识。如果对此不太熟悉的读者劳烦移步我的前一个教程,略微详细展示了以上基础知识。

SpringBoot新手快速入门系列教程四:创建第一个SringBoot的API-CSDN博客

1,新建HelloMyBatis项目

  • Spring Web:在Web分类下勾选Spring Web。
  • MyBatis Framework:在SQL分类下勾选MyBatis Framework。
  • MySQL Driver:在SQL分类下勾选MySQL Driver。

 

2,项目结构以及说明

我们先构建一下所有的package以及所有的Java类还有xml文件

下面是各个类和XML文件的作用简要说明:

1. HelloMyBatisApplication.java

  • 用途:Spring Boot应用程序的入口类,负责启动应用。
  • 注解
    • @SpringBootApplication:配置和引导Spring Boot应用。
    • @MapperScan:指定MyBatis的Mapper接口包路径。

2. User.java (Model)

  • 用途:表示数据库中的用户实体,对应数据库表中的一行数据。
  • 内容:包含用户的属性(如idname)及其getter和setter方法。

3. UserMapper.java (Mapper Interface)

  • 用途:定义与数据库交互的方法,包括查询和插入操作。
  • 内容:包含MyBatis的SQL注解或XML中定义的SQL映射。

4. UserMapper.xml (Mapper XML)

  • 用途:存放SQL语句,供MyBatis使用。
  • 内容:定义具体的SQL语句,与UserMapper接口中的方法相对应。

5. UserService.java (Service)

  • 用途:处理业务逻辑,调用UserMapper的方法进行数据库操作。
  • 内容:包含对用户的增删改查方法。

6. UserController.java (Controller)

  • 用途:处理HTTP请求,调用UserService的方法并返回结果。
  • 内容:定义RESTful API接口,通过GET方法实现用户的读取和写入操作。

7. build.gradle

  • 用途:项目的构建脚本,管理项目的依赖和构建任务。
  • 内容:定义Spring Boot、MyBatis和MySQL等依赖。

3,所有代码

 1. HelloMyBatisApplication.java

package com.yuye.www.hellomybatis;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.mybatis.spring.annotation.MapperScan;@SpringBootApplication
@MapperScan("com.yuye.www.hellomybatis.mapper")
public class HelloMyBatisApplication {public static void main(String[] args) {SpringApplication.run(HelloMyBatisApplication.class, args);}
}

2. User.java (Model)

package com.yuye.www.hellomybatis.model;public class User {private Long id;private String name;// Getters and Setterspublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

3. UserMapper.java (Mapper Interface)

package com.yuye.www.hellomybatis.mapper;import com.yuye.www.hellomybatis.model.User;
import org.apache.ibatis.annotations.*;import java.util.List;public interface UserMapper {@Insert("INSERT INTO user(name) VALUES(#{name})")void insertUser(User user);@Select("SELECT COUNT(*) FROM user WHERE name = #{name}")int countByName(String name);
}

4. UserMapper.xml (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.yuye.www.hellomybatis.mapper.UserMapper"><insert id="insertUser">INSERT INTO user(name) VALUES(#{name})</insert><select id="countByName" resultType="int">SELECT COUNT(*) FROM user WHERE name = #{name}</select>
</mapper>

5. UserService.java (Service)

package com.yuye.www.hellomybatis.service;import com.yuye.www.hellomybatis.mapper.UserMapper;
import com.yuye.www.hellomybatis.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public void saveUser(User user) {userMapper.insertUser(user);}public boolean isUserExist(String name) {return userMapper.countByName(name) > 0;}
}

6. UserController.java (Controller)

package com.yuye.www.hellomybatis.controller;import com.yuye.www.hellomybatis.model.User;
import com.yuye.www.hellomybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/add")public String addUser(@RequestParam String name) {User user = new User();user.setName(name);userService.saveUser(user);return "User added successfully!";}@GetMapping("/check")public String checkUser(@RequestParam String name) {boolean exists = userService.isUserExist(name);return exists ? "User exists!" : "User does not exist!";}
}

7. application.yml (Configuration)

spring.application.name=HelloMyBatis
# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/userdata
spring.datasource.username=root
spring.datasource.password=Qwerty123
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# MyBatis配置
mybatis.mapper-locations=classpath:mapper/*.xmlserver.port=8081

8. Build Script (build.gradle)

plugins {id 'org.springframework.boot' version '3.3.1'id 'io.spring.dependency-management' version '1.0.11.RELEASE'id 'java'
}group = 'com.yuye.www'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'repositories {mavenCentral()
}dependencies {implementation 'org.springframework.boot:spring-boot-starter-web'implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'testImplementation 'org.springframework.boot:spring-boot-starter-test'testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.3'
}test {useJUnitPlatform()
}

4,运行项目

1,写入数据库

http://localhost:8081/users/add?name=rola

2,读取数据

http://localhost:8081/users/check?name=rola

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

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

相关文章

用proteus软件如何设计一个基于8086微处理器的简易温度计?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

#数据结构 顺序表

线性表 顺序表 每种结构都有它存在意义 线性表的顺序存储实现指的是用一组连续的存储单元存储线性表的数据元素。 概念 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性表&#xff0c;一般情况下采用数组存储。在数组上完成数据的增查改删。 逻辑结构&#…

IDEA配Git

目录 前言 1.创建Git仓库&#xff0c;获得可提交渠道 2.选择本地提交的项目名 3.配置远程仓库的地址 4.新增远程仓库地址 5.开始进行commit操作 6.push由于邮箱问题被拒绝的解决方法&#xff1a; 后记 前言 以下操作都是基于你已经下载了Git的前提下进行的&#xff0c…

CSRF靶场通关合集

目录 前言 CSRF漏洞总结 1.PiKachu靶场 1.1CSRF(get) 1.2 CSRF(post)请求 1.3 CSRF Token 2.DVWA靶场 难度低 难度中 难度高 前言 最近系统的将从web渗透到内网渗透的知识点做一个回顾,同时结合一些实战的案例来演示,下面是对刚开始学习时对靶场的一个总结. CSRF漏洞…

OPENCV(图像入门笔记)

使用OpenCV读取图像 使用cv.imread()函数读取图像。 第一个参数为图像名称 第二个参数是一个标志&#xff0c;它指定了读取图像的方式。分别有三种 cv.IMREAD_COLOR&#xff1a; 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志。 cv.IMREAD_GRAYSCALE&#xff1a;以…

【Nvidia+AI相机】涂布视觉检测方案专注提高锂电池质量把控标准

锂电池单元的质量在多个生产制造领域都至关重要&#xff0c;特别是在新能源汽车、高端消费电子等行业。这些领域的产品高度依赖锂电池提供持续、稳定的能量供应。优质的锂电池单元不仅能提升产品的性能和用户体验&#xff0c;还能确保使用安全。因此&#xff0c;保证锂电池单元…

go语言Gin框架的学习路线(六)

gin的路由器 Gin 是一个用 Go (Golang) 编写的 Web 框架&#xff0c;以其高性能和快速路由能力而闻名。在 Gin 中&#xff0c;路由器是框架的核心组件之一&#xff0c;负责处理 HTTP 请求并将其映射到相应的处理函数上。 以下是 Gin 路由器的一些关键特性和工作原理的简要解释…

昇思25天学习打卡营第19天|LSTM+CRF序列标注

概述 序列标注指给定输入序列&#xff0c;给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取&#xff0c;包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。 条件随机场&#xff08…

水箱高低水位浮球液位开关

水箱高低水位浮球液位开关概述 水箱高低水位浮球液位开关是一种用于监测和控制水箱中液位的自动化设备&#xff0c;它能够在水箱液位达到预设的高低限制时&#xff0c;输出开关信号&#xff0c;以控制水泵或电磁阀的开闭&#xff0c;从而维持水箱液位在一个安全的范围内。这类设…

【排序算法】插入排序(希尔排序)

一.直接插入排序 1.基本思想 直接插入排序是一种简单的插入排序法&#xff0c;其核心思想是对一个已经有序的序列插入一个数据&#xff0c;该数据依次比较有序序列中的值&#xff0c;直到插入到合适的位置。在我们玩扑克牌整理牌序的时候&#xff0c;用到的就是直接插入排序的…

Vue3.js“非原始值”响应式实现基本原理笔记(二)

如果您觉得这篇文章有帮助的话&#xff01;给个点赞和评论支持下吧&#xff0c;感谢~ 作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者/csdn百万访问前端博主/B站千粉前端up主 此篇文章是博主于2022年学习《Vue.js设计与实现》时的笔记整理而来 书籍&a…

28行代码完成深度学习模型——线性模型 01

在这里插入代码片## 线性模型 机器学习中的线性模型是一种预测模型&#xff0c;它基于线性关系来预测输出值。这种模型假设输入特征&#xff08;自变量&#xff09;和输出&#xff08;因变量&#xff09;之间存在线性关系。线性模型通常具有以下形式&#xff1a; y x*w b 其…

【TB作品】数码管独立按键密码锁,ATMEGA16单片机,Proteus仿真 atmega16数码管独立按键密码锁

文章目录 基于ATmega16的数码管独立按键密码锁设计实验报告实验背景硬件介绍主要元器件电路连接 设计原理硬件设计软件设计 程序原理延时函数独立按键检测密码显示主函数 资源代码 基于ATmega16的数码管独立按键密码锁设计实验报告 实验背景 本实验旨在设计并实现一个基于ATm…

数据库系统原理练习 | 作业1-第1章绪论(附答案)

整理自博主本科《数据库系统原理》专业课完成的课后作业&#xff0c;以便各位学习数据库系统概论的小伙伴们参考、学习。 *文中若存在书写不合理的地方&#xff0c;欢迎各位斧正。 专业课本&#xff1a; 目录 一、选择题 二&#xff1a;简答题 三&#xff1a;综合题 一、选择…

DAY21-力扣刷题

1.买卖股票的最佳时机 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxProfit(int[] prices) {int minpriceInteger.MAX_VALUE;int maxprofit0;for(int i0;i<prices.length;i){if(prices[i]<minprice){minpriceprices[…

昇思MindSpore学习笔记5-01生成式--LSTM+CRF序列标注

摘要&#xff1a; 记录昇思MindSpore AI框架使用LSTMCRF模型分词标注的步骤和方法。包括环境准备、score计算、Normalizer计算、Viterbi算法、CRF组合,以及改进的双向LSTMCRF模型。 一、概念 1.序列标注 标注标签输入序列中的每个Token 用于抽取文本信息 分词(Word Segment…

InetAddress.getLocalHost().getHostAddress()阻塞导致整个微服务崩溃

InetAddress.getLocalHost().getHostAddress()阻塞导致整个微服务崩溃 import java.net.InetAddress;public class GetHostIp {public static void main(String[] args) {try {long start System.currentTimeMillis();String ipAddress InetAddress.getLocalHost().getHostA…

【计算机网络】物理层(作业)

1、若信道在无噪声情况下的极限数据传输速率不小于信噪比为30dB 条件下的极限数据传输速率&#xff0c;则信号状态数至少是&#xff08;D&#xff09;。 A. 4B. 16C. 8D. 32 解析&#xff1a;可用奈奎斯特采样定理计算无噪声情况下的极限数据传输速率&#xff0c;用香农第二定…

Docker 容器网络及其配置说明

Docker 容器网络及其配置说明 docker容器网络docker的4种网络模式bridge 模式container模式host 模式none 模式应用场景 docker 容器网络配置Linux 内核实现名称空间的创建创建 Network Namespace操作 Network Namespace 转移设备veth pair创建 veth pair实现 Network Namespac…

三、docker配置阿里云镜像仓库并配置docker代理

一、配置阿里云镜像仓库 1. 登录阿里云官网&#xff0c;并登录 https://www.aliyun.com/ 2. 点击产品 - 容器 - 容器与镜像服务ACR - 管理控制台 - 镜像工具 - 镜像加速器 二、配置docker代理 #1. 创建docker相关的systemd文件 mkdir -p /etc/systemd/system/docker.servic…