MyBatis 的注解实现方法

MyBatis 的注解实现方法

  • MyBatis 的注解实现方法
  • 引入依赖
  • 添加配置
  • 创建表
  • 创建实体类
  • 创建mapper接口
  • @Insert
  • @Delete
  • @Select
    • @Results和@ResultMap
    • 通过配置文件解决
  • @Update
  • @Options

MyBatis 的注解实现方法

在这里插入图片描述

引入依赖

在springBoot项目中下载了EditStarters插件的,可以直接在配置文件处右键
在这里插入图片描述
点击generate
在这里插入图片描述
再次点击这个插件
在这里插入图片描述
在SQL中将图中的勾上就可以啦
在这里插入图片描述

添加配置

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

这里需要注意的是,需要连接的数据库的名称,这里我们使用mybatis_test,还要注意个人的用户名和密码

创建表

-- 创建数据库
DROP DATABASE IF EXISTS mybatis_test;
CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;
-- 使⽤数据数据
USE mybatis_test;
-- 创建表[⽤⼾表]
DROP TABLE IF EXISTS userinfo;
CREATE TABLE `userinfo` (
`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
`username` VARCHAR ( 127 ) NOT NULL,
`password` VARCHAR ( 127 ) NOT NULL,
`age` TINYINT ( 4 ) NOT NULL,
`gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-⼥ 0-默认',
`phone` VARCHAR ( 15 ) DEFAULT NULL,
`delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now(),
PRIMARY KEY ( `id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
-- 添加⽤⼾信息
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );

创建实体类

因为我们在数据库中创建了一个userinfo这样一个表,下面我们要通过mybatis来操作数据库,就需要用到实体类的映射关系

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;

}

实体类的属性名与表中的字段名⼀⼀对应

创建mapper接口

这里创建的接口,后缀最好是以mapper结尾,因为在工作中,mapper里面都是存放的操作数据库的相关代码,而正因为如此,我们可以给他加上一个@Mapper注解来将这个类交给spring来管理,
这里为什么创建的是接口,而不是类,因为接下来我们要实现的操作数据库的方法都不会对齐进行实现,我们只需要将方法定义出来,剩下的交给我们这次的主题,注解来实现

@Insert

对于数据中的添加数据的操作,我们可以先创建一个insert方法

package com.example.demo.mapper;

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

@Mapper
public interface mapper {
    Integer insert(UserInfo userInfo);
}

创建完成之后,我们需要使用@Insert来编写我们的sql代码

package com.example.demo.mapper;

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

@Mapper
public interface mapper {
    @Insert(("insert into userinfo (username,password,age,gender,phone) " +
            "values (#{username},#{password},#{age},#{gender},#{phone})"))
    Integer insert(UserInfo userInfo);
}

这里的#中的username代表Java对象的属性,前面的代表数据库中的字段属性
既然我们是添加数据,那么我们就需要给该方法传递一个需要添加的对象,返回值则是对于sql的返回值

@Delete

对于数据中的删除数据的操作,根据上面的操作,我们也可以使用注解的方法实现

package com.example.demo.mapper;

import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface mapper {
    @Insert(("insert into userinfo (username,password,age,gender,phone) " +
            "values (#{username},#{password},#{age},#{gender},#{phone})"))
    Integer insert(UserInfo userInfo);
    @Delete("delete from userinfo where id=#{id}")
    Integer delete(Integer id);
}

@Select

这里需要注意,创建数据库中的表的适合,我们使用的delete_flag,而创建实体类的适合,我们创建的是deleteFlag,很显然,名字格式不同,这会导致查询时,会因为数据格式不同,而导致显示不出对应的数据
怎么解决呢,有三种解决方法,sql中对数据库属性名进行重命名,很显然,这是不优雅的,下面我们介绍另外两种解决方法

@Results和@ResultMap

            @Results( id = "BaseMap",value = {@Result(column = "delete_flag",property = "deleteFlag"),
            @Result(column = "create_time",property = "createTime"),
            @Result(column = "update_time",property = "updateTime")})

