Spring Boot Web项目Mapper和Mybatis基本使用

Mybatis初步认识

spring boot的web项目为了降低模块之间的耦合度,基本上都采用三层结构,其中dao层负责与文件或DB交互获取数据,从而为上层的service方法提供接口。Java项目中与DBMS交互,需要通过标准的JDBC接口,使用原始的jdbc会使代码非常繁琐,需要编写很多流程化的代码。mybatis是一个持久层框架,免除了几乎所有jdbc代码、设置参数和获取结果集的工作。

使用mybatis的基本步骤总结为三步:

  1. 准备数据库表和对应的实体类定义。
  2. 引入mybatis和其他的依赖,进行datasource配置。
  3. 准备mapper接口,通过注解或xml的形式编写SQL语句。这是重点。

通过注解编写SQL语句,需要定义mapper接口类,在接口上加上@Mapper注解,并在接口内定义的方法上加上SQL语句的注解@Select等等。service层中可以直接调用对应的方法,开发者不需要定义实现类,这个工作是由框架负责实现的,mybatis还会将实现类对象交给IoC容器管理。

public interface UserMapper {@Select("select * from user")public List<User> list();
}

数据库连接池

新建和销毁数据库连接开销较大,所以使用连接池的方法在初始化阶段创建一定数量的连接并进行统一管理,在需要时分配,不需要时回收,可以提高运行效率、资源利用率。官方定义了数据库连接池的接口DataSource,由第三方库的开发者来实现。

mybatis的默认实现使用的是叫做Hikari的连接池,另一种常用的连接池实现是阿里开源的Druid。可以通过配置来更换使用不同的实现。

Lombok

定义Java实体类时除了声明私有属性之外,还需要为每个属性提供getter和setter、以及构造函数,非常麻烦。lombok针对此情况提供了可以自动生成这些函数的注解。要使用这个库需要引入对应的依赖。

注解 作用
@Getter@Setter 为所有属性提供getter和setter
@ToString 生成toString方法
@EqualsAndHashCode 更加非静态字段重写equalshashCode方法
@Data 综合上面四个注解
@NoArgsConstructor@AllArgsConstructor 无参构造和除静态字段之外的全参数构造函数

mybatis细节

首先,实体类中的属性定义按照Java的通常规范使用驼峰命名法,而数据库字段通常使用下划线命名。

很多情况下,SQL语句都是动态的,需要根据参数进行查询和修改,每条SQL语句与mapper的一个方法对应,因此在调用该方法时可以传入一个参数,在SQL语句中使用参数占位符#{...}。注意使用占位符的SQL语句会产生预编译的语句。这个占位符用于参数的动态传入,一般都使用它,还有一种占位符是${...},这个占位符是直接拼接,可以用于列名、表名的动态指定以及字符串匹配的引号中,所以使用场景较少。

@Mapper
public interface EmpMapper {
@Delete("delete from emp where id = #{id}")
public void delete(Integer id);
}

注意,SQL语句(比如上面的delete)是有返回值的,返回值为该语句影响的记录数量,在不需要该返回值时,将方法的返回值设置为了void

mybatis具体执行的sql语句默认是无法看到的,需要在项目配置文件中打开mybatis的日志输出,并指定输出方向(终端输出或日志文件等)。

在插入记录时,考虑到实际使用场景,由于需要传入很多个参数,所以参数列表很长,不易读且不好维护,实践中建议封装到类对象中再传参。注意这里占位符中的名字应该要与对象中的属性名保持一致。

实际插入场景中还可能有需要在新增记录后获取新记录的主键值,可以在接口方法上添加下面这个注解:

@Options(keyProperty = "id", useGeneratedKeys = true)

它表示将新生成的主键,绑定到名为id的属性中。

上面记录了关于删除、插入的方法,更新的方法是类似的。

下面记录查询的相关内容。查询方法的一个不同点在于查询的结果通过接口方法的返回值提供给调用者(通常是service层的方法)。另一个问题在于前面提到的对应字段的名字不同(驼峰命名与下划线命名)。要解决这个问题,可以有几个方法:

  1. 在SQL语句中给有问题的字段起别名。
  2. 在接口方法上通过@Results@Result注解手动映射名字。
  3. 打开mybatis的驼峰命名自动映射。显然,我们需要注意名字的拼写不要对应不上。

使用xml文件编写SQL语句和映射关系

前面提到mybatis中编写SQL语句可以使用注解或者单独的xml配置文件。后者有三点主要规范需要遵守(保证框架能够找到正确的语句来执行):

  1. xml文件的名称需要与mapper接口的名称一致,而且xml文件需要放在mapper接口源文件相同包内,即同包同名。而且通常都是一个接口对应一个xml文件。
  2. xml文件的namespace属性需要与mapper接口的全限定名字一致。
  3. xml文件中sql语句的id需要与mapper接口中定义的方法名字一致,同时返回值类型returnType也要一致。

由于这种xml文件的格式和约束(开头的几行)是固定的,而且很难记,所以基本需要从网上的模板上直接拷贝。同样的,具体的写法网上的例子也很多,不应该死记硬背。

mybatis的动态sql功能

一个典型的动态sql使用场景是程序为用户提供多个筛选查询条件时,用户可能只会使用其中的几个筛选条件,此时其他的条件是空的,如果硬编码所有条件到SQL语句中,显然会出现语法错误,此时就可以使用动态SQL功能。动态SQL就是随输入或外部条件变化的SQL语句。

