MyBatis完成单表的CRUD

提示:如果没有基础的可以看我的博客 ===> 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 configurationPUBLIC "-//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 mapperPUBLIC "-//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 mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="article"><insert id="insertArticleForMap">insert into articlevalues (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 articlevalues (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 articleset 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 updateTimefrom articlewhere 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 mapperPUBLIC "-//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.mzph.cn/news/687911.shtml

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

相关文章

【STM32 CubeMX】SPI HAL库编程

文章目录 前言一、CubeMX配置SPI Flash二、SPI HAL编程2.1 查询方式函数2.2 使用中断方式2.3 DMA方式 总结 前言 STM32 CubeMX 是一款由 STMicroelectronics 提供的图形化配置工具&#xff0c;用于生成 STM32 微控制器的初始化代码和项目框架。在 STM32 开发中&#xff0c;使用…

4核8G云服务器多少钱?价格汇总

4核8G云服务器多少钱一年&#xff1f;阿里云ECS服务器u1价格955.58元一年&#xff0c;腾讯云轻量4核8G12M带宽价格是646元15个月&#xff0c;阿腾云atengyun.com整理4核8G云服务器价格表&#xff0c;包括一年费用和1个月收费明细&#xff1a; 云服务器4核8G配置收费价格 阿里…

#11vue3中使用el-dialog展示与关闭交由父组件控制的写法

目录 1、法一&#xff1a;通过defineEmits调用父组件方法 1.1、父组件 1.2、子组件&#xff08;CONTENT&#xff09; 2、法二&#xff1a;通过difineExpose暴露子组件属性 2.1、父组件 2.2、子组件&#xff08;Child&#xff09; 1、法一&#xff1a;通过defineEmits调用…

使用 Coze 搭建 TiDB 助手

导读 本文介绍了使用 Coze 平台搭建 TiDB 文档助手的过程。通过比较不同 AI Bot 平台&#xff0c;突出了 Coze 在插件能力和易用性方面的优势。文章深入讨论了实现原理&#xff0c;包括知识库、function call、embedding 模型等关键概念&#xff0c;最后成功演示了如何在 Coze…

关于Windows中的DirectX的知识,看这篇文章就差不多了

DirectX是Windows中用于多媒体和视频程序的API集合,对游戏玩家尤其重要。DirectX诊断工具显示有关DirectX的丰富信息,还允许你在DirectX系统上执行基本诊断测试。如果你想检查你正在运行的DirectX版本,甚至输出一个充满诊断信息的文件以进行故障排除,下面是如何做到的。 D…

开发知识点-JAVA-springboot+Spring Security/Shiro

Spring Security/Shiro shiroShiro反序列化相关URLDNS链Shiro CC链Shiro CB链Shiro反序列化WAF绕过Java快速开发框架_若依——前后端分离版- 3. 登陆 springsecurity认证 Debug - postman模拟SpringBoot+SpringSecurity+dubbo图书电商后台实战-对象映射-基本属性映射SpringBoot…

一连三部电影撤出春节档,给行业带来什么启示?

继《我们一起摇太阳》后&#xff0c;《红毯先生》于2月16日晚也宣布退出今年春节档。 至此&#xff0c;加上动画电影《黄貔&#xff1a;天降财神猫》&#xff0c;2024年春节档已有三部影片撤档&#xff0c;在春节档历届过往中实属少见。 其中&#xff0c;《红毯先生》、《我们…

【数据仓库】主题域和数据域

数据域与主题域区别 https://www.cnblogs.com/datadance/p/16898254.html 数据域是自下而上&#xff0c;以业务数据视角来划分数据&#xff0c;一般进行完业务系统数据调研之后就可以进行数据域的划分。针对公共明细层&#xff08;DWD&#xff09;进行主题划分。主题域则自上而…

《苍穹外卖》知识梳理6-缓存商品,购物车功能

苍穹外卖实操笔记六—缓存商品&#xff0c;购物车功能 一.缓存菜品 可以使用redis进行缓存&#xff1b;另外&#xff0c;在实现缓存套餐时可以使用spring cache提高开发效率&#xff1b;   通过缓存数据&#xff0c;降低访问数据库的次数&#xff1b; 使用的缓存逻辑&#…

ChatGPT的大致原理

国外有个博主写了一篇博文&#xff0c;名字叫TChatGPT: Explained to KidsQ」&#xff0c; 直译过来就是&#xff0c;给小孩子解释什么是ChatGPT。 因为现实是很多的小孩子已经可以用父母的手机版ChatGPT玩了 &#xff0c;ChatGPT几乎可以算得上无所不知&#xff0c;起码给小孩…

