后端项目操作数据库增删改查-使用MyBatis配置实现数据操作

一、创建一个数据表对应的实体类

在src/main/java/包名/路径下新建pojo.entity文件夹,如com.luoyang.small.pojo.entity,并在该文件夹下新增实体类java文件:如相册Album.java
该实体类的属性应与数据表的字段对应
数据表样例如下:

#如果数据表不存在,就删表
DROP TABLE IF EXISTS pms_album;
#创建新的数据表pms_album
CREATE TABLE pms_album
(id           bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '数据id',name         varchar(50)         DEFAULT NULL COMMENT '相册名称',description  varchar(255)        DEFAULT NULL COMMENT '相册简介',sort         tinyint(3) unsigned DEFAULT '0' COMMENT '排序序号',gmt_create   datetime            DEFAULT NULL COMMENT '数据创建时间',gmt_modified datetime            DEFAULT NULL COMMENT '数据最后修改时间',PRIMARY KEY (id)
) DEFAULT CHARSET = utf8mb4 COMMENT ='相册';#往pms_album插入数据
INSERT INTO pms_album
VALUES (1, '华为Mate60的相册', '暂无', 99, '2022-07-08 11:30:44', '2023-11-29 11:30:44'),(2, '华为Mate20的相册', '暂无', 99, '2022-07-08 11:30:44', '2022-07-08 11:30:44'),(3, '华为Mate30的相册', '暂无', 99, '2022-07-08 11:30:44', '2022-07-08 11:30:44'),(4, '华为Mate40的相册', '暂无', 99, '2022-07-08 11:30:44', '2022-07-08 11:30:44'),(5, '华为Mate50的相册', '暂无', 99, '2022-07-08 11:30:44', '2022-07-08 11:30:44'),(6, '华为P10的相册', '暂无', 99, '2022-07-08 11:30:44', '2022-07-08 11:30:44'),(7, '华为P20的相册', '暂无', 99, '2022-07-08 11:30:44', '2022-07-08 11:30:44'),(8, '华为P30的相册', '暂无', 99, '2022-07-08 11:30:44', '2022-07-08 11:30:44'),(9, '华为P40的相册', '暂无', 99, '2022-07-08 11:30:44', '2022-07-08 11:30:44'),(10, '华为P50的相册', '暂无', 99, '2022-07-08 11:30:44', '2022-07-08 11:30:44');

配合的实体类如下

public class Album implements Serializable {/*** 数据id*/private Long id;/*** 相册名称*/private String name;/*** 相册简介*/private String description;/*** 排序序号*/private Integer sort;/*** 数据创建时间*/private LocalDateTime gmtCreate;/*** 数据最后修改时间*/private LocalDateTime gmtModified;
}

二、创建一个 Mapper 接口(手动方式)

在src/main/java/包名/路径下新建mapper文件夹,如com.luoyang.small.mapper,并在该文件夹下新增mapper java文件:如AlbumMapper.java
在接口中声明需要的抽象方法。方法的名称和参数应与 SQL 查询语句对应。

//标记当前类是数据访问组件类
@Repository
public interface AlbumMapper {/*** 插入相册数据** @param album 相册数据* @return 受影响的行数*/int insert(Album album);/*** 批量插入相册数据** @param albums 相册列表* @return 受影响的行数*/int insertBatch(List<Album> albums);/*** 根据id删除相册数据** @param id 相册id* @return 受影响的行数*/int deleteById(Long id);/*** 根据若干个id批量删除相册数据** @param ids 若干个相册id的数组* @return 受影响的行数*/int deleteByIds(Long[] ids);/*** 根据id修改相册数据** @param album 封装了相册id和新数据的对象* @return 受影响的行数*/int update(Album album);/*** 统计相册数据的数量** @return 相册数据的数量*/int count();/*** 根据相册名称统计数据的数量** @param name 相册名称* @return 匹配名称的相册数据的数量*/int countByName(String name);/*** 统计非某id但名称匹配的相册数据的数量,用于检查是否存在其它数据使用了相同的名称* @param id 相册id* @param name 相册名称* @return 匹配名称但不匹配id的数据的数量*/int countByNameAndNotId(@Param("id") Long id, @Param("name") String name);
}

