【JavaEE】Spring Boot MyBatis详解(一)

一.MyBatis的基本概念与相关配置.

1.基本概念

  • MyBatis是一款优秀的持久层框架,用于简化JDBC的开发。MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis. 2013年11月迁移到Github.
  • 持久层:指的就是持久化操作的层, 通常指数据访问层(dao), 是用来操作数据库的.

在这里插入图片描述
简单来说 MyBatis 是更简单完成程序和数据库交互的框架,也就是更简单的操作和读取数据库工具.

2.相关配置

Maven配置

  • SpringBoot与MyBatis之间的对应关系参考官方网址:https://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/
  • 我MyBatis用的Maven依赖.
		<!-- MyBatis依赖包 -->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>3.0.3</version>
		</dependency>
		<!-- mysql驱动包 -->
		<dependency>
			<groupId>com.mysql</groupId>
			<artifactId>mysql-connector-j</artifactId>
			<scope>runtime</scope>
		</dependency>

配置数据库连接字符串

  • 如果是application.yml文件, 配置内容如下:
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
    username: root
    password: 120348
    driver-class-name: com.mysql.cj.jdbc.Driver


如果使用 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
#数据库连接的url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_test?
characterEncoding=utf8&useSSL=false
#连接数据库的⽤⼾名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=root

打印日志配置

  • 该项配置可以看到SQL执行内容, 以及传递参数和执行结果
    在这里插入图片描述
    ①: 查询语句
    ②: 传递参数及类型
    ③: SQL执行结果
mybatis:
  configuration: # 配置打印 MyBatis 执行的 SQL
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.单元测试

  • 在Test目录下创建要测试的类的名称, 测试类上添加了注解 @SpringBootTest,该测试类在运行时,就会自动加载Spring的运行环境.我们通过@Autowired这个注解, 注⼊我们要测试的类, 就可以开始进行测试了

使用 Idea 自动生成测试类

  1. 在需要测试的Mapper接口中, 右键 -> Generate -> Test
    在这里插入图片描述

  2. 选择要测试的方法, 点击 OK
    在这里插入图片描述

  3. 书写测试代码

二.MyBatis的注解实现.

2.1.1 传参的细节.

  • 先来看两个用注解实现的MyBatis语句:
@Insert("insert into userInfo (username,password,age,gender) values (#{username},#{password},#{age},#{gender})")
    Integer insertUserInfo(UserInfo userInfo);
@Insert("insert into userInfo (username,password,age,gender) values (#{userInfo.username},#{userInfo.password},#{userInfo.age},#{userInfo.gender})")
    Integer insertUserInfo2(@Param("userInfo") UserInfo userInfo);
  • 在第一种的实现方式中,传参的时候,就可以直接读取userInfo对应的属性来完成赋值.而第二种方法则是将userInfo当作一个整体的对象,需要" . "出所需要的属性.

2.2.1增.

  • Mapper接口代码:
@Insert("insert into userInfo (username,password,age,gender) values (#{username},#{password},#{age},#{gender})")
    Integer insertUserInfo(UserInfo userInfo);
  • 生成对应的测试代码:
@Test
    void insertUserInfo() {
        UserInfo userInfo = new UserInfo();
        userInfo.setAge(18);
        userInfo.setGender(1);
        userInfo.setPassword("zhangsan");
        userInfo.setUsername("zhangsan2");
        Integer i = userInfoMapper.insertUserInfo(userInfo);
        System.out.println(i);
    }
  • 运行结果:
    在这里插入图片描述
  • 对应数据库的变化:
    在这里插入图片描述

2.2.2删.

  • Mapper接口代码:
@Delete("delete from userInfo where id = #{id}")
Integer deleteUserInfoById(Integer id);
  • 生成对应的测试代码:
@Test
    void deleteUserInfoById() {
        Integer i = userInfoMapper.deleteUserInfoById(11);
        System.out.println(i);
    }
  • 运行结果:
    在这里插入图片描述
  • 对应数据库的变化:
    在这里插入图片描述