mybatis提供了很多动态sql功能,如ifforeach、引入sql片段等等,具体如何使用可以直接从网上搜索。需要注意的是这种比较复杂的sql显然应该在xml配置中编写,强行要使用注解的形式只会导致代码臃肿。

总的来说,这些东西常用而且网上资料非常多,这里记录主要用于整理并整合理解。

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

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

相关文章

《笨办法学Python3》PDF、EPUB免费下载

本书是一本Python入门书,适合对计算机了解不多,没有学过编程,但对编程感兴趣的读者学习使用。这本书以习题的方式引导读者一步一步学习编程,从简单的打印一直讲到完整项目的实现,让初学者从基础的编程技术入手,最终体验到软件开发的基本过程。本书是基于Python 3.6版本编…

RocketMQ实战—5.消息重复+乱序+延迟的处理

大纲 1.根据RocketMQ原理分析为什么会重复发优惠券 2.引入幂等性机制来保证数据不会重复 3.如何用死信队列处理优惠券系统数据库宕机 4.基于RocketMQ的订单库同步为什么会消息乱序 5.如何解决RocketMQ的消息乱序问题 6.RocketMQ的顺序消息机制的代码实现 7.基于RocketMQ的数据过…

VSCODE接入DeepSeek R1实现AI完成自动化脚本实战开发

大家好,我是六哥,今天还是我们喜爱的DeepSeek的玩法,今天来个实战案例,和大家分享一下如何将DeepSeek接入VS Code,结合AI Toolkit插件完成自动化脚本的实战开发。 一、准备 微软官方为我们提供了一个针对AI辅助的插件——AI Toolkit for Visual Studio Code。这个插件功能…

L0G2-Python 前置基础

L0G2-Python 前置基础 1. 任务一 Leetcode 383 通过的截图通过的代码 class Solution(object):def canConstruct(self, ransomNote, magazine):""":type ransomNote: str:type magazine: str:rtype: bool"""# 只使用 defaultdict(int) 避免 if 语…

L0G3-Git 基础知识

L0G3-Git 基础知识 1. 任务一 破冰活动之自我介绍 1.1 配置 git 直接采用全局设置的方式 git config --global user.name "sakuralggm" git config --global user.email "myemail@qq.com"查看全局配置 git config --global --list1.2 fork 项目1.3 克隆项目…

L0G4-玩转HF魔搭魔乐社区

L0G4-玩转HF/魔搭/魔乐社区 1. Hugging Face平台 1.1 任务一 模型下载 1.1.1 创建github codespace 访问github codespace,并使用Jupyter Notebook模板。创建完成后,进入“Create frome a template”页面对已经创建的codespace选择“open in visual studio code”点击后会经过…

2024 年度总结:与自己对话

搬运自洛谷博客,原发表时间:2024-12-27(实际写成:12-31)\[\mathsf{那跑过去的昼夜\ \ 是孤独的修炼\qquad——\ 林俊杰《黑夜问白天》} \] 孤独而不孤独.又来到写年度总结的时刻了。这一年无疑比去年更具故事的戏剧性与心境的跌宕起伏了。 被各种事件聚在一起搅和,高一上…

breach1靶机渗透学习

靶机下载 https://www.vulnhub.com/ 找Breach-1.0,不过这个是老靶机了,可以看网上其他博客附带有靶机下载的网盘链接,靶机官网访问很慢而且网站好像出问题了排版很乱,不打也罢。 readme.txt: First in a multi-part series, Breach 1.0 is meant to be beginner to interm…

lxl数据结构讲义例题泛做

搬运自洛谷博客,原发表时间:2022-12-06 网课人在家摆烂太悲伤了,于是做一些数据结构题。 本博客和ds学习笔记的区别:后者收录小清新/有趣题。 目前拥有的讲义:感觉数据结构题评紫的巨大多,良莠不齐。 可能会有非常简单的题加入这里,勿喷。 完成度指数:0%表示一半以上核…

电路板地与外壳地之间接一个电阻和一个电容的作用.

原理 原理图如下:我们知道外壳基本都是金属属性,外壳会预留一个螺丝孔,预留的螺丝孔是为了跟电路板地连接在一起,电路设计如原理图所示,这样做有什么作用呢?作用如下:外壳地如果不稳定或者有静电之类的,如果与电路板地直接连接,就会打坏电路板芯片,加入电容,就能把低…

晶体管

PCB设计中晶体管的学习与应用 在电子电路设计中,晶体管作为一种重要的有源器件,扮演着放大、开关、稳压等多种角色。本文将带您了解晶体管的基础知识,以及如何在PCB设计中正确选择和应用晶体管。 晶体管基础 晶体管主要有两种类型:双极型晶体管(BJT)和场效应晶体管(FET)…

Tailwin CSS 基础下篇

Tailwin CSS 进阶上篇 方便自己查看,仅做摘录,非原创。 原文链接 听说你还不会 Tailwind CSS(基础上篇)Tailwind CSS 的基础使用:从宽度高度开始逐步展现 Tai - 掘金 (juejin.cn) 听说你还不会 Tailwind CSS(基础中篇)Tailwind CSS 的基础使用:包含伪类、伪元素、flex …