「MyBatis」数据库相关操作

news2024/9/22 21:30:13

MyBatis 简介

MyBatis 是⼀个持久层框架,用于简化 JDBC 的开发

持久层指的就是持久化操作的层,通常指数据访问层 (dao),是用来操作数据库

@Mapper 注解的接口表示该接口是 MyBatis 中的 Mapper 接口
回顾一下之前提到过的图
简单来说,MyBatis 就是让我们能更简单地完成程序和数据库交互的框架
这里补充一下企业中数据库建表规范
  1. 字段名统一小写,单词之间使用下划线 _ 分割
  2. 建表字段必须包含:自增字段、更新时间和创建时间,不管有没有用到这些字段

单元测试

SpringBoot 工程中 src 的 test 目录下已经自动创建好一个测试类(绿色背景部分),我们可以直接用这个测试类来进行测试

测试类上添加了注解 @SpringBootTest,它在运行时会自动加载 Spring 的运行环境
我们通过 @Autowired 这个注解, 注入要测试的类, 就可以进行测试了


MyBatis 基础操作

1. 添加依赖:mybatis、MySQL 驱动

在新建项目的时候勾选这两个

2. 配置数据库

添加下面这段 yml 的配置文件

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
    username: root
    password: 1234
    driver-class-name: com.mysql.cj.jdbc.Driver
  mvc:
    favicon:
      enable: false
  profiles:  #多平台配置
    active: dev
# 设置 Mybatis 的 xml 保存路径
mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml
  configuration: # 配置打印 MyBatis 执行的 SQL
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true  #自动驼峰转换
# 配置打印 MyBatis 执行的 SQL
logging:
  file:
    name: logs/springboot.log
  logback:
    rollingpolicy:
      max-file-size: 1KB
      file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
  level:
    com:
      example:
        demo: debug

3. 编写持久层的代码,具体见下文



打印日志

添加下面的配置信息

mybatis:
 configuration: # 配置打印 MyBatis ⽇志
   log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

传递参数

假设数据库中有如下四条记录,现在要查找数据库中年龄为 18 的人

在 queryByAge 方法中添加⼀个参数 (age),将方法中的参数传给 SQL 语句,用  #{} 获取方法中的
参数
@Mapper
public interface UserInfoMapper {
    //根据 age 查询
    @Select("select username,password,age,gender,phone from userinfo where age = #{age}")
    public List<UserInfo> queryByAge(Integer age);
}

我们也可以通过 @Param 设置参数的别名, 如果使用  @Param 设置别名,#{...} 里面的属性名必须和 @Param 设置的一样

@Mapper
public interface UserInfoMapper {
    //根据姓名查询
    @Select("select username,password,age,gender,phone from userinfo where username = #{name}")
    public List<UserInfo> queryByName(@Param("name") String name);
}

@SpringBootTest
class UserInfoMapperTest {
    @Autowired
    private UserInfoMapper userInfoMapper;

    @Test
    void queryByName() {
        List<UserInfo> userInfoList = userInfoMapper.queryByName("zhangsan");
        System.out.println(userInfoList);
    }
}

运行结果:


curd

  1. 新增数据
@Mapper
public interface UserInfoMapper {
    @Insert("insert into userinfo(username,password,age,gender,phone) " +
            "values(#{username},#{password},#{age},#{gender},#{phone})")
    public Integer insert(UserInfo userInfo);
}

@SpringBootTest
class UserInfoMapperTest {
    @Autowired
    private UserInfoMapper userInfoMapper;

    @Test
    void insert() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("Script");
        userInfo.setPassword("Script");
        userInfo.setGender(1);
        userInfo.setAge(24);
        userInfo.setPhone("11111111111");
        userInfoMapper.insert(userInfo);
    }
}

运行结果:

可以看到这条记录已经顺利插入:


2. 删除数据

delete from userinfo where...
@Mapper
public interface UserInfoMapper {
    //根据 id 删除数据
    @Delete("delete from userinfo where id = #{id}")
    public Integer delete(Integer id);
}
@SpringBootTest
class UserInfoMapperTest {
    @Autowired
    private UserInfoMapper userInfoMapper;

    @Test
    void delete() {
        userInfoMapper.delete(2);
    }
}

删除前:

删除后:


3. 修改

SQL 语句如下:

update userinfo set username="zhaoliu" where id=5
Mapper 接口
@Update("update userinfo set username=#{username} where id=#{id}")
void update(UserInfo userInfo);


4. 查询