2.2.3改.

  • Mapper接口代码:
@Update("update userInfo set password = #{password} ,age = #{age},gender = #{gender} where id = #{id}")
    Integer updateUserInfo(UserInfo userInfo);
  • 生成对应的测试代码:
@Test
    void updateUserInfo() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(1);
        userInfo.setAge(100);
        userInfo.setGender(2);
        userInfo.setPassword("963852");
        Integer i = userInfoMapper.updateUserInfo(userInfo);
        System.out.println(i);
    }
  • 运行结果:
    在这里插入图片描述

  • 对应数据库的变化:
    在这里插入图片描述

2.2.4查.

  • Mapper接口代码:
@Select("select * from userInfo where delete_flag = #{deleteFlag}")
    public List<UserInfo> getUserInfoByDeleteFlag(Integer deleteFlag);
  • 生成对应的测试代码:
@Test
    void getUserInfoByDeleteFlag() {
        List<UserInfo> userInfoByDeleteFlag = userInfoMapper.getUserInfoByDeleteFlag(0);
        System.out.println(userInfoByDeleteFlag);
    }
  • 运行结果:
    在这里插入图片描述

三.MyBatis的XML配置文件实现.

  • 此步骤需要进行两项设置,数据库连接字符串设置和 MyBatis 的 XML 文件配置。
    application.yml文件, 配置内容如下:
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
    username: root
    password: 120348
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
  mapper-locations: classpath:mybatis/**Mapper.xml
  configuration: # 配置打印 MyBatis 执行的 SQL
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  • 写持久层代码, 持久层代码分两部分
    1. 方法定义 Interface
    2. 方法实现:XXX.xml
      在这里插入图片描述

在这里插入图片描述

3.1 增.

  • Mapper接口代码:
Integer insert(UserInfo userInfo);
  • 对应的实现xml.
<insert id="insert">
        insert into userInfo (username,password,age,gender) values (#{username},#{password},#{age},#{gender})
    </insert>
  • 生成对应的测试代码:
    @Test
    void insert() {
    UserInfo userInfo = new UserInfo();
    userInfo.setUsername(“tiantian”);
    userInfo.setPassword(“123456”);
    userInfo.setAge(9);
    userInfo.setGender(1);
    userInfoXmlMapper.insert(userInfo);
    }

  • 运行结果:
    在这里插入图片描述

3.2 删.

  • Mapper接口代码:
Integer deleteById(Integer id);
  • 对应的实现xml.
<delete id="deleteById" parameterType="integer">
        delete from userInfo where id = #{id}
    </delete>
  • 生成对应的测试代码:
@Test
    void deleteById() {
        Integer id = 10;
        Integer i = userInfoXmlMapper.deleteById(id);
        System.out.println(i);
    }
  • 运行结果:
    在这里插入图片描述

3.1 改.

  • Mapper接口代码:
Integer updateById(UserInfo userInfo);
  • 对应的实现xml.
<update id="updateById">
        update userInfo set age = #{age} where id = #{id}
    </update>
  • 生成对应的测试代码:
@Test
    void updateById() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(1);
        userInfo.setAge(99);
        userInfoXmlMapper.updateById(userInfo);
    }
  • 运行结果:
    在这里插入图片描述

3.1 查.

  • Mapper接口代码:
List<UserInfo> selectAll();
  • 对应的实现xml.
<select id="selectAll" resultType="com.tuanzi.ssm.springmybatis.model.UserInfo">
        select * from userInfo
    </select>
  • 生成对应的测试代码:
@Test
    void selectAll() {
        List<UserInfo> list = userInfoXmlMapper.selectAll();
        System.out.println(list);
    }
  • 运行结果:
    在这里插入图片描述

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

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

相关文章

区间预测 | Matlab实现GRU-ABKDE门控循环单元自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现GRU-ABKDE门控循环单元自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现GRU-ABKDE门控循环单元自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现GRU-ABKDE门控循环单元自适应…

[Vue3:组件通信)子组件props接收和watch监听,emit发送父组件 (添加修改设置成绩,添加、删除选课记录)

文章目录 一&#xff1a;系统功能&#xff1a;设置成绩&#xff08;添加或修改&#xff09;交互逻辑&#xff1a;涉及页面 Page02.vue&#xff0c;ModalEdit.vue主页面Page.vue注入子页面&#xff0c;使用子页面标签属性主页面对子页面做通信&#xff0c;子页面ModalEdit接收参…

Nginx+Tomcat负载均衡,动静分离群集

Nginx反向代理原理 Nginx 反向代理&#xff1a;将Nginx接收到的请求转发给其它应用服务器处理 Nginx 负载均衡&#xff1a;通过反向代理实现&#xff0c;还可以将nginx接收到的请求转发给多个后端应用服务器处理 Nginx 动静分离&#xff1a;静态页面请求&#xff0c;由nginx…

将AIRNet集成到yolov8中,实现端到端训练与推理

AIRNet是一个图像修复网络,支持对图像进行去雾、去雨、去噪声的修复。其基于对比的退化编码器(CBDE),将各种退化类型统一到同一嵌入空间;然后,基于退化引导恢复网络(DGRN)将嵌入空间修复为目标图像。可以将AIRNet的输出与yolov8进行端到端集成,实现部署上的简化。 本博…

vue3-使用富文本编辑器-wangEditor-文章发表1

最近在搞项目:我们组内几位成员正在搞一个网站搭建,以后更新会比较缓慢 引言:如果要网站要用的富文本编辑器的话,这边推荐用wangEditor 官网地址传送 : wangEditorhttps://www.wangeditor.com/ 我现在还在扩展我的写文章用的富文本编辑器 现在我将简单介绍一下其基本使用方…

IP协议(二)

TOC 一: 网段划分 同一个局域网的主机,要按一定的规则分配IP地址 把一个IP地址分为两部分: 前半部分 ,网络号 >用来表示局域网后半部分,主机号 > 用来区分同一个局域网中的不同主机 同一个局域网内部&#xff0c;主机之间的IP &#xff0c; 网络号相同&#xff0c;主…

对抗攻击论文阅读—AAAI2022—CMUA-Watermark

文章目录 CMUA-Watermark: A Cross-Model Universal Adversarial Watermark for Combating Deepfakes背景1、什么是对抗攻击1.1 主动防御与被动防御 2、整体思路3、方法3.1 整体流程3.2 如何破坏单个面部修改模型 G G G论文中代码 3.3 对抗扰动融合3.4 基于TPE的自动步长调整 4…

go语言后端开发学习(三)——基于validator包实现接口校验

前言 在我们开发模块的时候,有一个问题是我们必须要去考虑的&#xff0c;它就是如何进行入参校验&#xff0c;在gin框架的博客中我就介绍过一些常见的参数校验&#xff0c;大家可以参考gin框架学习笔记(四) ——参数绑定与参数验证&#xff0c;而这个其实也不是能够完全应对我…

智慧交通的神经中枢:利用ARMxy进行实时交通流数据采集

气候变化和水资源日益紧张&#xff0c;精准农业成为了提高农业生产效率、节约资源的关键。在这一变革中&#xff0c;ARMxy工业计算机扮演了核心角色&#xff0c;特别是在智能灌溉系统的实施中。 背景介绍&#xff1a; 某大型农场面临着灌溉效率低、水资源浪费严重的问题。传统的…

怎样快速获取Vmware VCP 证书,线上考试,voucher报名优惠

之前考一个VCP证书&#xff0c;要花大一万的费用&#xff0c;可贵了&#xff0c;考试费不贵&#xff0c;贵就贵在培训费&#xff0c;要拿到证书&#xff0c;必须交培训费&#xff0c;即使vmware你玩的很溜&#xff0c;不需要再培训了&#xff0c;但是一笔贵到肉疼的培训费你得拿…

(BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)

6.开启 Spring Boot 特性有哪几种方式&#xff1f; 7.Spring Boot 需要独立的容器运行吗&#xff1f; 8.运行 Spring Boot 有哪几种方式&#xff1f; 9.Spring Boot 自动配置原理是什么&#xff1f; 10.Spring Boot 2.X 有什么新特性&#xff1f;与 1.X 有什么区别&#xff1f;…

LeetCode74.搜索二维矩阵

各位客官们&#xff0c;大家好&#xff0c;今天我将给大家讲一个关于二维搜索矩阵的简单方法&#xff0c;大家如果觉得好的话不妨给个免费点赞吧^ _ ^. 题目要求&#xff0c;如图所示: 此题我用的是堆的形式直接把二维数组转为一级数组&#xff0c;然后再用二分查找的方式&am…

牛客热题:不同的路径数目(一)

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;不同的路径数目(一)题目链接方法…

R语言统计分析——图形的简单示例

参考资料&#xff1a;R语言实战【第2版】 1、示例一 # 绑定数据框mtcars attach(mtcars)# 打开一个图形窗口并生成一个散点图plot(wt,mpg)# 添加一条最优拟合曲线abline(lm(mpg~wt))# 添加标题title("Regression of MPG on weight") # 解除数据框绑定 detach(mtcar…

OpenAI 宕机事件:GPT 停摆的影响与应对

引言 2024年6月4日&#xff0c;OpenAI 的 GPT 模型发生了一次全球性的宕机&#xff0c;持续时间长达8小时。此次宕机不仅影响了OpenAI自家的服务&#xff0c;还导致大量用户涌向竞争对手平台&#xff0c;如Claude和Gemini&#xff0c;结果也导致这些平台出现故障。这次事件的广…

VMware Workstation Pro的最新下载地址

前言 VMware被Broadcom收购后现在的下载方式也改变了&#xff0c;Workstation Pro 和 Fusion Pro 产品现在起将免费供个人用户使用下载方式 首先先把下载地址打开 https://support.broadcom.com/group/ecx/productdownloads?subfamilyVMwareWorkstationPro 打开链接&#xff…

开源VisualFreebasic中文版,vb7 IDE,VB6升级64位跨平台开发安卓APP,Linux程序

吴涛老矣&#xff0c;社区苦无64位易语言&#xff0c;用注入DLL增强菜单&#xff0c;做成VS一样的界面 终归是治标不治本&#xff0c;一来会报毒&#xff0c;二来闭源20年没更新了 开源的VB7&#xff0c;欢迎易语言的铁粉进群&#xff1a;1032313876 【Freebasic编程语言】编绎…

cve_2017_12635-CouchDB垂直权限绕过

1.采用参考 https://www.cnblogs.com/mlxwl/p/16577781.html vulfocus&#xff1a;Vulfocus 漏洞威胁分析平台 2.产生原因 在2017年11月15日&#xff0c;CVE-2017-12635和CVE-2017-12636披露&#xff0c;CVE-2017-12635是由于Erlang和JavaScript对JSON解析方式的不同&#…

SOA的设计模式_3.微服务模式

SOA的架构中&#xff0c;复杂的ESB企业服务总线依然处于非常重要的位置&#xff0c;整个系统的架构并没有实现完全的组件化以及面向服务&#xff0c;它的学习和使用门槛依然偏高。而微服务不再强调传统SOA架构里面比较重的ESB企业服务总线&#xff0c;同时SOA的思想进入到单个业…

Docker | 入门:原理探究

Docker | 入门&#xff1a;原理探究 Run 的运行流程 Docker 底层原理 Docker 是怎么工作的&#xff1f; Docker 是一个 Client-Server 结构的系统&#xff0c;Docker 的守护进程运行在主机上&#xff0c;通过 Socket 从客户端访问。DockerServer 接受到 Docker-Client 的指令…