CDH 6.3.2集成Hudi异常org.codehaus.jackson不存在及开源JDK版本异常

CDH 6.3.2集成Hudi异常&#xff0c;首先获取hudi源码&#xff0c;地址&#xff1a;git clone https://github.com/apache/hudi.git&#xff0c;进入根目录hudi编译相关jar时&#xff0c;存在2个问题jar包依赖为导入和开源JDK版本问题。异常分别如下所示。 1.编译命令 到hudi根…

【漏洞复现-通达OA】通达OA share身份认证绕过漏洞

一、漏洞简介 通达OA(Office Anywhere网络智能办公系统)是中国通达公司的一套协同办公自动化软件。通达OA /share/handle.php存在一个认证绕过漏洞,利用该漏洞可以实现任意用户登录。攻击者可以通过构造恶意攻击代码,成功登录系统管理员账户,继而在系统后台上传恶意文件控…

哪种台灯的灯光适合学生用?明基/书客/松下等护眼台灯推荐

目前近视人群越来越多&#xff0c;并且有低龄化的倾向。针对护眼这一卖点&#xff0c;市面上出现了很多护眼台灯品牌&#xff0c;但是很多不知名的网红品牌生产出来的产品质量没有办法得到保障。在挑选护眼台灯时&#xff0c;还是要先做好攻略才不会踩雷。 一、使用护眼台灯更…

Stable Diffusion webui安装详细教程

上一篇文章介绍了sd主流的ui&#xff0c;相信大家已经有所了解&#xff0c;下面为大家介绍sd-webui的安装详细教程 文章目录 一、 安装包说明二、对电脑的要求三、安装文件介绍四、安装步骤五、电脑问题与云主机六、界面简要说明及通用反向提示词 一、 安装包说明 通常我们使…

14. Qt 程序菜单实现,基于QMainWindow

目录 前言&#xff1a; 技能&#xff1a; 内容&#xff1a; 一、ui中直接添加控件实现 二、 完全通过代码实现菜单 参考&#xff1a; 前言&#xff1a; 基于QMainWindow&#xff0c;两种方式实现菜单&#xff1a;通过直接添加ui控件快速添加菜单和完全通过代码实现菜单&a…

护眼落地灯值得买吗?书客、霍尼韦尔、柏曼三款落地灯大PK!

落地灯对于上班族、学生党来说真的很友好&#xff0c;能够提供贴合眼睛用光舒适的光度&#xff0c;使这些日常长时间用眼的人能够减少不良光线对眼睛造成的影响&#xff0c;从而科学健康的用眼&#xff01; 市面上的落地灯产品越来越多&#xff0c;琳琅满目的产品让不少刚接触落…

⭐北邮复试刷题429. N 叉树的层序遍历(按层入队出队BFS)(力扣每日一题)

429. N 叉树的层序遍历 给定一个 N 叉树&#xff0c;返回其节点值的层序遍历。&#xff08;即从左到右&#xff0c;逐层遍历&#xff09;。 树的序列化输入是用层序遍历&#xff0c;每组子节点都由 null 值分隔&#xff08;参见示例&#xff09;。 示例 1&#xff1a;输入&a…

自定义类型详解 ----结构体,位段,枚举,联合

目录 结构体 1.不完全声明 2.结构体的自引用 3.定义与初始化 4.结构体内存对齐与结构体类型的大小 结构体嵌套问题 位段 1.什么是位段&#xff1f; 2.位段的内存分配 枚举 1.枚举类型的定义 2.枚举的优点 联合&#xff08;共同体&#xff09; 1.联合体类型的声明以…

多模态(三)--- BLIP原理与源码解读

1 BLIP简介 BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 传统的Vision-Language Pre-training &#xff08;VLP&#xff09;任务大多是基于理解的任务或基于生成的任务&#xff0c;同时预训练数据多是从web获…

D3842——三极管驱动,专为脱线和Dc-Dc开关电源应用设计的,起动电流小

D3842/43/44是专为脱线和Dc-Dc开关电源应用设计的恒频电流型Pwd控制器内部包含温度补偿精密基准、供精密占空比调节用的可调振荡器、高增益混放大器、电流传感比较器和适合作功率MOST驱动用的大电流推挽输出颇以及单周期徊滞式限流欠压锁定、死区可调、单脉冲计数拴锁等保护电路…