在进行上述定义之后,想在其他地方使用时,就可以使用@ResultMap注解来实现

    @Select("select * from userinfo")
    @Results( id = "BaseMap",value = {@Result(column = "delete_flag",property = "deleteFlag"),
            @Result(column = "create_time",property = "createTime"),
            @Result(column = "update_time",property = "updateTime")})
    List<UserInfo> selectAll();
    @Select("select id,username,password,age,gender,phone,delete_flag,create_time,update_time from userinfo where id=#{id}")
    @ResultMap("BaseMap")
    List<UserInfo> select(Integer id);

通过配置文件解决

mybatis:
  configuration:
    map-underscore-to-camel-case: true

在配置文件中加入以上代码,即可实现自动转驼峰

@Update

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

@Options

当我们想要查看数据库中的自增变量时,我们就可以使用@Options来对变量进行映射

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM学习

1.Java虚拟机内部有哪些线程共享&#xff0c;那些线程隔离 程序计数器&#xff1a; 通过改变这个计数器的值来选取下一条需要执行的字节码命令 Java虚拟机栈&#xff1a; 栈&#xff0c;每个方法被执行时&#xff0c;Java虚拟机都会同步的创建一个栈帧用于存储局部变量表&…

Linux:进度条的创建

目录 使用工具的简单介绍&#xff1a; \r &#xff1a; fflush &#xff1a; 倒计时的创建&#xff1a; 倒计时的工作原理&#xff1a; 进度条的创建&#xff1a; 不同场景下、打印任意长度的进度条&#xff1a; main .c procbor.c 测试效果&#xff1a; 使用工具…

STM32学习笔记(四) —— 位段别名区的使用

STM32F103RCT6有两个位段区 (SRAM 最低1M空间和片内外设存储区最低1M空间)&#xff0c; 这两个区域都有各自的别名区&#xff0c;在别名区中每个字会映射到位段区的一个位&#xff0c;所以在别名区修改一个字相当于修改位段区中对应的一个位 映射公式( 别名区中的字与位段区中的…

jenkins部署(docker)

docker部署&#xff0c;避免安装tomcat 1.拉镜像 docker pull jenkins/jenkins2.宿主机创建文件夹 mkdir -p /lzp/jenkins_home chmod 777 /lzp/jenkins_home/3.启动容器 docker run -d -p 49001:8080 -p 49000:50000 --privilegedtrue -v /lzp/jenkins_home:/var/jenkins_…

Excel得到JSON串

很多时候业务都需要做一种从Excel读取或者导入数据的功能&#xff0c;这在cs程序比较简单&#xff0c;在BS程序上如果封装不好的话那么写起来还是很费劲的&#xff0c;这次封装Excel读取操作。 先看使用 对&#xff0c;你没有看错&#xff0c;就是这么简单。 封装 基础设计…

2023年葡萄酒行业分析报告(电商数据查询):消费市场疲软,但国产品牌的替代效应逐步明显

近几年&#xff0c;受国内经济增速放缓的影响&#xff0c;现阶段国内葡萄酒的消费需求仍显不足。同时&#xff0c;当前国内酒类市场正处于存量竞争阶段&#xff0c;市场竞争十分激烈&#xff0c;其他酒类也在一定程度上挤占了葡萄酒的市场份额&#xff0c;这也导致国内葡萄酒消…

04:容器技术概述|镜像与容器|docker配置管理

容器技术概述&#xff5c;镜像与容器&#xff5c;docker配置管理 什么是容器优点缺点 docker与容器跳板机yum源添加docker软件在node节点验证软件包开启路由转发 镜像管理&容器管理如何获取镜像镜像备份与恢复运行容器查看镜像的启动信息镜像管理命令容器管理命令容器内部署…

十一、常用API——练习

常用API——练习 练习1 键盘录入&#xff1a;练习2 算法水题&#xff1a;练习3 算法水题&#xff1a;练习4 算法水题&#xff1a;练习5 算法水题&#xff1a; 练习1 键盘录入&#xff1a; 键盘录入一些1~100之间的整数&#xff0c;并添加到集合中。 直到集合中所有数据和超过2…

SolidWorks曲面功能介绍

