MyBatis 快速入门(上)

news2024/12/27 13:42:08

文章目录

    • 一. MyBatis 是什么?
    • 二. 学习 MyBatis 的意义
    • 三. MyBatis 学习
    • 四. 创建 Mybatis 查询
      • 4.1 创建数据库和表
      • 4. 2 MyBatis 环境搭建
        • 1. 添加 MyBatis 框架支持
        • image-20230505204034077
        • 2. 设置 MyBatis 的配置信息
          • 2.1 设置数据库连接的相关信息
          • 2.2 MyBatis 的xml 保存路径 和 xml 命名格式
      • 4.3MyBatis 模式开发
        • 1. interface 部分
        • 2. xml 部分

一. MyBatis 是什么?

MyBatis 是一款优秀的持久层框架(将电脑中的数据保存到磁盘上) , 它支持自定义 SQL , 存储过程以及高级映射. MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作. MyBatis 可以通过简单的 xml 或 注解 来配置和映射原始类型 , 接口和 java POJO (plain old java objects , 普通老式 java 对象) 为数据库中的记录.

MyBatis 提供简单易用的 API 就是为了更加简单的操作和读取数据.


二. 学习 MyBatis 的意义

对应后端开发人员来说 , 程序主要由 后端程序 和 数据库组成.

JDBC 过于冗余且代码复用性很差


三. MyBatis 学习

MyBatis 学习只有两个部分:

  • 配置 MyBatis 开发环境.
  • 使用 MyBatis 模式和语法操作数据库.

四. 创建 Mybatis 查询

学习 Mybatis 之前 , 知道 Mybatis 的整个框架执行流程非常关键.

image-20230510155528610

MyBatis 是一个 ORM 框架(Object Relation Mapping) , 即对象关系映射. 在面向对象编程中 , 该框架会将关系型数据库中的数据和对象建立映射关系 , 进而自动完成数据和对象之间的转换.

ORM 框架对数据库的映射:

  • 数据表: 映射为 “类”
  • 记录: 映射为 “对象”
  • 字段: 映射为 “属性”

也就是说 , Mybatis 可以像操作对象一样来操作数据库中的表 , 并自动实现数据和对象之间的转换.

4.1 创建数据库和表

通过 MyBatis 我们要实现的功能是 , 查询一个博客系统中所有用户的信息.

通过 MySQL 创建数据库和表 , 代码如下:

-- 创建数据库
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 timestamp default current_timestamp,
    updatetime timestamp default current_timestamp,
    `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 timestamp default current_timestamp,
    updatetime timestamp default current_timestamp,
    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 timestamp default current_timestamp,
		updatetime timestamp default current_timestamp,
  	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 环境搭建

1. 添加 MyBatis 框架支持

Tips: 添加完 MyBatis 框架之后 , 还要添加需要 MySQL驱动. 这是因为 Mybatis 就像是淘宝这样的电商平台 , 需要有 MySQL 这样的商家入驻.

image-20230505204034077

但是直接启动就会报错 , 这是因为添加的依赖只是声明了要使用数据库 , 并没有说明具体的数据库的地址 , 密码 , 用户名…

image-20230505204817763

2. 设置 MyBatis 的配置信息

2.1 设置数据库连接的相关信息

yml 格式的配置文件 , propertise 同理.

# 数据库连接配置
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mycnblog?characterEncoding=utf8&useSSL=false
    username: root
#    password 要写自己本机 mysql 客户端的密码
    password: 111111
    driver-class-name: com.mysql.cj.jdbc.Driver
2.2 MyBatis 的xml 保存路径 和 xml 命名格式

创建 resourse/mybatis 的所有表的 xml 文件 , 意味着该目录下所有的文件后缀都为…Mapper.xml , 一种默认潜规则更加方便.

#   配置 mybatis xml 的文件路径
mybatis.mapper-locations=classpath:mybaits/*Mapper.xml

image-20230507084411684

4.3MyBatis 模式开发

由两部分组成:

  1. interface: 提供让其他层可以注入使用的接口
  2. xml: 具体实现 sql (可以看做是上面 interface 的实现)

Mybatis 的映射器 Mapper 就像是一个代理对象 , 让 interface 中的方法声明 和 xml 中的方法实现 , 生成一个代理对象 , 然后就可以在其他层调用这个代理对象.

image-20230506171050813

1. interface 部分

image-20230507090741739

编写实体类 , 在 entity 目录下 , 创建一个 UserEntity 实体类 , 成员依据数据库中字段来写.

@Data //Lombok 中 @Data 注解的作用是自动生成 Java 类的 getter、setter、toString、equals、hashCode 等常用方法
public class UserEntity {
    private int id;
    private String username;
    private String password;
    private String photo;
    private LocalDateTime createtime;
    private LocalDateTime updatetime;
    private Integer state;
}

编写数据持久层 , 在 mapper 目录下创建一个 UserMapper 接口.

@Mapper 注解的作用是将一个 java 接口标记为 Mybatis 的映射器(Mapper) , 使其可以被 Mybatis 框架扫描并生成对应的实现类.

@Mapper
public interface UserMapper {
    List<UserEntity> getAll();
}

2. xml 部分

xml 是针对 interface 的实现 , 因此 xml 的命名最好和 interface 的命名一致 (更加直观)

在 resources 的 mybatis 目录下创建一个 UserMapper.xml 文件. (文件中的内容无需记忆 , 直接复制粘贴即可)

namespace 中定义了当前 xml 实现的接口是哪个?

select 标签中至少需要两个参数 , 告诉 xml 实现的方法是哪个方法 , 以及返回的数据类型是什么?

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

后续增加新的功能 , 只需在 interface 中添加新方法 , xml 中实现该方法即可.

由 mybatis 标准分层可知 , service 用来访问 mapper , controller 用来访问 service.

创建 service 层 , 将 mapper 暴露出来 , 供其他人来访问.

@Service //把类托管到 Spring
public class UserService {
    @Autowired //属性注入
    private UserMapper userMapper; // mybatis 允许把一个接口当做是一个对象 , 其中操作框架代理自动完成.

    public List<UserEntity> getAll(){
        return userMapper.getAll();
    }
}

创建 controller 层 , 访问 service.

@RequestMapping("/user")
@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/getAll")
    public List<UserEntity> getAll(){
        return userService.getAll();
    }
}

访问 localhost:8080/user/getAll , 结果如下:

image-20230507085424154


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

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

相关文章

如何白嫖可联网GPT- NEW Bing

这里写自定义目录标题 前沿方法安装总结 前沿 目前我们想体验可联网的GPT只能去OPENAI官网购买plus会员&#xff0c;一个月20刀&#xff0c;换算一下的话大概在140左右&#xff0c;当然由于OPENAI某些原因经常封禁不符合规定的账号&#xff0c;那么有没有一种办法能白嫖快速的…

Qt Qml 实现键鼠长时间未操作锁屏

文章目录 摘要实现思路键盘鼠标监控百度到的方法我的自己方法 最后 关键字&#xff1a; Qt、 Qml、 QInputEvent 、 QStandardItem、 eventFilter 摘要 今日需求&#xff1a; 项目中需要实时检测用户是否长时间为操作键盘和鼠标&#xff0c;如果超过预设时间未操作键盘和…

Linux之管道

目录 Linux之管道 操作符号 作用 用法 管道符使用场合 匿名管道与命名管道的区别 如何创建命名管道 案例举例 案例1 --- 将/etc/passwd中的用户按UID大小排序 案例2 --- 统计出最占CPU的5个进程 案例3 --- 统计当前/etc/passwd中用户使用的shell类型 案例4 --- 统计网站…

Java大数据文件处理方法

前言 Java大数据文件处理是一种使用Java编写的大型数据处理技术&#xff0c;特别适用于处理大型数据文件。在这篇文章中&#xff0c;我们将了解什么是Java大数据文件处理&#xff0c;为什么它很重要以及Java大数据文件处理的方法和技术。 一、什么是Java大数据文件处理&#…

交易信号有效性测算1——N日涨跌幅

在交易信号发出后&#xff0c;我们需要一些程序化的流程&#xff0c;来验证信号的有效性&#xff0c;其中信号发出后N日的涨跌幅就是一个比较常见的任务 布林带交易策略 我们以布林带&#xff08;BOLL&#xff09;交易策略为示例&#xff1a; 中轨线 N日移动平均线上轨线 …

Linux 上的 .NET 崩溃了怎么抓 Dump

一&#xff1a;背景 1. 讲故事 训练营中有朋友问在 Linux 上如何抓 crash dump&#xff0c;在我的系列文章中演示的大多是在 Windows 平台上&#xff0c;这也没办法要跟着市场走&#xff0c;谁让 .NET 的主战场在工控 和 医疗 呢&#xff0c;上一张在 合肥 分享时的一个统计图…

Unity3D:项目 ID 不匹配的情况下如何应对

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 如果在 Services 窗口的 Settings 中找不到项目 ID&#xff0c;或者如果发现项目 ID 不匹配&#xff0c;这可能是因为使用了较早版本的 Unity 来升级项目&#xff0c;或在脱机时创建…

Win10电脑应用程序并行配置不正确怎么办?

Win10电脑应用程序并行配置不正确怎么办&#xff1f;有用户在运行某些软件时&#xff0c;突然提示出错信息“应用程序无法启动&#xff0c;因为应用程序的并行配置不正确&#xff0c;出现这一问题可能是禁用本地相关服务&#xff0c;或者新安装的系统缺少必要的VC 运行。那么具…

PTQ-PDPMV1 PROSOFT DP主网络接口模块

Quantum的PROFIBUS DP主网络接口模块 PTQ-PDPMV1 PROFIBUS DP主网络接口允许Quantum处理器与支持PROFIBUS DP V0或V1的从设备轻松连接。该模块作为PROFIBUS网络和处理器之间的输入/输出模块。PROFIBUS是工业自动化中最常用的协议之一。应用领域包括电力和配电、石化、水和天然…

基于stm32mp157 linux开发板ARM裸机开发教程7:Cortex-A7 GPIO 实验(连载中)

前言&#xff1a; 目前针对ARM Cortex-A7裸机开发文档及视频进行了二次升级持续更新中&#xff0c;使其内容更加丰富&#xff0c;讲解更加细致&#xff0c;全文所使用的开发平台均为华清远见FS-MP1A开发板&#xff08;STM32MP157开发板&#xff09; 针对对FS-MP1A开发板&…

如何在命令行编译运行java程序?

2023年5月29日&#xff0c;周一下午&#xff1a; 好久没写java程序了&#xff0c;今天居然忘了怎么用命令行编译运行java程序了&#xff0c;还好后来想起来了&#xff0c;为了避免忘记&#xff0c;写篇博客记录一下 1、先用记事本等编辑器写一个java程序&#xff0c;文件名要和…

网络货运系统源码 网络货运平台源码,货运APP源码 货物运输管理源码

网络货运系统源码 网络货运平台源码&#xff0c;货运APP源码 货物运输管理源码 网络货运为无车承运人更名而来&#xff0c;网络货运平台的好处可以节省找车找货的时间与成本。根据国家对智慧物流行业的发展规划&#xff0c;及《网络平台道路货物运输经营管理办法》等相关法律法…

github创建仓库和拉取代码

目录 一、git创建仓库 第一步&#xff1a;首先登录github 第二步&#xff1a;进入建立的仓库(或者新建仓库) 第三步&#xff1a;创建成功 第四步&#xff1a;在本地新建一个文件夹&#xff0c;然后在文件夹下打开git bash 第五步&#xff1a;在git bash命令框执行git init…

Linux:centos:修改临时ip永久ip

使用 ifconfig 查看网卡信息以及ip 临时配置ip 找到要修改ip的网卡的名称&#xff08;我这里使用名称为&#xff1a;ens33网卡&#xff09; # ifconfig 网卡名 ip /子网掩码 ifconfig ens33 192.168.1.2/24 配置永久ip 去配置网卡文件 vi /vim 或 nano vim /etc/s…

腾讯云轻量服务器和云服务器区别(超详细全解析)

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器成本低&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CVM适…

10 个对于Android开发者有用的Kotlin扩展函数#1

10 个对于Android开发者有用的Kotlin扩展函数 使用扩展函数来提高安卓开发体验 什么是扩展功能&#xff1f; Kotlin 中的扩展函数允许您向现有类添加新功能&#xff0c;而无需继承它或修改类本身。这是从类定义外部扩展类功能的便捷方式。 Log 您可以any object使用此扩展…

【ABAQUS】什么是剪切闭锁?剪切闭锁会导致什么?

“完全积分”是指当单元具有规则形状时&#xff0c;对单元刚度矩阵中的多项式项进行精确积分所需的高斯点数。对于六面体和四边形元素&#xff0c;“规则形状”意味着边缘是直的&#xff0c;并以直角相交&#xff0c;任何边缘节点都位于边缘的中点。 完全积分的线性元素在每个…

6种常见电流检测电路设计方案

电流检测电路设计方案&#xff08;一&#xff09; 低端检流电路的检流电阻串联到地&#xff08;图1&#xff09;&#xff0c;而高端检流电路的检流电阻是串联到高电压端&#xff08;图2&#xff09;。两种方法各有特点&#xff1a;低端检流方式在地线回路中增加了额外的线绕电…

正则表达式快速上手

一、推荐个正则表达式练习网站&#xff1a;regex101: build, test, and debug regexhttps://regex101.com/ 二、正则表达式常用的几个符号 &#xff08;一&#xff09;限定符 1. &#xff1f;&#xff1a; 表示匹配的字符串中&#xff0c;&#xff1f;前面的字符可有可无&a…

VUE3.0 路由跳转之后页面停留在上一个浏览页面位置不会回到顶部问题

方式一&#xff1a;普通用法&#xff0c;vue2.0也可用 // 一般方式路由拦截 export default {// 组件守护器beforeRouteEnter(to, from, next) {// A跳转到B&#xff0c;B页面停留在A页面的滚动位置&#xff1b;解决方法&#xff1a;将scrollTop设置为0window.scroll(0, 0);ne…