MyBatis开发:使用注解

news2025/1/11 5:52:59

在应⽤分层学习时, 我们了解到web应⽤程序⼀般分为三层,即:Controller、Service、Dao .之前的案例中,请求流程如下: 浏览器发起请求, 先请求Controller, Controller接收到请求之后, 调⽤Service进⾏业务逻辑处理, Service再调⽤Dao, 但是Dao层的数据是Mock的, 真实的数据应该从数据库中读取。我们学习MySQL数据库时,已经学习了JDBC来操作数据库, 但是JDBC操作太复杂了,所以我们学习使用MyBatis。

一.什么是MyBatis?

  • MyBatis是⼀款优秀的 持久层 框架,⽤于简化JDBC的开发。
  • MyBatis本是 Apache的⼀个开源项⽬iBatis,2010年这个项⽬由apache迁移到了google code,并且改名为MyBatis 。2013年11⽉迁移到Github。

在上⾯我们提到⼀个词:持久层

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

简单来说 MyBatis 是更简单完成程序和数据库交互的框架,也就是更简单的操作和读取数据库⼯具
接下来,我们就通过⼀个⼊⻔程序,让⼤家感受⼀下通过Mybatis如何来操作数据库。
举个栗子~
  • 就像餐馆老板不需要亲自去后厨找每一种食材一样,MyBatis 封装了 JDBC(Java Database Connectivity)的复杂操作,如加载数据库驱动、建立连接、创建 SQL 语句等。这样,开发者就可以专注于编写 SQL 语句本身,而不需要处理这些底层的、繁琐的数据库连接工作。

 二.创建工程

1.创建springboot⼯程,并导⼊ mybatis的起步依赖、mysql的驱动包

Mybatis 是⼀个持久层框架, 具体的数据存储和数据操作还是在MySQL中操作的, 所以需要添加
MySQL驱动.
  • 项⽬⼯程创建完成后,⾃动在pom.xml⽂件中,导⼊Mybatis依赖和MySQL驱动依赖

2.数据库创建用户表(userinfo)

3.创建⽤⼾表, 并创建对应的实体类User

代码:

package com.example.demo.model;

import lombok.Data;

import java.util.Date;

@Data
public class UserInfo {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private Integer gender;
    private String phone;
    private Integer deleteFlag;
    private Date createTime;
    private Date updateTime;
}

 4.通过yml文件配置数据库连接字符串

  • 同时加上mybatis打印⽇志(方便我们进行日志查看)

 连接数据库代码:

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
    username: root
    password: weigang527
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis打印日志代码:

mybatis:
  # 配置 mybatis xml 的文件路径,在 resources/mapper 创建所有表的 xml 文件
  mapper-locations: classpath:mybatis/**Mapper.xml
  configuration: # 配置打印 MyBatis日志

注意事项:
如果使⽤ MySQL 是 5.x 之前的使⽤的是"com.mysql.jdbc.Driver",如果是⼤于 5.x 使⽤的
是“com.mysql.cj.jdbc.Driver”.

如果是application.properties⽂件, 配置内容如下: 

 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
3 #数据库连接的url
4 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_test?
characterEncoding=utf8&useSSL=false
5 #连接数据库的⽤⼾名
6 spring.datasource.username=root
7 #连接数据库的密码
8 spring.datasource.password=root

5.在项⽬中, 创建持久层接⼝UserInfoMapper(声明方法)

比如我要查询整张表

代码:
package com.example.demo.mapper;

import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface UserInfoMapper {
    @Select("select * from userinfo")
    List<UserInfo> getUserInfoAll();
}

6.单元测试

点击鼠标右键

 代码:

 @Test
    void getUserInfoAll() {
        System.out.println(userInfoMapper.getUserInfoAll());
    }

7.查看 

三.增删改查操作

3.1删除(delete)

1.接口方法声明

@Select("select * from userinfo where delete_flag = #{deleteFlag}")//#{deleteFlag}类似占位符?

    List<UserInfo> getUserInfoByDeleteFlag(Integer deleteFlag);

2.单元测试(鼠标右键)

3.运行

如果只有一个参数,参数名可以不一样,随便怎么修改

3.2查询(select)

查询条件(gender = 2,delete_flag = 0)

有多个参数时,此时我要查询数据库的wangwu

1.接口中声明方法

 代码:

    @Select("select * from userinfo where delete_flag = #{deleteFlag} and gender= #{gender}")
    List<UserInfo> getUserInfo2( Integer deleteFlag, Integer gender);

2. 进行单元测试

 @Test
    void selectUserInfos2() {
        System.out.println(userInfoMapper.selectUserInfos());
    }

3.查询成功 

 3.3插入(insert)

插入操作:

插入成功,返回一个整数(影响的行数)

当调用这个方法时,需要传入一个UserInfo对象。MyBatis会自动将这个对象的属性值与SQL语句中的参数占位符匹配,并执行插入操作。

1.方法声明

代码:

 @Insert("insert into userinfo (username, password, age, gender) values (#{username},#{password},#{age},#{gender})")
    Integer insert(UserInfo userInfo);

 2.进行单元测试

代码:

  @Test
    void insert() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("zhaoliu6666");
        userInfo.setPassword("88888");
        userInfo.setAge(18);
        userInfo.setGender(1);
        Integer result = userInfoMapper.insert(userInfo);
        System.out.println("result: "+result + ",id:"+userInfo.getId());
    }

 3.插入成功

 

补充:有自增id的注解


 @Options(useGeneratedKeys = true, keyProperty = "id")

​

 3.4删除

删除id为6的信息

1.方法声明

 代码:

 @Delete("delete from userinfo where id = #{id}")
    Integer delete(Integer id);

2.单元测试

@Test
    void delete() {
        System.out.println("删除数据: "+ userInfoMapper.delete(6));
    }

3.删除成功

 

 3.4更新(update)

更新id为1的用户信息 

 1.方法声明

 代码:

@Update("update userinfo set password = #{password}, age = #{age}, gender = #{gender} where id = #{id}")
    Integer update(UserInfo userInfo);

2.单元测试

代码:

@Test
    void update() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(1);
        userInfo.setPassword("123456");
        userInfo.setAge(56);
        userInfo.setGender(2);
        Integer result = userInfoMapper.update(userInfo);
        System.out.println("更新影响行数: "+result);
    }

3.更新成功

3.5属性无法映射

查询是最简单的语句,但是我们这里增添了难度。

当数据库和对象的属性不对应时,显示为null。

1.方法声明 

 

代码:

@Select("select * from userinfo")
    List<UserInfo> getUserInfoAll();

2.单元测试

代码: 

 @Test
    void getUserInfoAll() {
        System.out.println(userInfoMapper.getUserInfoAll());
    }

日志打印:

 3.5.1起别名

解决办法1:使用SQL语句起别名的方式。

1.在声明方法中添加属性

代码:

@Select("SELECT id, username, password, age, gender, phone, " +
            "delete_flag as deleteFlag, create_time as createTime, update_time as updateTime " +
            "FROM `userinfo`")
    List<UserInfo> selectUserInfos();

2.单元测试

@Test
    void selectUserInfos() {
        System.out.println(userInfoMapper.selectUserInfos());
    }

3.显示成功 

 3.5.2结果映射

 1.声明方法中添加@Results注解

@Results(id ="resultMap" , value = {
            @Result(column = "delete_flag", property = "deleteFlag"),
            @Result(column = "create_time", property = "createTime"),
            @Result(column = "update_time", property = "updateTime")
    })
    @Select("SELECT * FROM `userinfo`")
    List<UserInfo> selectUserInfos2();

2.单元测试 

 @Test
    void selectUserInfos2() {
        System.out.println(userInfoMapper.selectUserInfos());
    }

 3.打印成功

 3.5.3驼峰转换

 在yml文件进行配置:

map-underscore-to-camel-case: true #配置驼峰自动转换

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

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

相关文章

记录使用FlinkSql进行实时工作流开发

使用FlinkSql进行实时工作流开发 引言Flink SQL实战常用的Connector1. MySQL-CDC 连接器配置2. Kafka 连接器配置3. JDBC 连接器配置4. RabbitMQ 连接器配置5. REST Lookup 连接器配置6. HDFS 连接器配置 FlinkSql数据类型1. 基本数据类型2. 字符串数据类型3. 日期和时间数据类…

Spring 如何集成日志框架

文章目录 一、日志依赖1.1 Spring 如何集成日志1.2 SpringBoot 的默认日志门面和日志系统 二、日志配置2.1 SpringBoot 日志配置方式2.2 SpringBoot 日志重定向到文件 参考资料 一、日志依赖 1.1 Spring 如何集成日志 从Spring Framework 5.0开始&#xff0c;Spring 在 sprin…

淘宝的商品信息缓存体系是如何构建的?

0 前言 在电商系统中&#xff0c;商品信息的快速获取对用户体验至关重要。本文将详细讲解一个多层级的商品信息缓存体系&#xff0c;旨在提高系统性能和可靠性。 开局一张图&#xff0c;剩下全靠编&#xff01; 1 整体架构 该缓存体系采用了多级缓存策略&#xff0c;从前端到…

influxDB的常用命令

目录 1.查看数据库命令 2.进入某数据库命令 3.创建表的命令 (host 和region 字段是必须的) 4.显示所有的表命令 5. 删除表 6.查询表数据 7.显示数据库用户 8.创建用户 9.创建管理员用户 10.修改密码(密码用单引号括住&#xff0c;不要用双引号) 11. 分配数据库访问权…

满客宝后台管理系统 downloadWebFile 任意文件读取漏洞复现(XVE-2024-18926)

0x01 产品简介 满客宝后台管理系统由正奇晟业&#xff08;北京&#xff09;科技有限公司开发&#xff0c;满客宝智慧食堂系统的重要组成部分&#xff0c;它为餐饮管理者提供了一个全面的、智能化的管理平台。该系统集成了用户管理、消费限制、菜谱管理、卡务管理、进销存管理、…

Linux进程间通信1

文章目录 前言管道命名管道 / FIFO消息队列 前言 进程之间可能会存在特定的协同工作的场景&#xff0c;而协同就必须要进行进程间通信&#xff0c;协同工作可能有以下场景。 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。 通知事件…

【TDH社区版大事件】图分析、全文检索、小文件治理、数据开发工具通通都有!

星环科技大数据基础平台TDH社区版&#xff0c;在保留了商业版核心技术优势的基础上最大程度地降低了用户使用大数据技术的门槛与成本&#xff0c;具有更轻量、更简单、更易用等特性。 此次TDH社区开发版、社区版、社区订阅版均发布了新版本&#xff0c;带来新的产品组件和新的…

我是如何给阿里大神Tree工具类做CodeReview并优化的

首发公众号&#xff1a;赵侠客 引言 前段时间我写了一篇关于树操作的工具类《解密阿里大神写的天书般的Tree工具类&#xff0c;轻松搞定树结构&#xff01;》&#xff0c;当时主要把精力集中在分析代码的实现层面&#xff0c;没有从设计层面、性能层考虑&#xff0c;然后就被很…

Linux网络之多路转接——老派的select

目录 一、高级IO 1.1 概念 1.2 五种IO模型 1.3 小结 二、多路转接的老派 2.1 select 的作用 2.2 select 的接口 三、select 的编写 3.1 类的预先准备 3.2 类的整体框架 3.3 类的执行 Loop 四、Loop 中的回调函数 4.1 HandlerEvent 4.2 AcceptClient 4.3 Service…

二、4 函数的递归与迭代

1、n 的阶乘 2、斐波那契数列 &#xff08;1&#xff09;递归 用递归解决这个问题&#xff0c;由于需要多次重复计算&#xff0c;当 n 较大时&#xff0c;计算效率就非常慢 &#xff08;2&#xff09;迭代&#xff08;速度更快&#xff09;

C# 下⽀持表达式树的框架类型详解与示例

文章目录 什么是表达式树&#xff1f;表达式树的主要用途包括&#xff1a;表达式树节点类型示例&#xff1a;创建一个简单的加法表达式树示例&#xff1a;使用表达式树进行数据绑定示例&#xff1a;动态生成代码总结 在C#中&#xff0c;表达式树&#xff08;Expression Tree&am…

首届「中国可观测日」圆满落幕

首届中国可观测日&#xff08;Observability Day&#xff09;在上海圆满落幕&#xff0c;为监控观测领域带来了一场技术盛宴。作为技术交流的重要平台&#xff0c;此次活动不仅促进了观测云与亚马逊云科技之间的深化合作&#xff0c;更标志着双方共同推动行业发展的重要里程碑。…

红蓝绿三巨头集体拉胯,NVIDIA新显卡被核显秒了

最近蓝厂 intel 的瓜想必大家都已经吃上了吧&#xff1f;13-14 代中高端 CPU 大面积故障崩溃事件。 后续是 intel 官方回应&#xff0c;系微代码错误&#xff0c;请求电压较高导致的。 intel 目前给出的方案是&#xff0c;出现了问题的 CPU&#xff0c;intel 给予免费换新售后…

微信小程序之单选框

微信小程序中的单选框&#xff08;Radio&#xff09;是一个常用的输入组件&#xff0c;用于在多个选项中进行选择。常见的应用场景有性别选择、选项过滤、问卷调查等。本文将介绍小程序中单选框的特点和作用及相应示例。 一、单选框的特点和作用 特点&#xff1a; 单一选择&a…

php yii2 foreach中使用事务,事务中使用了 continue

问题描述&#xff1a;使用yii2&#xff0c;在foreach中使用事务&#xff0c;每个循环一个事务&#xff0c;在事务进行判断,然后直接continue,导致后面的循环数据没有保存成功 如下图&#xff1a; 修改后&#xff1a;如下图

【人工智能学习之商品检测实战】

【人工智能学习之商品检测实战】 1 开发过程2 网络训练效果2.1 分割网络2.2 特征网络 3 跟踪与后处理4 特征库优化5 项目源码解析5.1 yolo训练train_yolo.pygood_net.pydataset.pygood_cls_data.pysave_feature.pyanalyse_good.pyshop_window.pytest.py 6 结语 1 开发过程 拍摄…

Spring boot 整合influxdb2

一.服务安装 docker search influxdb docker pull influxdb docker run -dit --name influxdb --restart always -p 8086:8086 -v /dp/docker/file/influxdb:/var/lib/influxdb influxdb 访问8086 初始化 账号组织和新建bucket 创建密钥 这些豆记录下来 二.项目配置 引入依赖…

什么是物流锁控,RFID物流智能锁对于物流锁控有什么意义

在当今竞争激烈的全球商业环境中&#xff0c;物流行业作为经济发展的重要支撑&#xff0c;其高效、安全的运作至关重要。物流锁控作为保障物流运输过程中货物安全、准确和及时交付的关键环节&#xff0c;正面临着日益复杂的挑战。 一、物流锁控的定义与范畴 物流锁控&#xf…

JavaScript学习笔记(十一):JS Browser BOM

1、JavaScript Window - 浏览器对象模型 浏览器对象模型&#xff08;Browser Object Model (BOM)&#xff09;允许 JavaScript 与浏览器对话。 1.1 浏览器对象模型&#xff08;Browser Object Model (BOM)&#xff09; 不存在浏览器对象模型&#xff08;BOM&#xff09;的官方…