在SolidWorks中提供了功能丰富的曲面功能&#xff0c;那为什么我们需要使用曲面功能&#xff1f;曲面功能一般是在处理一些复杂外形的时候来使用&#xff0c;这些形状需要通过曲线的变化来控制&#xff0c;从而得到满意的外形&#xff0c;一般来说这样的外形是很难通过实体建模…

集成学习之Boosting方法系列_XGboost

文章目录 【文章系列】【前言】【算法简介】【正文】&#xff08;一&#xff09;XGBoost前身&#xff1a;梯度提升树&#xff08;二&#xff09;XGBoost的特点&#xff08;三&#xff09;XGBoost实际操作1. 前期准备&#xff08;1&#xff09;数据格式&#xff08;2&#xff09…

(2)(2.10) LTM telemetry

文章目录 前言 1 协议概述 2 配置 3 带FPV视频发射器的使用示例 4 使用TCM3105的FSK调制解调器示例 前言 轻量级 TeleMetry 协议 (LTM) 是一种单向通信协议&#xff08;从飞行器下行的数据链路&#xff09;&#xff0c;可让你以低带宽/低波特率&#xff08;通常为 2400 波…

Mamba系列日积月累(一):状态空间模型SSM的离散化过程推导

文章目录 1. 背景基础知识1.1 什么是状态空间模型&#xff08;State Space Model&#xff0c;SSM&#xff09;&#xff1f;1.2 什么是离散化&#xff08;Discretization&#xff09;&#xff1f;1.3 为什么需要离散化&#xff1f; 2. SSM离散化过程推导2.1 为什么在离散化过程中…

Windows断开映射磁盘提示“此网络连接不存在”,并且该磁盘直在资源管理器中

1、打开注册表编辑器 快捷键winR 打开“运行”&#xff0c; 输入 regedit 2、 删除下列注册表中和无法移除的磁盘相关的选项 \HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\ 3、打开“任务管理器”&#xff0c;重新启动“Windows资源…

vue3源码(三)computed

1.功能 接受一个 getter 函数&#xff0c;并根据 getter 的返回值返回一个不可变的响应式 ref 对象。 默认不执行&#xff0c;在取值时执行&#xff0c;具有缓存功能&#xff0c;数据不变多次取值只触发一次取值计算。 import {reactive,effect,computed,} from "/node_…

蓝桥杯AT24C02问题记录

问题1&#xff1a;从这个图片上可以看出这两个在IIC的.c文件里延时时间不一样&#xff0c;第一张图使用了15个_nop_(); 12M晶振机器周期是 1/12M*121uS&#xff1b;nop()要延时1个指令周期。延时时间不对会对时序产生影响&#xff0c;时序不对&#xff0c;则AT24C02有没被使用…

大数据分析案例-基于随机森林算法构建电影票房预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

nginx 编译安装sticky时报错处理

一般企事业单位的内网按照部门划分网段&#xff0c;ip hash 的负载均衡策略容易导致负载失衡&#xff0c;比如某个网段地址多&#xff0c;一些网段地址少&#xff0c;IP hash是基于IPv4地址的前三段来区分的&#xff08;开发者可能觉得机器处理区分所有IP太累么&#xff1f;配置…

医院如何筛选安全合规的内外网文件交换系统?

医院内外网文件交换系统是专为医疗机构设计的&#xff0c;用于在内部网络&#xff08;内网&#xff09;和外部网络&#xff08;外网&#xff09;之间安全、高效地传输敏感医疗数据和文件的解决方案。这种系统对于保护患者隐私、遵守医疗数据保护法规以及确保医疗服务的连续性和…

牛客网-----------[NOIP2006]数列

题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列&#xff0c;例如&#xff0c;当k3时&#xff0c;这个序列是&#xff1a; 1&#xff0c;3&#xff0c;4&#xff0c;9&#xff0c;10&#xff0c;12&#xff0c;13&…

LabVIEW机械臂轨迹跟踪控制

介绍了一个使用LabVIEW开发的机械臂轨迹跟踪控制系统。该系统的主要目标是实现对机械臂运动轨迹的精确控制&#xff0c;使其能够按照预定路径进行精确移动。此系统特别适用于需要高精度位置控制的场合&#xff0c;如自动化装配、精密操作等。 为了实现LabVIEW环境下的机械臂轨迹…