MyBatis 框架学习(I)

MyBatis 框架学习(I)

文章目录

  • MyBatis 框架学习(I)
    • 1. 介绍
    • 2. 准备&测试
    • 3. MyBatis 注解基础操作
      • 3.1 日志输出
      • 3.2 Insert 操作
      • 3.3 Delete 操作
      • 3.4 Update 操作
      • 3.5 Select 操作
    • 总结

1. 介绍

之前我们学习过利用JDBC操作数据库进行项目开发,但我们发现它操作起来会比较复杂,而MyBatis就是一款简化JDBC操作的优秀持久层框架

持久层:可以理解为进行持久化操作的层,通常指数据访问层(dao),是用来操作数据库

在这里插入图片描述

简单来说MyBatis就是更简单完成程序和数据库交互的框架,也是一个更好操作数据库的工具!

2. 准备&测试

在我们开始MyBatis具体操作之前,我们需要完成环境的配置:

  1. 创建SpringBoot工程、引入相关依赖;
  2. 数据库准备、实体类准备;
  3. 配置MyBatis连接信息;
  4. 创建Mapper接口

先创建SpringBoot项目:

在这里插入图片描述

在创建项目时引入相关驱动依赖,pom.xml就会自动引入这些相关依赖:

在这里插入图片描述

项目创建好后,我们来创建测试用的数据库

-- 创建数据库
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' );

在这里插入图片描述

同时创建实体类,即该实体类中的属性要与数据库中的字段对应:

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;}

注:数据库中的字段有时候是多个单词拼接,数据库中使用_分割,在Java中我们使用小驼峰的方式来进行命名

之后配置MyBatis连接信息, MyBaits连接数据库需要配置以下信息:

  • MySQL驱动类
  • 数据库连接的URL
  • 用户名
  • 密码

如果是配置文件是application.properties,代码如下:

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_test // 刚刚创建的表
#连接数据库的用户名
spring.datasource.username=root // 填写自己的用户名
#连接数据库的密码
spring.datasource.password=123456 // 填写自己的密码

如果配置文件是application.yml,代码如下:

# 数据库连接配置 每个空格都不能省略,yml严格要求格式正确
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_testusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver

最后创建接口,并通过测试类进行测试(测试类Spring在创建时已经给我们配置好,在test目录下,我们只需要根据需求编写相关代码即可,或者右击mapper接口->Generate->Test, 勾选相应mapper方法,然后编写需求代码即可):

package org.example.blog_mybatis.mapper;import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.example.blog_mybatis.pojo.UserInfo;import java.util.List;@Mapper
public interface UserInfoMapper {@Select("select id, username, password, age, gender, phone, delete_flag, create_time, update_time from userinfo")public List<UserInfo> queryAllUser();}

在这里插入图片描述

这样我们就能通过Mybatis来获取数据库中的信息了!

小技巧:当我们在进行sql语句编写时,有时候字段多起来后我们自己手写可能会出现问题,对此我们可以将数据库引入IDEA,这样当我们编写sql语句时它就会自动为我们提示字段信息

按以下步骤配置:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

这样就配置好了,同时它也能自动为我们获取字段信息了:

在这里插入图片描述

3. MyBatis 注解基础操作

对于MyBatis操作数据库的方式有两种,一种的通过注解的方式进行调用,一种是通过xml文件进行调用,对于使用那个没有固定的标准,根据情况选择使用(比较简单的数据库操作可以使用注解,较复杂的操作可以使用xml文件进行动态SQL操作)。xml后面会再开一篇文章进行讲解,本文使用注解的方式进行操作!

3.1 日志输出

上面我们通过println函数打印输出信息来观察数据库操作状态,这样的方式观察起来效果不是很好,对此,我们可以使用MyBatis提供的日志输出来进行观察:

application.properties配置如下:

#配置mybatis的日志, 指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

在这里插入图片描述

3.2 Insert 操作

当我们要给数据库中的userinfot表添加一条数据时,它的SQL语句是:

insert into mybatis_test(username, password, age, gender, phone) values ('zhangsan', '111', 18, 1, '123');

将SQL中的常量替换为动态的参数,在Mapper接口中它的注解为:

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

在注解中,为了使我们的sql语句的操作条件不为固定值,我们通过方法形参获取需求参数,在注解中我们接收参数的方式是 #{},在括号里传入对应的方法参数