查询的时候,我们会发现一些字段为空,也就是说它们是没有赋值的。只有 Java 对象属性和数据库字段一模一样时才会赋值(忽略大小写)

 @Select("select id, username, `password`, age, gender, phone, delete_flag, 
create_time, update_time from userinfo")
 List<UserInfo> queryAllUser();

从图中可以看出,下面这三个字段查询结果都为空

这是因为当自动映射查询结果时,MyBatis 会获取数据库中的对应列名并在Java类中查找同名的属性(忽略大小写)然后赋值。比如说对于 ID 列和 id 属性,MyBatis 会将 ID 这一列的值赋给 id 属性

有三种解决办法:

1. 起别名

在SQL语句中给列名起别名,使它和实体类属性名⼀样

@Select("select id, username, `password`, age, gender, phone, delete_flag as 
deleteFlag, " +
 "create_time as createTime, update_time as updateTime from userinfo")
 public List<UserInfo> queryAllUser();

注意:发现 SQL 语句太长时,可以用 + 把每部分拼接起来,每部分之间记得留空格


2. 结果映射

就这样:

@Select("select id, username, `password`, age, gender, phone, delete_flag, 
create_time, update_time from userinfo")
@Results({
    @Result(column = "delete_flag",property = "deleteFlag"),
    @Result(column = "create_time",property = "createTime"),
    @Result(column = "update_time",property = "updateTime")
})
public List<UserInfo> queryAllUser2();

3. 使用驼峰命名

数据库的列通常使用蛇形命名法命名(使用下划线分割各个单词);而 Java 属性一般遵循驼峰命名法的约定。为了在这两种命名方式之间启用自动映射,需要将 mapUnderscoreToCamelCase 设置为 true。

mybatis:
  configuration: # 配置打印 MyBatis 执行的 SQL
    map-underscore-to-camel-case: true  #配置驼峰自动转换

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

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

相关文章

如何选用合适的开源知识管理系统?10款软件推荐

国内外主流的10款开源知识管理软件对比&#xff1a;PingCode、Worktile、DokuWiki、MediaWiki、GitBook、Nuclino、Think、TiddlyWiki、AFFiNE、Foam。 在管理知识的广阔天地中&#xff0c;选择合适的工具可能会让你感到头痛。开源知识管理软件以其灵活性和成本效益在行业内脱颖…

Java设计模式-单例模式最佳实践

1. 单例模式简介 Java 单例模式是四大设计模式之一&#xff0c;属于创建型设计模式。从定义上看&#xff0c;它似乎是一种简单的设计模式&#xff0c;但在实现时&#xff0c;如若不注意&#xff0c;它会带来很多问题。 在本文中&#xff0c;我们将了解单例设计模式原则&#…

使用 GPU 加速的 XGBoost 预测出租车费用

目录 XGBoost GPU 加速的 XGBoost 用例数据集示例 将文件中的数据加载到 DataFrame 定义特征数组 保存模型 总结 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c; 可以当故事来看&#xf…

小智纯前端js报表实战5-绝对坐标-横向扩展

绝对坐标-横向扩展 概述 绝对坐标-横向扩展&#xff1a;绝对坐标定位 层次坐标是实现复杂报表的一个重要功能。 在进行小智报表模板设计时&#xff0c;单元格尚未进行扩展&#xff0c;但是有些时候需要获取扩展后的单元格并进行计算。例如&#xff0c;A1单元格扩展成A1-D1&am…

VUE+Spring前后台传值的坑,后台接收的String参数在末尾会出现 “=”

一、问题 VUESpringBoot做增删改查时&#xff0c;前端使用axios.post发起请求&#xff0c;传输主键字符型参数 taskId 到后台&#xff0c;后台再进行删除处理。 实际过程中发现后台拿到的数据再末尾多了一个等号&#xff0c;但是通过console.log(taskId)前台打印参数是正常的…

巴洛克风格的现代演绎,戴上亚法银耳机,感受古典雕花与现代声学的碰撞

flipears耳机品牌以其独特的风格、精细的配置和卓越的音质在耳机市场中很受欢迎&#xff0c;像是我最近用过的一款Artha Argentum亚法银&#xff0c;就采用了纯银外壳&#xff0c;而且用料扎实&#xff0c;具有出众的声学表现&#xff0c;带来了更干净清澈的声底。内在配置方面…

[Linux] LVM挂载的硬盘重启就掉的问题解决

问题&#xff1a;系统重启后挂在逻辑卷的盘会掉&#xff08;必现&#xff09; 环境&#xff1a;SUSE Linux 11 SP4 原因&#xff1a;boot.lvm是关闭的 解决&#xff1a;boot.lvm设置开启 参考资料&#xff1a; linux下lvm状态Not avaliable问题排查及处理(常见Suse操作系统…

使用ubuntu串口数据收和发不一致问题

串口配置 使用virtual Serial Port Driver Pro模拟串口两个串口&#xff0c;com2和com3&#xff0c;使用默认配置&#xff1b;通过virtual box 串口映射功能&#xff0c;在Ubuntu里使用CuteCom打开com2接受和发送数据&#xff0c;在windows里使用com3发送和接收数据。 遇到问…

24/8/9算法笔记 随机森林

"极限森林"&#xff08;Extremely Randomized Trees&#xff0c;简称ERT&#xff09;是一种集成学习方法&#xff0c;它属于决策树的变体&#xff0c;通常被归类为随机森林&#xff08;Random Forest&#xff09;的一种。极限森林的核心思想是在构建决策树时引入极端…

空间推理验证码的介绍!

空间推理验证码 ​是一种验证码形式&#xff0c;‌旨在通过要求用户解决一些视觉或空间推理问题来区分计算机和人类用户。‌这种验证码形式要求用户通过完成一些视觉或空间推理任务来证明他们是真实的人类用户&#xff0c;‌而不是计算机程序。‌空间推理验证码通常涉及一些图…

智慧交通:将物联网与人工智能完美融合

智慧交通是当今社会面临的一个重要挑战&#xff0c;也是人们生活质量提高的一个重要方面。通过将物联网技术与人工智能相结合&#xff0c;我们能够实现智慧交通系统的全面升级和优化&#xff0c;为人们带来更加便捷、高效和安全的出行体验。 在智慧交通领域&#xff0c;物联网…

Java面试题--JVM大厂篇之从原理到实践:JVM 字节码优化秘籍

目录 引言&#xff1a; 正文&#xff1a; 1. JVM 字节码生成原理 2. 字节码优化的痛点 3. 字节码优化策略 3.1 方法内联&#xff08;Method Inlining&#xff09; 3.2 循环展开&#xff08;Loop Unrolling&#xff09; 3.3 常量折叠&#xff08;Constant Folding&#…

线程池原理(二)关键源码剖析

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 属性 & 构造方法 对于 ThreadPoolExecutor 有几个关键的属性&#xff0c;这里需要先大致了解&#xff1a; public class ThreadPoolExecutor extends AbstractExecutorService {// 控制变量-存放状态和…

什么是NLP分词(Tokenization)

在自然语言处理和机器学习的领域里&#xff0c;咱们得聊聊一个超基础的技巧——就是“分词”啦。这个技巧啊&#xff0c;就是把一长串的文字切分成小块&#xff0c;让机器能更容易地“消化”。这些小块&#xff0c;不管大小&#xff0c;单个的字符也好&#xff0c;整个的单词也…

汽车EDI:德国大众 EDI 项目案例

德国大众&#xff08;Volkswagen&#xff09;是成立于1937年的大型汽车制造商&#xff0c;总部位于德国沃尔夫斯堡。大众集团拥有众多知名汽车品牌&#xff0c;如奥迪、保时捷、宾利、兰博基尼、布加迪等&#xff0c;业务遍及全球。作为一个全球性企业&#xff0c;大众集团依赖…

时序预测|基于变分模态分解-时域卷积-双向长短期记忆-注意力机制多变量时间序列预测VMD-TCN-BiLSTM-Attention

时序预测|基于变分模态分解-时域卷积-双向长短期记忆-注意力机制多变量时间序列预测VMD-TCN-BiLSTM-Attention 文章目录 前言时序预测|基于变分模态分解-时域卷积-双向长短期记忆-注意力机制多变量时间序列预测VMD-TCN-BiLSTM-Attention 一、VMD-TCN-BiLSTM-Attention模型1. **…

SystemUI plugin 开发

一、前言 SystemUI结构复杂,模块数量众多,最重要的是SystemUI属于常驻进程是一个系统的门面,且不能自升级,如果定制功能对主项目做复杂的修改,首先会造成适配压力,如果对主框架不甚理解,有可能会造成很多隐藏的Bug,且不易修复,一旦崩溃对整个系统的影响很大,那么怎…

【从零开始一步步学习VSOA开发】VSOA数据流

VSOA数据流 概念 实际业务中常常存在既有实时命令通信&#xff0c;又有非实时的大数据通信&#xff0c;如文件、音视频传输服务等&#xff0c;如果使用常规的 RPC 或订阅/发布功能来实现&#xff0c;将实时命令和大数据传输混在一起&#xff0c;则会影响 RPC 通道响应的实时性…

C语言程序设计-[10] for语句循环结构

1、for语句循环结构定义 for语句循环结构的一般形式、流程图和执行过程如下&#xff1a; ​ 注1&#xff1a;计算表达式2是循环的判定表达式。与前面一样&#xff0c;这个表达式可以是任意的&#xff0c;只要有值就行&#xff0c;遵循非0即真的原则。 注2&#xff1a;一个循…

(源码)Springboot项目集成Activiti工作流,前端Vue,Bpmn.js

前言 activiti工作流引擎项目&#xff0c;企业erp、oa、hr、crm等企事业办公系统轻松落地&#xff0c;一套完整并且实际运用在多套项目中的案例&#xff0c;满足日常业务流程审批需求。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器&#xff0c;流行的前后端…