三、配置Mapper接口所在的包

方式1:使用 @Mapper 注解标识该接口
方式2【推荐】在配置类上使用@MapperScan注解,并指定注解的参数,此参数值就是包名。
在src/main/java/包名/路径下新建config文件夹,如com.luoyang.small.config,并在该文件夹下新增配置java文件:如MybatisConfigurationjava
如下:

//| 添加在类上,仅添加此注解的类才被视为配置类
@Configuration
//以下注释文件夹名跟你创建的mapper接口路径一致
@MapperScan("com.luoyang.small.mapper")
public class MybatisConfiguration {public MybatisConfiguration() {log.println("创建配置类对象:MybatisConfiguration");}
}

四、创建一个与 Mapper 接口相对应的 XML 文件

在src/main/resources路径下新建mapper文件夹,如下图所示
使用与 Mapper 接口相同的命名,并在 XML 文件中编写 SQL 查询语句,以及对应的映射关系等。
在这里插入图片描述

<?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.luoyang.small.mapper.AlbumMapper"><!-- int insert(Album album); --><insert id="insert" useGeneratedKeys="true" keyProperty="id">INSERT INTO pms_album (name, description, sort) VALUES (#{name}, #{description}, #{sort})</insert><!-- int insertBatch(List<Album> albumList); --><insert id="insertBatch" useGeneratedKeys="true" keyProperty="id">INSERT INTO pms_album (name, description, sort) VALUES<foreach collection="list" item="album" separator=",">(#{album.name}, #{album.description}, #{album.sort})</foreach></insert><!-- int deleteById(Long id); --><delete id="deleteById">DELETE FROM pms_album WHERE id=#{id}</delete><!-- int deleteByIds(Long[] ids); --><delete id="deleteByIds">DELETE FROM pms_album WHERE id IN (<foreach collection="array" item="id" separator=",">#{id}</foreach>)</delete><!-- int update(Album album); --><update id="update">UPDATE pms_album<set><if test="name != null">name=#{name},</if><if test="description != null">description=#{description},</if><if test="sort != null">sort=#{sort},</if></set>WHERE id=#{id}</update><!-- int count(); --><select id="count" resultType="int">SELECT count(*) FROM pms_album</select><!-- int countByName(String name); --><select id="countByName" resultType="int">SELECT count(*) FROM pms_album WHERE name=#{name}</select><!-- int countByNameAndNotId(@Param("id") Long id, @Param("name") String name); --><select id="countByNameAndNotId" resultType="int">SELECT count(*) FROM pms_album WHERE name=#{name} AND id!=#{id}</select></mapper>

五、在配置文件中指定 Mapper 接口和 XML 文件的路径

在src/main/resources路径下新建application.yml,如下图所示
在这里插入图片描述

# Mybatis相关配置
mybatis:# 配置SQL语句的XML文件所在的位置mapper-locations: classpath:mapper/*.xml

之前数据库连接等相关配置

六、检查配置是否成功

在src/test/java/包名/路径下新建AlbumMapperTests.java文件,添加mapper接口中声明的增删改查方法,如下图所示:新增数据测试
在这里插入图片描述
添加测试方法,调用AlbumMapper接口中的方法