注:

  • 括号中填入的参数要与方法参数的名称相同
  • 如果传入的方法参数是对象的话,填入括号的参数名称与对象的属性相同

编写测试类代码,这里使用自己构建的测试类:

package org.example.blog_mybatis.mapper;import org.example.blog_mybatis.pojo.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@Testvoid insertUser() {UserInfo userInfo = new UserInfo();userInfo.setUsername("zhangsan");userInfo.setPassword("111");userInfo.setAge(18);userInfo.setGender(1);userInfo.setPhone("123");userInfoMapper.InsertUser(userInfo);}
}

在这里插入图片描述

在这里插入图片描述

同时我们也可以通过@Param注解给方法参数设置别名,则注解在接收参数时#{}中的内容需要与@Param中的参数一样,如果参数是对象则需要为参数.属性

@Insert("insert into userinfo(username, password, age, gender, phone) values (#{userInfo.username}, #{userInfo.password}, #{userInfo.age}, #{userInfo.gender}, #{userInfo.phone})")
void InsertUser(@Param("userInfo") UserInfo userInfo);

拓展:

Insert语句默认返回的是受影响的行数,但在有些情况下我们需要获取新插入数据的ID,这时如果我们想要拿到这个自增ID,需要在Mapper接口的方法上添加一个@Options注解:

@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into userinfo(username, password, age, gender, phone) values (#{username}, #{password}, #{age}, #{gender}, #{phone})")
void InsertUser(UserInfo userInfo);
  • useGeneratedKeys:这会令MyBatis使用JDBC的getGeneratedKeys方法来取出数据库内部生成的主键,默认为false;
  • keyProperty:指定能够唯⼀识别对象的属性,MyBatis 使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey子元素设置它的值,默认值:未设置(unset)

编写测试代码:

@Test
void insertUser() {UserInfo userInfo = new UserInfo();userInfo.setUsername("XiaoMa");userInfo.setPassword("111");userInfo.setAge(18);userInfo.setGender(1);userInfo.setPhone("10086");Integer count = userInfoMapper.InsertUser(userInfo);System.out.println("添加数据条数:" + count + " 数据ID:" + userInfo.getId());
}

在这里插入图片描述

3.3 Delete 操作

当我们要删除数据库中的userinfo表中的一条数据时,它的SQL语句是:

delete from maybatis_test where id = 3;

将SQL中的常量替换为动态的参数,在Mapper接口中它的注解为:

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

编写测试类代码:

@Test
void deleteUser() {userInfoMapper.DeleteUser(3);
}

在这里插入图片描述

在这里插入图片描述

3.4 Update 操作

当我们要修改数据库中的userinfo表中的数据时,它的SQL语句是:

update userinfo set username = "zhaoliu", age = "36" where id = 5;

将SQL中的常量替换为动态的参数,在Mapper接口中它的注解为:

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

编写测试类代码:

@Test
void updateUser() {UserInfo userInfo = new UserInfo();userInfo.setId(5);userInfo.setUsername("zhaoliu");userInfo.setAge(36);userInfoMapper.UpdateUser(userInfo);
}

在这里插入图片描述

在这里插入图片描述

3.5 Select 操作

当我们要查询数据库中的userinfo表中的数据时,它的SQL语句是:

select id, username, password, age, gender, phone, delete_flag, create_time, update_time from userinfo where id = 5;

在Mapper接口中它的注解为:

@Select("select id, username, password, age, gender, phone, delete_flag, create_time, update_time from userinfo where id = #{id}")
UserInfo queryUser(Integer id);

编写测试类代码:

@Test
void queryUser() {UserInfo userInfo = userInfoMapper.queryUser(5);System.out.println(userInfo);
}

在这里插入图片描述

MyBatis会根据方法返回的结果进行赋值:

若方法用对象UserInfo接收返回结果,MySQL查询出来的数据为一条就会自动赋值给对象;

若方法用集合List接收返回结果,MySQL查询出来的数据若为多条就会自动赋值集合List;

但若MySQL返回的结果为多条数据,却用UserInfo去接收多条数据,则MyBatis就会报错

通过上述查询语句,数据能够被显示出来,但却存在着一些问题:后面三个数的值为null

原因就在于在返回结果时,MyBaits会自动获取结果中返回的列名并在Java类中查找相同名字的属性,若名称相同则会将结果数据赋值给该属性,但是我们的UserInfo中的属性名称为deleteFlag,而数据库中对应的字段名称为delete_flag,两者从名称上看并不相同,则UserInfo中的deleteFlag属性无法被赋到值:

在这里插入图片描述

那怎么解决上面这个问题呢?这里我们开启驼峰命名解决(还有其它方法如起别名,结果映射等,这里使用驼峰命名,只要配置好就能直接使用,方便高效):

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

在配置文件application.properties中加入:

#开启mybatis的驼峰命名自动映射开关 a_column ------> aCloumn
mybatis.configuration.map-underscore-to-camel-case=true

在这里插入图片描述

这样缺失的数据也能查询到了!

总结

以上就是本文对MyBatis框架学习注解方式的介绍与使用了,接下来也会更新MyBatis框架学习XML的方式的文章,敬请期待!!

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

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

相关文章

扫描工具nmap

介绍 说到黑客&#xff0c;知识就是力量。您对目标系统或网络的了解越多&#xff0c;可用的选项就越多。因此&#xff0c;在进行任何利用尝试之前&#xff0c;必须进行适当的枚举。 假设我们获得了一个 IP&#xff08;或多个 IP 地址&#xff09;来执行安全审计。在我们做任何…

究竟该怎么寄快递才能安全无误的送到手中呢?

最近&#xff0c;小编上班了发现有同事在吐槽快递送到手中的时间很晚了&#xff0c;比预计的时间差了很多&#xff0c;并且产品也有不同程度的损坏。这就让我们很是恼火了&#xff0c;但是细细研究后才发现有一部分的原因竟然是我们的原因才导致的寄快递出现了很多纰漏。 首先…

使用JavaScript创建数组,并对其进行冒泡排序

JavaScript创建数组方式 字面量方式&#xff1a;使用方括号 [] 来创建数组&#xff0c;并在方括号内按顺序列出数组元素。 let arr [1, 2, 3, 4, 5]; Array() 构造函数方式&#xff1a;使用 new Array() 构造函数来创建数组&#xff0c;并传入数组元素作为参数。 let arr ne…

如何使用ChatGPT仿写一篇学术论文

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 目录 1.仿写的目的 2.根据专业方向搜集合适的文献 3.总结想要仿写的文献 4.使用ChatGPT一步一步仿写 5.书籍介绍 AIPaperPass智能论文写作平台 深入地阅读和分析你研究领域的相关文…

汽车IVI中控开发入门及进阶(十六):carplay认证

现在有些中控采用高通的芯片如8155、8295等,实现多屏互动等,但是也有一些车型走低成本方案,比如能够实现HiCar、CarLife或者苹果Apple的Carplay等能进行手机投屏就好了。 能实现CarPlay功能通过Carplay认证,也就成了一些必须的过程,国产车规级中控芯片里,开阳有一款ARK1…

PLC_博图系列☞P_TRIG:扫描 RLO 的信号上升沿

PLC_博图系列☞P_TRIG&#xff1a;扫描 RLO 的信号上升沿 文章目录 PLC_博图系列☞P_TRIG&#xff1a;扫描 RLO 的信号上升沿背景介绍P_TRIG&#xff1a; 扫描 RLO 的信号上升沿说明参数示例 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 P_TRIG 背景介绍 这是一…

10.Godot Input与自定义单例的使用

单例 单例是一个可以在任何一个脚本中对其进行直接访问的对象&#xff0c;分为内置单例与自定义单例。每个单例都是独一无二的对象。内置单例不是节点&#xff0c;主要成员是各类 Server&#xff0c;开发者可以使用它们直接控制游戏程序的图形与音效等内容。此外&#xff0c;还…

实现Spring底层机制(阶段1—编写自己的Spring容器,扫描包,得到bean的Class对象)

环境搭建抛出问题 1.环境搭建 1.创建maven项目 2.导入依赖 <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.ap…

代码随想录第43天|1049.最后一块石头的重量II 494. 目标和

1049.最后一块石头的重量II 1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 动态规划之背包问题&#xff0c;这个背包最多能装多少&#xff1f;LeetCode&#xff1a;1049.最后一块石头的重量II_哔哩哔哩_bilibili 有…

AI-数学-高中-39空间向量-2空间向量法(法向量)

原作者视频&#xff1a;【空间向量】【一数辞典】2空间向量法&#xff08;重要&#xff09;_哔哩哔哩_bilibili 法向量&#xff08;高中阶段所有与面的关系&#xff0c;都可以通过法向量去证明和解答&#xff09;&#xff1a; 是空间解析几何的一个概念&#xff0c;垂直于平面…

京东商品详情数据采集API接口|附京东商品数据返回PHP多语言高并发

京东获得JD商品详情 API 返回值说明 item_get-获得JD商品详情 API测试 注册开通 jd.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址…

AI时代,操作系统交互的革命性变革

AI时代对操作系统交互的影响 对于2024年的智能手机厂商们来说&#xff0c;在冲击高端市场的路上有一场绝对输不起的硬仗&#xff0c;那就是AI大模型的落地之战。 OpenAI的ChatGPT引爆了全球AIGC&#xff08;生成式人工智能&#xff09;热潮&#xff0c;短短一年时间里&#xff…

新手小白,在数学建模的过程中应该怎么分工?

大家知道&#xff0c;数学建模竞赛是需要一个团队的三个人在三天或四天的时间内&#xff0c;完成模型建立&#xff0c;编程实现和论文写作的任务&#xff0c;对许多第一次参加建模或者建模经验比较欠缺的团队来说&#xff0c;是时间紧任务重的&#xff0c;那么怎么办呢&#xf…

Java学习笔记26(枚举和注解)

1.枚举和注解 1.1 枚举 ​ 1.枚举(enumeration) ​ 2.枚举是一组常量的集合 ​ 3.枚举属于一种特殊的类&#xff0c;里面只包含一组有限的特定的对象 1.枚举应用案例 ​ 1.不需要提供setXxx方法&#xff0c;因为枚举对象值通常为只读 ​ 2.对枚举对象/属性使用final st…

C语言实现三子棋游戏(可以改变为四子棋或者多子棋版)

目录 游戏介绍 游戏框架 游戏基本逻辑的介绍 游戏具体功能实现 初始化棋盘 打印棋盘 玩家下棋 电脑下棋 判断输赢 行和列&#xff1a; 对角线&#xff1a; 平局&#xff1a; 游戏继续&#xff1a; 游戏完整代码 test.c game.c game.h 游戏介绍 三子棋游戏或者…

浏览器不兼容的问题和通用解决方案

大家好&#xff0c;我是咕噜铁蛋&#xff0c;今天我想和大家聊聊一个在我们日常上网过程中经常遇到的问题——浏览器不兼容。这个问题看似微小&#xff0c;但却常常让我们在浏览网页、使用在线应用时感到困扰。接下来&#xff0c;我将详细分析浏览器不兼容的原因&#xff0c;并…

[lesson48]同名覆盖引发的问题

同名覆盖引发的问题 父子间的赋值兼容 子类对象可以当做父类对象使用(兼容性) 子类对象可以直接赋值给父类对象(<font color>兼容性)子类对象可以直接初始化父类对象父类指针可以直接指向子类对象父类引用可以直接引用子类对象 当使用父类指针(引用)指向子类对象时 子类…

30 消息队列

原理 操作系统可以通过页表映射在共享区创建一块共享内存&#xff0c;也可以申请一个队列。A进程和B进程可以向这个队列发送数据块&#xff0c;两个进程接收数据块来通信 函数 申请数据块 参数中的key来自于ftok函数 删除消息队列 同样消息队列也有数据结构管理&#xff…

数值分析复习:Richardson外推和Romberg算法

文章目录 Richardson外推Romberg&#xff08;龙贝格&#xff09;算法 本篇文章适合个人复习翻阅&#xff0c;不建议新手入门使用 本专栏&#xff1a;数值分析复习 的前置知识主要有&#xff1a;数学分析、高等代数、泛函分析 本节继续考虑数值积分问题 Richardson外推 命题&a…

解决在linux中执行tailscale up却不弹出验证网址【Tailscale】【Linux】

文章目录 问题解决提醒 问题 最近有远程办公需求&#xff0c;需要连接内网服务器&#xff0c;又不太想用todesk&#xff0c;于是找到一个安全免费可用的Tailscale Best VPN Service for Secure Networks&#xff0c;在windows中顺利注册账号后&#xff0c;登陆了我的windows …