超细详解MyBatis操作数据库(1)

news2024/12/24 2:24:43

文章目录

  • 1.MyBatis 是什么?
  • 2.回顾 JDBC 的操作流程
  • 3.MyBatis 在整个框架中的定位
  • 4.MyBatis的使用
    • 4.1创建数据库和表
    • 4.2 添加MyBatis框架支持
      • 4.2.1 老项目添加MyBatis
      • 4.2.2 新项目添加MyBatis
    • 4.3 配置连接字符串和MyBatis
      • 4.3.1 配置连接字符串
      • 4.3.2 配置 MyBatis 中的 XML 路径
    • 4.4 添加业务代码
      • 4.4.1 添加实体类
      • 4.4.2 添加 mapper 接口
      • 4.4.3 添加 UserMapper.xml
      • 4.4.4 添加 Service
      • 4.4.5 添加 Controller
      • 4.4.6 使用 postman 测试
  • 5.增、删、改操作
    • 5.1 增加用户操作
        • 特殊的添加:返回自增 id
    • 5.2 修改用户操作
    • 5.3删除操作
  • 6.开启mybatis sql日志打印
  • 7. @Transactional注解


1.MyBatis 是什么?

MyBatis 是⼀款优秀的持久层框架,它⽀持⾃定义 SQL、存储过程以及⾼级映射。MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的⼯作。 MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接⼝和 Java POJO(Plain Old Java Objects,普通⽼式 Java 对象)为数据库中的记录。简单来说 MyBatis 是更简单完成程序和数据库交互的⼯具,也就是更简单的操作和读取数据库⼯具。
Mybatis官网

存储过程:类似方法(包含多条sql/判断/变量声明…)
缺点: 1. 操作难度大 2. 没办法调试 3. 修改和扩展难…

2.回顾 JDBC 的操作流程

  1. 创建数据库连接池 DataSource
  2. 通过 DataSource 获取数据库连接 Connection
  3. 编写要执⾏的带 ? 占位符的 SQL 语句
  4. 通过 Connection 及 SQL 创建操作命令对象 Statement
  5. 替换占位符:指定要替换的数据库字段类型,占位符索引及要替换的值
  6. 使⽤ Statement 执⾏ SQL 语句
  7. 查询操作:返回结果集 ResultSet,更新操作:返回更新的数量
  8. 处理结果集
  9. 释放资源

对于 JDBC 来说,整个操作⾮常的繁琐,我们不但要拼接每⼀个参数,⽽且还要按照模板代码的⽅式,⼀步步的操作数据库,并且在每次操作完,还要⼿动关闭连接等,⽽所有的这些操作步骤都需要在每个⽅法中重复书写。
MyBatis 可以帮助我们更⽅便、更快速的操作数据库。

3.MyBatis 在整个框架中的定位

框架交互流程图:
在这里插入图片描述

MyBatis 也是⼀个 ORM 框架,ORM(Object Relational Mapping),即对象关系映射。在⾯向对象编程语言中,将关系型数据库中的数据与对象建立起映射关系,进而自动的完成数据与对象的互相转换

  1. 将输⼊数据(即传⼊对象)+SQL 映射成原⽣ SQL
  2. 将结果集映射为返回对象,即输出对象

ORM 把数据库映射为对象:

  • 数据库表(table)----> 类(class)
  • 记录(record,行数据)-----> 对象(object)
  • 字段(field) ----> 对象的属性(attribute)

⼀般的 ORM 框架,会将数据库模型的每张表都映射为⼀个 Java 类。也就是说使用 MyBatis 可以像操作对象⼀样来操作数据库中的表,可以实现对象和数据库表之间的转换。

4.MyBatis的使用

4.1创建数据库和表

-- 创建数据库
drop database if exists mycnblog;

create database mycnblog DEFAULT CHARACTER SET utf8mb4;

-- 使⽤数据数据
use mycnblog;

-- 创建表[⽤户表]
drop table if exists userinfo;

create table userinfo(
       id int primary key auto_increment,
       username varchar(100) not null,
       password varchar(32) not null,
       photo varchar(500) default '',
       createtime datetime default now(),
       updatetime datetime default now(),
       `state` int default 1
) default charset 'utf8mb4';

-- 创建⽂章表
drop table if exists articleinfo;

