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

news2025/1/11 7:59:07

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

在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自动装配此属性的值
    @Autowired
    AlbumMapper mapper;

    @Test
    void 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.coloradmin.cn/o/1274976.html

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

相关文章

Quest 3圆满结束,500万SUI正在送出!

的最后审核阶段于北京时间今日凌晨结束并公布了获奖情况&#xff0c;此次总奖池金额达到了500万SUI&#xff0c;共有16.4万参与者获得了奖励。参与Quest 3的人们可以在Sui网络上的九款游戏中进行选择&#xff0c;并利用促销活动注册SuiNS域名。 Quest 3以游戏为重点&#xff0…

spring boot 2 升级到 spring boot 3 后文件上传失败

背景 项目需要&#xff0c;要求升级 spring boot 2.7 到 spring boot 3.2&#xff0c;升级过程中发现很多不兼容问题&#xff0c;下面说明文件上传失败的解决方案。 问题 spring boot 2 中不需要额外的配置&#xff0c;直接在 Controller 中配置 MultipartFile 接收页面传的…

python之pyqt专栏5-信号与槽1

在上一篇文章&#xff0c;我们了解到如果想要用代码改变QLabel的文本内容&#xff0c;可以调用QLabel类的text()函数。 但是现在有个这样的需求&#xff0c;界面中有一个Button与一个Label&#xff0c;当点击Button时&#xff0c;将Label的内容改变为“Hello world&#xff01;…

全网最新最全面的Jmeter接口测试:jmeter模拟http请求实战

1、get请求 http://www.hnxmxit.com/ 2、带参数的get请求 微信公众号获取token请求 3、自定义头部信息的请求 百度搜索请求 https://www.baidu.com/s?wd猫 4、post请求 微信公众号添加用户标签请求 注&#xff1a;post请求中如果body中的数据为json,一定要在信息头管理器中…

【SpringBoot系列】SpringBoot时间字段格式化

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

袋鼠云产品功能更新报告08期|近百项全新功能和优化,你要的都在这里!

欢迎来到袋鼠云08期产品功能更新报告&#xff01;在瞬息万变的市场环境中&#xff0c;我们深知客户的需求与期待&#xff0c;因此&#xff0c;我们及时推出袋鼠云最新产品更新及优化&#xff0c;包括数据治理中心、Hive SQL 性能优化、新插件等&#xff0c;助力企业在数字世界中…

基于OpenSSL和nginx搭建本地https服务器(详细实操版)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

【从删库到跑路 | MySQL总结篇】索引的详细使用

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、索引…

PHP开源问答网站平台源码系统 源码全部开源可二次开发 附带完整的搭建教程

目前&#xff0c;问答网站已经成为人们获取知识、交流思想的重要平台。然而&#xff0c;对于许多开发者来说&#xff0c;从头开始构建一个问答网站可能会面临各种挑战。今天&#xff0c;小编给大家介绍一款基于PHP的开源问答网站平台源码系统&#xff0c;它不仅源码全部开源&am…

Apache2.4 AliasMatch导致301重定向问题?

环境&#xff1a;ubuntu18.04-desktop apache2版本&#xff1a; rootubuntu:/etc/apache2# apache2ctl -v Server version: Apache/2.4.29 (Ubuntu) Server built: 2023-03-08T17:34:33apache配置&#xff1a; DocumentRoot /var/www/html # Alias就没事 # Alias "/my…

05-基于Git的团队合作和跨团队合作方式

Git团队合作 团队协作 第一步: 在管理员的仓库中如git-shTest选择Settings-->Manage access-->invite a collaborator-->在弹出的界面中填入想要合作的人的GitHub账号 第二步: 管理员如yueyue复制邀请函中的地址内容通过微信钉钉等方式发送给该用户如atguigulinghuc…

Jetson Nano部署YOLOv5与Tensorrtx加速

一、烧录镜像 1、Jetson Nano烧写系统镜像 Jetson Nano是一款形状、外接口类似于树莓派的嵌入式主板&#xff0c;搭载了四核Cortex-A57处理器&#xff0c;GPU则是拥有128个NVIDIA CUDA核心的NVIDIA Maxwell架构显卡&#xff0c;内存为4GB的LPDDR4&#xff0c;存储则为16GB eM…

32岁,大专,转行网络工程师可行吗?

中午好&#xff0c;我是老杨。 32岁&#xff0c;是一个距离35岁不远不近的年纪&#xff0c;在IT行业里&#xff0c;也是一个最为尴尬的年纪。 年过三十&#xff0c;很多人在既有岗位做的麻木&#xff0c;想要跳槽&#xff0c;又怕承担动荡的风险&#xff1b; 到了这个年纪猜…

计算机新建盘符和重新分配盘符的大小

一、新建盘符 有些电脑刚买来时候&#xff0c;只有一个C盘分区&#xff0c;此时最好增加几个分区方便使用。 注意&#xff1a;分区操作要慎重&#xff0c;不要轻易去试。这里只针对购买的电脑厂家未做分区&#xff0c;只有一个C盘的情况。 如果自己电脑的分区本身已经满足你…

传统算法:使用 Pygame 实现插入排序

使用 Pygame 模块实现了插入排序的动画演示。首先,它生成一个包含随机整数的数组,并通过 Pygame 在屏幕上绘制这个数组的条形图。接着,通过插入排序算法对数组进行排序,动画效果可视化每一步的排序过程。在排序的过程中,程序将当前元素插入到已排序的部分,通过适度的延迟…

数字化IT合同管理软件, 实现高效合同管理!

在现代商业环境中&#xff0c;合同是商业活动中不可或缺的一部分。无论是与供应商、客户还是员工之间的合作&#xff0c;合同管理都是非常重要的。然而&#xff0c;传统的手动合同管理过程往往繁琐且易错&#xff0c;导致时间和资源的浪费&#xff0c;为了解决这些问题&#xf…

SpringBoot整合ES客户端操作

SpringBoot整合ES客户端操作 介绍ES ES下载与安装 https://www.elastic.co/cn/downloads/past-releases 不要装太新的&#xff0c;里面自己配置了jdk&#xff0c;太新的可能用不了&#xff0c;免安装的&#xff0c;解压就好 浏览器输入&#xff1a;http://localhost:9200/ 返…

HNU-编译原理-讨论课2

讨论课安排&#xff1a;2次4学时&#xff0c;分别完成四大主题讨论 分组&#xff1a;每个班分为8组&#xff0c;每组4~5人&#xff0c;自选组长1人 要求和说明&#xff1a; 以小组为单位上台报告&#xff1b;每次每组汇报2个小主题&#xff0c;每组按要求在2个小主题中各选1…

Python列表合并技术,让你的代码更具灵活性!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python编程的世界中&#xff0c;列表是一项无处不在的利器&#xff0c;而对列表进行合并操作更是我们在日常编码中频繁遇到的任务之一。合并列表的方式多种多样&#xff0c;每一种方法都有其独特的适用场景和性…

【微服务 SpringCloudAlibaba】实用篇 · Nacos配置中心

微服务&#xff08;6&#xff09; 文章目录 微服务&#xff08;6&#xff09;1. 统一配置管理1.1 在nacos中添加配置文件1.2 从微服务拉取配置 2. 配置热更新2.1 方式一2.2 方式二 3. 配置共享1&#xff09;添加一个环境共享配置2&#xff09;在user-service中读取共享配置3&am…