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.hqwc.cn/news/640259.html

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

相关文章

ubuntu快捷更pip源

py安装: apt-get install python3-pip终端输入: pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

跨语言大模型最新综述

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

基于docker搭建瀚高数据库HighGo6.0.1【图文】

基于docker搭建瀚高数据库HighGo6.0.1 拉取镜像启动验证进入容器 登录数据库查看数据库加密方式修改加密方式为sm3进入数据库修改密码重启容器 数据库验证数据库密码到期参考 docker部署 https://blog.csdn.net/weixin_44385419/article/details/127738868 拉取镜像 docker p…

Ubuntu-18.04本地化部署Rustdesk服务器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、配置防火墙二、安装三大件1.下载三大件2.安装三大件 三、安装客户端1.下载客户端1.Windows2.Linux 四、配置客户端连接服务器五、总结 前言 如果你是想数据…

【C++】学习笔记——类和对象_4

文章目录 二、类和对象13.运算符重载赋值运算符重载 14. 日期类的实现Date.h头文件Date.cpp源文件test.cpp源文件 未完待续 二、类和对象 13.运算符重载 赋值运算符重载 我们之前学了一个拷贝构造函数&#xff0c;本质上就是创建一个对象&#xff0c;该对象初始化为一个已经…

291个地级市资源错配指数、劳动和资本相对扭曲指数(2006-2021年)

01、数据介绍 资源错配指数&#xff08;Misallocation Index&#xff09;是一个用于衡量资源配置效率的指标&#xff0c;它衡量的是生产要素的配置是否合理&#xff0c;是否达到了最优的状态。资源错配指数越高&#xff0c;资源的利用效率越低。资源错配指数主要用于衡量各种生…

医学影像增强:空间域方法与频域方法等

医学影像图像增强是一项关键技术,旨在改善图像质量,以便更好地进行疾病诊断和评估。增强方法通常分为两大类:空间域方法和频域方法。 一、 空间域方法 空间域方法涉及直接对医学影像的像素值进行操作,以提高图像的视觉质量。以下是一些常用的空间域方法: 对比度调整:通过…

Excel 公式的定义、语法和应用(LOOKUP 函数、HLOOKUP 函数、VLOOKUP 函数;MODE.MULT 函数; ROUND 函数)

一、公式的定义和语法 二、公式的应用 附录 查找Excel公式使用方法的官方工具【强烈推荐!!!】:Excel 函数(按字母顺序)【微软官网】 excel 函数说明语法LOOKUP 函数在向量或数组中查找值LOOKUP(lookup_value, lookup_vector, [result_vector])

YoloV8改进策略:注意力改进|Neck改进|自研全新的Mamba注意力|即插即用,简单易懂:附结构图|检测、分割、关键点均适用(独家原创,全世界首发)

摘要 无Mamba不狂欢,本文打造基于Mamba的注意力机制。全世界首发基于Mamba的注意力啊!对Mamba感兴趣的朋友一定不要错过啊! 本文使用Mamba改进YoloV8的Block和BackBone实现涨点。 环境 系统:ubuntu22.04 CUDA:12.1 python:3.11 显卡驱动:545 安装过程 系统、CUDA和…

JAVA面向对象(下)(四、内部类、枚举、包装类)

一、内部类&#xff08;续&#xff09; 1.1 内部类的分类 按照声明的位置划分&#xff0c;可以把内部类分为两大类&#xff1a; 成员内部类&#xff1a;方法外 局部内部类&#xff1a;方法内 public class 外部类名{【修饰符】 class 成员内部类名{ //方法外}【修饰符】 返…

15.Nacos服务分级存储模型

服务跨集群调用问题&#xff1a; 服务调用尽可能的选择本地集群的服务&#xff0c;跨集群调用延迟较高。 本地集群不可访问的情况下&#xff0c;再去访问其他集群。 如何配置集群的实例属性&#xff1a; spring: cloud:nacos:server-addr: localhost:8848 #nacos服务端地址d…

数据可视化(八):Pandas时间序列——动态绘图,重采样,自相关图,偏相关图等高级操作

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…