@SpringBootTest
public class AlbumMapperTests {//添加在属性上,使得Spring自动装配此属性的值@AutowiredAlbumMapper mapper;@Testvoid insert() {Album album = new Album();album.setName("测试名称001");album.setDescription("测试简介001l啦啦啦啦啦");album.setSort(100); // 注意:由于MySQL中表设计的限制,此值只能是[0,255]区间内的int rows = mapper.insert(album);System.out.println("插入数据完成,受影响的行数:" + rows);}}

结果: 新增相册数据成功
在这里插入图片描述
在这里插入图片描述
后续是,项目中数据库真实应用场景:在应用程序中使用 SqlSessionFactory 和 SqlSession 等类来实例化 Mapper 接口的具体实现类,并调用方法进行数据库操作。

创造价值,乐哉分享!

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

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

相关文章

PTA 7-192 浪漫的表白

有一个帅小伙一直暗恋一个女孩&#xff0c;但他还是没有勇气向她表白“我爱你”&#xff0c;更别说“某某某&#xff0c;我爱你&#xff0c;如果非要在这份‘爱’上加一个期限的话&#xff0c;那就是一万年”这类肉麻的话&#xff0c;生怕说了后会是“落花有意流水无情”&#…

后端返回图片流前端展示图片

根据后端返回的图片流格式&#xff0c;选用合适方法转换 下面以base64为例 if(res.status 200) {res.data.data.forEach((item,index) > {let Array data:image/png;base64, itemlet blob this.base64toBlob(Array)let url URL.createObjectURL(blob)this.imageList.p…

24年5月软考高项考哪些内容,考试大纲什么的?

信息系统项目管理师属于「计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试」中的高级资格考试。 也称「软考高项」&#xff0c;可以「以考代评」用来评副高级职称。 一、软考备考前期准备 信息系统项目管理师考试科目包括&#xff1a; 《综合知识》、《案例分…

html原生echart柱状图

html原生echart柱状图 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Bar Chart Example</title><!-- Include Chart.js library --><script src"https://cdn.jsdelivr.net/npm/…

Linux的基本指令(4)

目录 20.tar指令&#xff08;重要&#xff09;&#xff1a;打包/解包&#xff0c;不打开它&#xff0c;直接看内容 21.bc指令 22.uname –r指令&#xff1a; 23.重要的几个热键[Tab],[ctrl]-c, [ctrl]-d 20.tar指令&#xff08;重要&#xff09;&#xff1a;打包/解包&#…

手机上的记事本怎么打开?安卓手机通用的记事本APP

有不少上班族发现&#xff0c;自己想要在电脑上随手记录一些工作文字内容&#xff0c;直接使用电脑上的记事本工具来编辑文字是比较便捷的。但是如果想要在手机上记录文字内容&#xff0c;就找不到手机上的记事本了。那么手机上的记事本怎么打开&#xff1f;安卓手机通用的记事…

Windows环境 dockertopdesk 部署gitlab

1.在dockertopdesk里搜索 gitlab镜像 (pull)拉取镜像 2.运行镜像到容器 mkdir gitlab gitlab/etc gitlab/log gitlab/opt docker run -id -p 3000:80 -p 9922:22 -v /root/gitlab/etc:/etc/gitlab -v /root/gitlab/log:/var/log/gitlab -v /root/gitlab/opt:/var/opt/gitla…

2023-12-2 AIGC-chatgpt4-功能-记录

摘要: 2023-12-2 AIGC-chatgpt4-功能-记录 英文: ChatGPT-4, as an evolution of OpenAIs language models, has a wide range of capabilities: Language Understanding and Generation: It can understand and generate human-like text, making it useful for conversation…

百度智能云文字识别使用问题解决合集

1.创建试用程序时需要16位的签名MD5 解决方法&#xff1a;使用Java8 201版本及以下的jdk创建签名 下载地址&#xff1a;http://www.codebaoku.com/jdk/jdk-oracle-jdk1-8.html#jdk8u201 生成签名代码&#xff1a;keytool -genkeypair -v -keystore D:\key.jks -storetype PKC…

LeetCode130. Surrounded Regions

文章目录 一、题目二、题解 一、题目 Given an m x n matrix board containing ‘X’ and ‘O’, capture all regions that are 4-directionally surrounded by ‘X’. A region is captured by flipping all O’s into X’s in that surrounded region. Example 1: Input…

EasyExcel两行表头

例子&#xff1a; 代码&#xff1a; StorageService localStorageService storageFactory.getLocalStorageService();String path "";// 文件信息String dateTime DateUtils.formatTimestampToString(new Date());String title "xxx统计";String fil…

MySQL之锁

MySQL之锁 锁是计算机在执行多线程或线程时用于并发访问同一共享资源时的同步机制&#xff0c;MySQL中的锁是在服务器层或者存储引擎层实现的&#xff0c;保证了数据访问的一致性与有效性 MySQL锁可以按模式分类为&#xff1a;乐观锁与悲观锁。 按粒度分可以分为全局锁、表级锁…

GoLong的学习之路,进阶,微服务之原理,RPC

其实我早就很想写这篇文章了&#xff0c;RPC是一切现代计算机应用中非常重要的思想。也是微服务和分布式的总体设计思想。只能说是非常中要&#xff0c;远的不说&#xff0c;就说进的这个是面试必问的。不管用的上不&#xff0c;但是就是非常重要。 文章目录 RPC的原理本地调用…

Vue渲染内容的三种方式

{{ }} 语法&#xff1a;将数据作为普通文本输出&#xff0c;不会覆盖原有的内容。 v-text 指令&#xff1a;将数据作为普通文本输出&#xff0c;会覆盖原有的内容。 v-html 指令&#xff1a;将数据作为 HTML 标签解析后输出&#xff0c;会覆盖原有的内容。 注&#xff1a;一…

flutter开发实战-ValueListenableBuilder实现局部刷新功能

flutter开发实战-ValueListenableBuilder实现局部刷新功能 在创建的新工程中&#xff0c;点击按钮更新counter后&#xff0c;通过setState可以出发本类的build方法进行更新。当我们只需要更新一小部分控件的时候&#xff0c;通过setState就不太合适了&#xff0c;这就需要进行…

OSI七层模型与TCP/IP四层模型的区别(计算机网络)

一、OSI七层网络模型 OSI 网络模型共有 7 层&#xff0c;分别是应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。 应用层&#xff0c;负责给应用程序提供统一的接口&#xff1b;表示层&#xff0c;负责把数据转换成兼容另一个系统能识别的格式&#xff1b;会话…

NDK打印android日志

首先在cpp文件中 引入 #include <android/log.h> 然后就可以使用 __android_log_print方法&#xff0c;第一个参数是log level&#xff0c;第二个是tag&#xff0c;第三个是日志内容。 #include <jni.h> #include <string> #include <android/log.h&g…

Syntax Error: TypeError: Cannot read properties of undefined (reading ‘styles‘)

日志只有这一行&#xff0c;比较难排查 排查途径&#xff1a; 1、从上图找到唯一的文件输出output.js&#xff0c;断点查看堆栈信息&#xff0c;如下图&#xff0c;可以看到这个错误是由于哪个文件引起的 以为从App.vue中定位到原因了&#xff0c;其实也不对&#xff0c;继续…

nnDetection简明安装和训练流程(Windows环境)

安装 首先&#xff0c;官方不建议Windows安装&#xff0c;推荐Linux Docker 我的环境&#xff1a; ● 操作系统平台&#xff1a; Windows 10 ● Python&#xff1a; 3.8 ● Torch/TorchVision&#xff1a; 1.10.1cu102/ 0.11.1 ● GPU&#xff1a; Nvidia RTX 2080 Ti 11G…

FTP协议详解

一&#xff1a;概述 FTP协议是一个用于在计算机网络上在客户端和服务器之间进行文件传输的应用层协议&#xff0c;其英文全称是File Transfer Protocol。是TCP/IP协议簇中的重要一员。客户端和服务器按照FTP的协议规范进行通讯来实现文件传输。 对于FTP服务器好理解&#xff0c…