MyBatis完成单表的CRUD

news2025/3/13 7:13:00

提示:如果没有基础的可以看我的博客 ===> MyBatis概述与MyBatis入门程序

MyBatis完成单表的CRUD

  • 一、准备工作
  • 二、Insert(Create)
    • 1.使用 map 的方式插入数据
      • (1)编写 SQL 语句
      • (2)编写测试代码
      • (3)运行结果
    • 2.使用 pojo 来传参数
      • (1)创建 pojo 实体类
      • (2)编写 SQL 语句
      • (3)编写测试代码
      • (4)运行结果
  • 三、delete
      • (1)编写 SQL 语句
      • (2)编写测试代码
      • (3)运行结果
  • 四、Update
      • (1)编写 SQL 语句
      • (2)编写测试代码
      • (3)运行结果
  • 五、Select(Retrieve)
    • 1.查询一个
      • (1)编写 SQL 语句
      • (2)编写测试代码
      • (3)运行结果
    • 2.查询所有
      • (1)编写 SQL 语句
      • (2)编写测试代码
      • (3)运行结果
  • 六、关于SQL Mapper的namespace


一、准备工作

  • 创建module(Maven的普通Java模块):mybatis-crud
  • pom.xml
    • 打包⽅式 jar
    • 依赖:
      • mybatis 依赖
      • mysql 驱动依赖
      • junit依赖
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.gdb</groupId>
        <artifactId>mybatis-crud</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging> 
    
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.33</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.14</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13.2</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <properties>
            <maven.compiler.source>17</maven.compiler.source>
            <maven.compiler.target>17</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
    </project>
    
  • mybatis-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>
        <settings>
            <setting name="logImpl" value="STDOUT_LOGGING"/>  <!-- 日志设置为 MyBatis 提供的标准日志 -->
        </settings>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>   <!-- 事务管理设置为 JDBC 默认开启事务,需要手动提交 -->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/自己对应的数据库名"/>
                    <property name="username" value="用户名(一般是root)"/>
                    <property name="password" value="登录密码!"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <!--sql映射⽂件创建好之后,需要将该⽂件路径配置到这⾥-->
            <mapper resource="articleMapper.xml"/>
        </mappers>
    </configuration>
    
  • articleMapper.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="article">
    </mapper>
    
  • 提供com.gdb.utils.SqlSessionUtil⼯具类
    public class MybatisUtils {
        private static SqlSessionFactory sqlSessionFactory;
        /**
         * 类加载时初始化sqlSessionFactory对象
         */
        static {
            try {
                SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
                sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        /**
         * 每调⽤⼀次openSession()可获取⼀个新的会话,该会话⽀持⾃动提交。
         */
        public static SqlSession openSession() {
            return sqlSessionFactory.openSession(true);
        }
    }
    

二、Insert(Create)

1.使用 map 的方式插入数据

(1)编写 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="article">
    <insert id="insertArticleForMap">
        insert into article
        values (null, #{user_id}, #{title}, #{summary}, #{read_count}, #{create_time}, #{update_time});
    </insert>
</mapper>
  • 在 Java 程序中,将数据放到 Map 集合中。
  • 在 sql 语句中使用 #{map集合的key} 来完成传值,#{} 等同于 JDBC 中的 ?,#{} 就是占位符。底层实际上调用的是 map 的 get 方法来获取 key 对应的 value。
  • 小细节:
    • key 的名字一般和数据库表的字段名保持一致,增强可读性。
    • 由于底层调用的是 get 方法,所以当 key 值不存在的时候,不会报错,而是返回 null。

(2)编写测试代码

@Test
public void insertMap(){
    Map<String, Object> map = new HashMap<>();

    //前端传过来的数据
    map.put("user_id", 12346);
    map.put("title", "springboot 配置文件");
    map.put("summary", "外部化配置文件");
    map.put("read_count", 12346);
    map.put("create_time", "2026-05-16 12:15:27");
    map.put("update_time", "2026-05-16 12:15:27");

    SqlSession sqlSession = MybatisUtils.openSession();
    int count = sqlSession.insert("insertArticleForMap", map);
    System.out.println(count);
    //注意,这里我没有手动提交,是因为我在工具类中获取 sqlSession 的时候,开启了自动提交。
    sqlsession.close();
}

(3)运行结果

在这里插入图片描述

2.使用 pojo 来传参数

(1)创建 pojo 实体类

public class ArticleDetail {
    private Integer id;
    private Integer userId;
    private String summary;
    private String title;
    private Integer readCount;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
    //全参构造、无参构造、toString、set和get方法
}

(2)编写 SQL 语句

<insert id="insertArticleForPojo">
    insert into article
    values (null, #{userId}, #{title}, #{summary}, #{readCount}, #{createTime}, #{updateTime});
</insert>
  • 如果采⽤ POJO 传参,#{} ⾥写的是 get ⽅法的⽅法名去掉 get 之后将剩下的单词⾸字⺟变⼩写(例
    如:getAge 对应的是 #{age},getUserName 对应的是 #{userName}),如果这样的 get ⽅法不存在会报
    错。

(3)编写测试代码

@org.junit.Test
public void insertPojo(){
    //前端传过来的数据
    Article article = new Article(null, 12346, "springboot 配置文件", "外部化配置文件", 12346, LocalDateTime.now(), LocalDateTime.now());

    SqlSession sqlSession = MybatisUtils.openSession();
    int count = sqlSession.insert("insertArticleForPojo", article);
    System.out.println(count);
    //注意,这里我没有手动提交,是因为我在工具类中获取 sqlSession 的时候,开启了自动提交。
    sqlSession.close();
}

(4)运行结果

在这里插入图片描述


三、delete

(1)编写 SQL 语句

<delete id="deleteArticleForId">
    delete from article where id = #{id};
</delete>
  • 注意:当占位符只有⼀个的时候,${} ⾥⾯的内容可以随便写。但是一般要见名知意。

(2)编写测试代码

@Test
public void deleteForId(){
    SqlSession sqlSession = MybatisUtils.openSession();
    int count = sqlSession.delete("deleteArticleForId", 6);
    System.out.println("删除的记录条数为 ===> " + count);
    sqlSession.close();
}

(3)运行结果

在这里插入图片描述


四、Update

(1)编写 SQL 语句

<update id="updateArticleForId">
    update article
    set user_id = #{userId},
        title   = #{title},
        summary = #{summary}
    where id = #{id}
</update>

(2)编写测试代码

@Test
public void updateArticleForId() {
    Article article = new Article(8, 13, "aaaa", "bbbb", null, null, null);
    SqlSession sqlSession = MybatisUtils.openSession();
    int count = sqlSession.update("updateArticleForId", article);
    System.out.println("修改的记录条数 ===> " + count);
    sqlSession.close();
}

(3)运行结果

在这里插入图片描述


五、Select(Retrieve)

  • select 语句和其他语句不同的是:查询会有一个结果集。注意 mybatis 是怎么处理结果集的。
  • 在 标签中添加 resultType 属性,用来指定查询结果转换成的类型。
    • 一般使用全限定类名。

1.查询一个

(1)编写 SQL 语句

<select id="selectArticleForId" resultType="com.gdb.pojo.Article">
    select id,
           user_id     as userId,
           title,
           summary,
           read_count  as readCount,
           create_time as createTime,
           update_time as updateTime
    from article
    where id = #{id};
</select>
  • 注意底层调用的是 set 方法,如果返回的结果名和属性名不同的话,结果为 null。
  • 可以通过采用 as 关键字起别名。

(2)编写测试代码

@Test
public void selectArticleForID() {
    SqlSession sqlSession = MybatisUtils.openSession();
    Article article = sqlSession.selectOne("selectArticleForId", 1);
    System.out.println("查询结果为 ===> " + article);
    sqlSession.close();
}

(3)运行结果

在这里插入图片描述

2.查询所有

(1)编写 SQL 语句

<select id="selectAll" resultType="com.gdb.pojo.Article"> -- 注意这里指定的是查询结果 List 中存储的元素
select id,
       user_id     as userId,
       title,
       summary,
       read_count  as readCount,
       create_time as createTime,
       update_time as updateTime
from article
</select>

(2)编写测试代码

@Test
public void selectAll() {
    SqlSession sqlSession = MybatisUtils.openSession();
    List<Article> articles = sqlSession.selectList("selectAll");
    System.out.println("查询结果为 ===> " + articles);
    sqlSession.close();
}

(3)运行结果

在这里插入图片描述


六、关于SQL Mapper的namespace

  • 在 SQL Mapper 配置⽂件中 标签的 namespace 属性可以翻译为命名空间,这个命名空间主要是
    为了防⽌ sqlId 冲突的。
  • 所以在 Java 程序中实际的写法是 namespace + id。
<?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="article">
    <delete id="deleteArticleForId">
        delete from article where id = #{id};
    </delete>
</mapper>
@Test
public void deleteForId() {
    SqlSession sqlSession = MybatisUtils.openSession();
    int count = sqlSession.delete("article.deleteArticleForId", 9);
    System.out.println("删除的记录条数为 ===> " + count);
    sqlSession.close();
}

在这里插入图片描述


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

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

相关文章

数据分析(一) 理解数据

1. 描述性统计&#xff08;summary&#xff09; 对于一个新数据集&#xff0c;首先通过观察来熟悉它&#xff0c;可以打印数据相关信息来大致观察数据的常规特点&#xff0c;比如数据规模&#xff08;行数列数&#xff09;、数据类型、类别数量&#xff08;变量数目、取值范围…

文生图提示词:天气条件

天气和气候 --天气条件 Weather Conditions 涵盖了从基本的天气类型到复杂的气象现象&#xff0c;为描述不同的天气和气候条件提供了丰富的词汇。 Sunny 晴朗 Cloudy 多云 Overcast 阴天 Partly Cloudy 局部多云 Clear 清晰 Foggy 雾 Misty 薄雾 Hazy 朦胧 Rainy 下雨 Showers …

【Leetcode刷题笔记】27. 移除元素

原题链接 Leetcode 27. 移除元素 题目 给你一个数组 nums 和一个值 val&#xff0c;你需要原地移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。…

js---webAPI

01 声明变量 js组成&#xff1a; DOM:操作网页内容的,开发页面内容特效和实现用户交互 BOM: DOM树&#xff1a;将 HTML 文档以树状结构直观的表现出来&#xff0c;我们称之为文档树或 DOM 树 文档树直观的体现了标签与标签之间的关系 CSS获取元素的方法 document.querySele…

stm32h750中文数据手册以及中文参考手册

stm32h750中文数据手册以及中文参考手册 &#x1f527;腾讯交互翻译&#xff1a;https://transmart.qq.com/zh-CN/file&#x1f528;PDF拆分合并工具集在线&#xff1a;https://www.ilovepdf.com/zh-cn ✨就目前来讲&#xff0c;stm32h750VB芯片价格&#xff0c;算是历史新低&a…

Mybatis-Plus常用技巧

一、官网网站&#xff1a; https://baomidou.com/pages/24112f/#%E7%89%B9%E6%80%A7 技巧和常用方法在官网使用 二、离线安装MybatisX插件-free 1、在idea官网下载插件的zip压缩包&#xff0c;上链接&#xff08;https://plugins.jetbrains.com/&#xff09; 2、在搜索框搜…

模型训练 —— AI算法初识

一、背景 AI算法中模型训练的主要目的是为了让机器学习算法从给定的标注数据中学习规律、特征和模式&#xff0c;并通过调整模型内部参数&#xff0c;使模型能够对未见过的数据进行准确预测或决策。具体来说&#xff1a; 1. **拟合数据**&#xff1a;模型通过训练来识别输入数…

Android下SF合成流程重学习之onMessageInvalidate

Android下SF合成流程重学习之onMessageInvalidate 引言 虽然看了很多关于Android Graphics图形栈的文章和博客&#xff0c;但是都没有形成自己的知识点。每次学习了&#xff0c;仅仅是学习了而已&#xff0c;没有形成自己的知识体系&#xff0c;这次趁着有时间&#xff0c;这次…

外汇天眼:8个平台被打击,有的因诈骗被处罚!

上周&#xff0c;澳大利亚证券和投资委员会&#xff08;ASIC&#xff09;取消了总部位于悉尼的Brava Capital的澳大利亚金融服务许可证&#xff08;AFSL&#xff09;&#xff0c;意大利公司和交易委员会CONSOB则将6个非法投资平台网站列入黑名单。另外&#xff0c;Reiwa-Capita…

uni-app使用uView打开弹出层后输入框聚焦时placeholder错位问题

这里就不放效果了&#xff0c;大概意思就是在使用uView的popus时&#xff0c;在底部弹出后&#xff0c;如果弹窗中的输入框会造成一瞬间的placeholder文字错位&#xff0c;这个问题的主要是因为uView安全区适配导致 uView相关文档 https://www.uviewui.com/components/safeAr…

视频如何去除水印?这三个方法赶紧收藏

在数字化内容的海洋中&#xff0c;视频已成为我们日常生活中不可或缺的一部分。然而&#xff0c;很多时候&#xff0c;我们渴望观看的优质视频内容却被水印所困扰。因此我们就需要视频去水印工具来帮助我们解决这些困扰。 一、水印云 水印云的视频去水印功能采用了先进的 AI …

自己部署一个牛逼的开发备忘录系统

目录 效果 简介 安装 使用 效果 简介 为开发人员分享快速参考备忘清单【速查表】。这是英文版 Reference 的中文版本&#xff0c;目的是为了方便自己的技术栈查阅&#xff0c;如果您提供一个清单&#xff0c;我将抽空搬运&#xff0c;立即撸起来 :)。如果您发现此处的备忘单…

数字化转型导师坚鹏:BLM政府数字化转型战略

BLM政府数字化转型战略 ——以BLM模型为核心&#xff0c;实现知行果合一 课程背景&#xff1a; 很多政府存在以下问题&#xff1a; 不知道如何系统地制定政府数字化转型战略&#xff1f; 不清楚其它政府数字化转型战略是如何制定的&#xff1f; 不知道其它政府数字化转…

分享一下,程序员为什么不喜欢关电脑?(个人观点仅供娱乐哈哈哈)

你是否曾经疑惑&#xff0c;为何身边的程序员朋友总是让电脑保持开机状态&#xff0c;仿佛与它们有着不解之缘&#xff1f;别急着给他们贴上“电脑迷”的标签&#xff0c;背后其实隐藏着许多合理的原因。今天&#xff0c;就让我们一同走进程序员的世界&#xff0c;探究他们为何…

Windows Server系列的时钟同步

文章目录 前言一、设置时钟同步二、调整同步周期总结前言 在Windows Server系列操作系统上部署网站应用有时候需要考虑服务器之间的时钟同步问题。当存在不同服务器之间的通讯访问并且要求一定的安全限定时,时钟同步的需求尤其显得比较迫切。本文将以Windows2012server为例,…

WorkPlus构建安全高效的内网通信平台,助力企业内部协作

为何选择WorkPlus作为内网通信软件的首选&#xff1f;首先&#xff0c;WorkPlus提供全面的内网通信解决方案。不论是文字聊天、语音通话还是实时视频会议&#xff0c;WorkPlus都能提供稳定、高效的通信体验&#xff0c;确保团队成员能够及时分享信息、快速沟通和协作。通过Work…

Redis篇----第五篇

系列文章目录 文章目录 系列文章目录前言一、redis的过期策略以及内存淘汰机制二、Redis 常见性能问题和解决方案?三、为什么Redis的操作是原子性的,怎么保证原子性的?四、Redis事务前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家…

4核8G云服务器够用吗?支持多少人?

4核8G服务器支持多少人同时在线访问&#xff1f;阿腾云的4核8G服务器可以支持20个访客同时访问&#xff0c;关于4核8G服务器承载量并发数qps计算测评&#xff0c;云服务器上运行程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&…

Google Gemini 1.5:引领跨模态AIGC信息分析理解与视频内容推理的新篇章,与 Open AI 决一高下!

Gemini 1.5具有100万token的上下文理解能力&#xff0c;是目前最强&#xff01;具有跨模态理解和推理&#xff1a;能够对文本、代码、图像、音频和视频进行高度复杂的理解和推理。允许分析1小时视频、11小时音频、超过30,000行代码或超过700,000字的文本。不过谷歌这个Gemini 1…

java后端将非树型结构的机构数据转换为树形结构的机构数据示例

文章目录 前言一、非树型机构信息1.示例数据2.机构编码规则二、转换为树型机构1.转换逻辑2.具体实现2.1.将excel文件读取到程序中2.2.解析机构编码并获取所有的父级编码候选值2.3.设置所有节点的ParentCode2.4.查找机构的根节点2.5.通过ParentCode构建完整的树型结构2.6.将树形…