create table articleinfo(
       id int primary key auto_increment,
       title varchar(100) not null,
       content text not null,
       createtime datetime default now(),
       updatetime datetime default now(),
       uid int not null,
       rcount int not null default 1,
       `state` int default 1
) default charset 'utf8mb4';

-- 创建视频表
drop table if exists videoinfo;

create table videoinfo(
       vid int primary key,
       `title` varchar(250),
       `url` varchar(1000),
       createtime datetime default now(),
       updatetime datetime default now(),
       uid int
) default charset 'utf8mb4';

-- 添加⼀个⽤户信息
INSERT INTO
       `mycnblog`.`userinfo` (
              `id`,
              `username`,
              `password`,
              `photo`,
              `createtime`,
              `updatetime`,
              `state`
       )
VALUES
       (
              1,
              'admin',
              'admin',
              '',
              '2021-12-06 17:10:48',
              '2021-12-06 17:10:48',
              1
       );

-- ⽂章添加测试数据
insert into
       articleinfo(title, content, uid)
values
('Java', 'Java正⽂', 1);

-- 添加视频
insert into
       videoinfo(vid, title, url, uid)
values
(1, 'java title', 'http://www.baidu.com', 1);

4.2 添加MyBatis框架支持

添加 MyBatis 框架⽀持分为两种情况:
⼀种情况是对自己之前的 Spring 项目进行升级,另⼀种情况是创建⼀个全新的 MyBatis 和 Spring Boot 的项⽬。

4.2.1 老项目添加MyBatis

添加框架⽀持:

<!-- 添加 MyBatis 框架 -->
<dependency>
 	<groupId>org.mybatis.spring.boot</groupId>
 	<artifactId>mybatis-spring-boot-starter</artifactId>
	 <version>2.1.4</version>
</dependency>

<!-- 添加 MySQL 驱动 -->
<dependency>
 	<groupId>mysql</groupId>
 	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.38</version>
 	<scope>runtime</scope>
</dependency>

更简单的操作⽅式是使用EditStarters插件

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.2.2 新项目添加MyBatis

在这里插入图片描述

4.3 配置连接字符串和MyBatis

此步骤需要进⾏两项设置,数据库连接字符串设置 和 MyBatis 的 XML ⽂件配置。

4.3.1 配置连接字符串

如果是 application.yml 添加如下内容:
注意空格!!!

# 数据库连接配置
spring:
 datasource:
 url: jdbc:mysql://localhost:3306/mycnblog?characterEncoding=utf8&useSSL=false
 username: root
 #注意写自己数据库的密码
 password: 123456
 driver-class-name: com.mysql.cj.jdbc.Driver

如果是application.properties添加如下内容:

# 数据库连接配置
spring.datasource.url=jdbc:mysql://localhost:3306/mycnblog?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
#注意写自己数据库的密码
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

注意事项:
如果使⽤ mysql-connector-java 是 5.x 之前的使⽤的是“com.mysql.jdbc.Driver”
如果是⼤于 5.x使⽤的是“com.mysql.cj.jdbc.Driver”
这里我们使用的是 version5.1.38

4.3.2 配置 MyBatis 中的 XML 路径

MyBatis 的 XML 中保存是查询数据库的具体操作 SQL,配置如下:

# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mybatis:
 mapper-locations: classpath:mybatis/*Mapper.xml

在这里插入图片描述

MyBatis组成:

  1. 接口(表的所有操作方法)
  2. XML实现接口

4.4 添加业务代码

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

4.4.1 添加实体类

添加⽤户表:
在这里插入图片描述

注意:MySQL中的datetime类型在Java中使用 LocalDateTime

添加用户的实体类:

import lombok.Data;
import java.time.LocalTime;

@Data
public class Userinfo {
		//private int id;
        private Integer id;
        private String username;
        private String password;
        private String photo;
        //注意这里createTime 和updateTime 和数据库中的字段大小写不一样
        private LocalDateTime createTime;
        private LocalDateTime updateTime;
        private int state;
}

4.4.2 添加 mapper 接口

在这里插入图片描述

4.4.3 添加 UserMapper.xml

数据持久层的实现,mybatis 的固定 xml 格式:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">

</mapper>

namespace :UserMapper实现哪个mapper接口
xml 实现接口的全路径(包名+接口名)

在这里插入图片描述

IDEA插件,实现 mybaits 接口和 xml 的快速定位
在这里插入图片描述
在这里插入图片描述

UserMapper.xml 查询指定⽤户的具体实现 SQL:

@Mapper
public interface UserMapper {
    Userinfo getUserById(@Param("user_id") Integer id);

}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
    <select id="getUserById" resultType="com.example.demo.entity.Userinfo">
        select * from userinfo where id=${user_id}
    </select>
</mapper>

在这里插入图片描述

以下是对以上标签的说明:
mapper标签:需要指定 namespace 属性,表示命名空间,值为 mapper 接⼝的全限定名,包括全包名.类名。
select查询标签:是⽤来执⾏数据库的查询操作的:
id:是和 Interface(接⼝)中定义的⽅法名称⼀样的,表示对接⼝的具体实现⽅法。
resultType:是返回的数据类型,也就是开头我们定义的实体类。

这里的 ${ } 和#{ } 后面会详细讲解

4.4.4 添加 Service

服务层 UserService 实现代码如下:

@Service
public class UserService {

    //属性注入  @Resource或者@Autowired
    @Autowired
    private UserMapper userMapper;

    public Userinfo getUserById(Integer id){
        return userMapper.getUserById(id);
    }

}

4.4.5 添加 Controller

控制器层 UserController 的实现代码如下:

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/getuserid")
    public Userinfo getUserById(Integer id){
        if(id==null) return null;
        return userService.getUserById(id);
    }
}

以上代码写完,整个 MyBatis 的查询功能就实现完了,接下来使⽤ postman 来测试⼀下。

4.4.6 使用 postman 测试

userinfo表中的记录:
在这里插入图片描述

postman发送请求:
在这里插入图片描述在这里插入图片描述
可以看到查询实现效果成功

5.增、删、改操作

实现用户的增加、删除和修改的操作,对应使用 MyBatis 的标签如下:

  • insert标签:插⼊语句
  • update标签:修改语句
  • delete标签:删除语句

5.1 增加用户操作

使用SQL查询创建表结构

show create table userinfo;

创建的userinfo表的表结构:
在这里插入图片描述

  1. 在UserMapper interface中声明方法
    在这里插入图片描述
  2. 在mapper.xml中提供实现
    在这里插入图片描述

注意:赋值使用的是对象中的属性,不是数据库的字段
Userinfo中是createTime 数据库中的字段是createtime
在这里插入图片描述

  1. 单元测试
    第一步:在测试类上添加@SpringBootTest注解
    第二步:注入测试对象(这里我们注入UserMapper)
    第三步:写单元测试的业务代码
    在这里插入图片描述

添加成功:
在这里插入图片描述
在这里插入图片描述

此时拿不到用户的id (自增主键)
因为插入操作默认返回的是影响的行数,不能做到同时返回你要查询的数据。

特殊的添加:返回自增 id

默认情况下返回的是受影响的行数,如果想要返回自增 id,具体实现如下。
UserMapper interface 声明如下:

//添加用户并返回id
    int addGetId(Userinfo userinfo);

UserMapper.xml 实现如下:

 <insert id="addGetId"  useGeneratedKeys="true" keyProperty="id">
        insert into userinfo(username,password,createtime,updatetime)
        values(#{username},#{password},#{createTime},#{updateTime})
    </insert>

在这里插入图片描述

useGeneratedKeys:这会令 MyBatis 使⽤ JDBC 的 getGeneratedKeys ⽅法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false
keyColumn:设置生成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第⼀列的时候,是必须设置的。如果⽣成列不止⼀个,可以⽤逗号分隔多个属性名称。
keyProperty指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值或 insert语句的 selectKey ⼦元素设置它的值,默认值:未设置(unset)。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性名称。

单元测试:在这里插入图片描述

此时除了影响行数外,还获取到了自增主键 id


5.2 修改用户操作

mapper 接⼝:

int upUser(Userinfo userinfo);

mapper.xml:

<update id="upUser">
        update userinfo set username=#{username} where id=#{id}
    </update>

单元测试:
在这里插入图片描述
结果:
在这里插入图片描述
在这里插入图片描述

5.3删除操作

mapper 接⼝:

int delById(@Param("id")Integer id);

mapper.xml:

<delete id="delById">
        delete from userinfo where id=#{id}
</delete>

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

6.开启mybatis sql日志打印

在application.properties中加入以下配置:

mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
//设置日志级别为debug
logging.level.com.example.demo=debug

执行结果中带有Preparing,Parameters和Updates,更直观的看到 mybatis 执行的sql语句
在这里插入图片描述

7. @Transactional注解

单元测试有不污染数据库的功能,使用@Transactional来实现

工作原理是删除操作后,进行回滚,恢复到原来的数据

可以加在类前面也可以加在方法前面。
在这里插入图片描述

可以看到数据库中的记录没有改变

在这里插入图片描述

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

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

相关文章

【一】设计模式~~~创建型模式~~~简单工厂模式(Java)

【学习难度&#xff1a;★★☆☆☆&#xff0c;使用频率&#xff1a;★★★☆☆】 1.1. 模式动机 考虑一个简单的软件应用场景&#xff0c;一个软件系统可以提供多个外观不同的按钮&#xff08;如圆形按钮、矩形按钮、菱形按钮等&#xff09;&#xff0c; 这些按钮都源自同一个…

学习之-spring cache缓存框架应用Redis

本文章用于个人学习记录 一、前言 1、SpringCache是Spring提供的一个缓存框架&#xff0c;在Spring3.1版本开始支持将缓存添加到现有的spring应用程序中&#xff0c;在4.1开始&#xff0c;缓存已支持JSR-107注释和更多自定义的选项。Spring 从 3.1 开始定义了 org.springframe…

设备树dtb文件的格式分析

设备树dtb文件的格式分析 文章目录 设备树dtb文件的格式分析DTB文件格式1.header头部1.magic2.totalsize3.off_dt_struct4.off_dt_strings字符串的偏移量5.off_mem_rsvmap 内存保留映射的偏移量6.version 格式版本7.last_comp_version最后兼容版本8.boot_cpuid_phys 我们正在启…

SpringBoot ( 五 ) 封装响应数据

2.6.业务处理 这是通过 Spring 在 Controller中注入Service模型层 而在 Service模型层 结合 Mybatis / Mybatis-Plus 进行数据加工, 数据持久化 2.7.封装响应值 将 业务处理得到数据封装到 Model作用域中, 伴随着转页将信息传递到页面 2.7.1.传值容器 2.7.1.1.Model 在Cont…

【Qt编程之Widgets模块】-001:QButtonGroup抽象容器

1.QButtonGroup简介 QButtonGroup提供了一个抽象容器&#xff0c;可以将按钮小部件放入其中。它不提供此容器的可视化表示&#xff0c;而是管理组中每个按钮的状态。 互斥按钮组&#xff0c;将关闭除已单击的按钮外的所有可选中&#xff08;可切换&#xff09;按钮。默认情况下…

七个合法学习黑客技术的网站,让你从萌新成为大佬

合法的学习网站&#xff0c;以下这些网站&#xff0c;虽说不上全方位的满足你的需求&#xff0c;但是大部分也都能。能带你了解到黑客有关的技术&#xff0c;视频&#xff0c;电子书&#xff0c;实践&#xff0c;工具&#xff0c;数据库等等相关学习内容。以上这些网站我都是用…

项目调研 | Loopring研究报告

一、项目简介及愿景 Loopring协议是一个专为应用程序开发的 zkRollup 协议、一个中继器、一个 L2 非托管交易所、一个智能钱包。用户可以在其中使用、交易和存储资产&#xff0c;同时让资产获得增长。 上述Loopring这些Title具体详情如下&#xff1a; 作为协议&#xff0c;Loop…

latex论文写作实用工具

从pdf定位到latex&#xff1a;ctrl 鼠标左键从latex定位到pdf&#xff1a;ctrl alt jVscode写latex时如何自动换行 最简单的方法就是使用快捷 Alt z 公式识别 SiimpleTex latex格式化 下载链接 在VSCode用户Json文件中添加如下&#xff1a; 表格转换工具 链接 Excel…

YOLOv5改进系列(3)——添加CA注意力机制

【YOLOv5改进系列】前期回顾&#xff1a; YOLOv5改进系列&#xff08;0&#xff09;——重要性能指标与训练结果评价及分析 YOLOv5改进系列&#xff08;1&#xff09;——添加SE注意力机制 YOLOv5改进系列&#xff08;2&#xff09;——添加CBAM注意力机制 目录 &#x1f68…

【Linux】Redis高可用概述1(RDB和AOF的备份恢复)

在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务 &#xff08;99.9%、99.99%、99.999% 等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证提供正常服 务(如…

优惠卷秒杀——分布式锁

在集群的模式下&#xff0c;有多个jvm&#xff0c;每个jvm内部有他自己的锁&#xff0c;导致并行执行存在线程安全问题 分布式锁&#xff1a;满足分布式系统或集群模式下多线程可见并且互斥的锁 基于Redis实现分布式锁 基于redis锁的初级版本 public interface ILock {/*** …

第十四届蓝桥杯C++--A组题解(更新中)

本来考场上做完想着这回图一乐&#xff0c;打打暴力混个省奖得了&#xff0c;看完民间题解感觉跟自己估计的差不多&#xff0c;应该挺寄的&#xff0c;没想到出分捡了个省一&#xff0c;喜提弱省省一倒数 这篇博客把自己会的题先放上来&#xff0c;其他的题慢慢补&#xff0c;好…

干翻Mybatis源码系列之第八篇:Mybatis提供的缓存方案细节注意

前言 Mybatis缓存设计成了两层的体系&#xff0c;第一层叫做一级缓存&#xff0c;第二层叫做二级缓存&#xff08;全局缓存&#xff09;。我们从这里可以看到Mybatis的缓存方案是有两种处理方式的。 一级缓存&#xff08;默认开启&#xff09; 一级缓存默认开启的&#xff0c…

[天翼杯 2021]esay_eval

[天翼杯 2021]esay_eval <?php class A{ #定义一个名为A的类public $code ""; #定义一个公共属性code function __call($method,$args){ #call魔术方法 当调用一个不存在的成员方法的时候触发eval($this->code); #将code的值以php代码执行 }function __w…

c高级day3作业

#!/bin/bash # 脚本名称:myfirstshell echo hello hostname ls -a .. echo $PATH echo $HOME df -h id -g hostname echo goodbye #!/bin/bash a(ls -l /etc | grep "^-" ) #/etc文件中普通文件 b(ls -l /etc | grep "^d" ) #/etc文件中一级目录文件 …

一篇了解智慧网关

智慧网关是指基于互联网技术的智能网关&#xff0c;能够连接不同的物联网设备和传感器&#xff0c;实现数据采集、信息传递、远程控制、通信管理等功能。作为物联网架构中的核心设备之一&#xff0c;智慧网关在智能家居、智慧城市、智能制造、智能交通、智能农业等领域得到了广…

solidworks三维建模竞赛练习题

solidworks三维建模竞赛练习题&#xff1a;3D01‐ 01 solidworks三维建模竞赛练习题&#xff1a;3D01‐ 02 solidworks三维建模竞赛练习题&#xff1a;3D01‐ 03 solidworks三维建模竞赛练习题&#xff1a;3D01‐ 04 solidworks三维建模竞赛练习题&#xff1a;3D01‐ 05 solidw…

windows docker 创建mysql主从 容器创建mysql主从

1. docker命令新建mysql-master&#xff0c;只是简单测试&#xff0c;没有设置映射&#xff0c;只是验证主从连接&#xff0c;需要可自行添加 docker run --restartalways --name mysql-master --privilegedtrue -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 mysql:8.0 2.…

Linux - 第11节 - 网络入门

目录 1.计算机网络背景 1.1.网络发展 1.2.认识 "协议" 2.网络协议初识 2.1.协议分层 2.2.OSI七层模型 2.3.TCP/IP五层&#xff08;或四层&#xff09;模型 3.网络传输基本流程 3.1.同局域网的两台主机通信 3.2.跨网络的两台主机通信 1.计算机网络背景 1.1…

spring事务报错Transaction rolled back because it has been marked as rollback-only

之前经常报"Transaction rolled back because it has been marked as rollback-only"这个异常 字面意思是"事务回滚了&#xff0c;因为它被标记了必须回滚"&#xff0c;最开始完全不懂事务的嵌套&#xff0c;每次出现这个错误都想知道为什么&#xff0c;但…