Mybatis学习之Spring boot整合Mybatis示例

文章目录

  • 1.Mybatis是什么?
  • 2.整合SSM
    • 2.1 创建数据库表
    • 2.2 pom.xml
    • 2.3 启动入口
    • 2.4 web层
    • 2.5 service层
    • 2.6 dao层
    • 2.7 properties.yml
  • 3.测试
  • 4.异常Invalid value type for attribute 'factoryBeanObjectType': java.lang.String
  • 5.总结

Spring + SpringMVC + Mybatis是现在一个非常热门的组合方式,本文介绍一种整合SSM的方式。本文仅作为示例程序,不包含原理解析。

1.Mybatis是什么?

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

2.整合SSM

本文借助Spring boot来搭建,所需要的前期准备环境准备:

  • JAVA 17+
  • MYSQL 8
  • Spring boot 3.2.5

2.1 创建数据库表

CREATE TABLE `user` (`name` varchar(20) DEFAULT NULL,`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

这里是简单创建了一个user表,只包含name和age两个字段。

2.2 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.5</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>org.example.yy</groupId><artifactId>ssm</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.3.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository></repositories><pluginRepositories><pluginRepository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></pluginRepository><pluginRepository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></pluginRepository></pluginRepositories>
</project>

这里重点引入了三个依赖:

  • mybatis-spring-boot-starter 3.0.3
  • mysql-connector-j
  • spring-boot-starter-web

2.3 启动入口

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SSMApplication {public static void main(String[] args) {SpringApplication.run(SSMApplication.class, args);}
}

这里只是简单的Springboot启动类入口,没有添加其他注解。

2.4 web层

import lombok.RequiredArgsConstructor;
import org.example.ssm.entity.User;
import org.example.ssm.service.UserService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequiredArgsConstructor
public class UserController {private final UserService userService;@GetMapping("/hello/{name}")public ResponseEntity<User> hello(@PathVariable String name) {return ResponseEntity.ok(userService.getUser(name));}
}

2.5 service层

import lombok.RequiredArgsConstructor;
import org.example.ssm.entity.User;
import org.example.ssm.mapper.UserMapper;
import org.springframework.stereotype.Component;@Component
@RequiredArgsConstructor
public class UserService {private final UserMapper userMapper;public User getUser(String name) {return userMapper.findByName(name);}
}

2.6 dao层

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.example.ssm.entity.User;@Mapper
public interface UserMapper {@Select("select * from user where name=#{name}")User findByName(@Param("name") String name);
}

这里是Mybatis定义mapper的地方,mapper可以通过注解来定义,也可以通过xml来定义。
当然,这里还需要实体类User.java

import lombok.Data;@Data
public class User {private String name;private int age;
}

2.7 properties.yml

Spring boot需要的配置文件,指定dataSource的信息:

server:port: 9099spring:datasource:url: jdbc:mysql://localhost:3306/bookstore?serverTimezone=UTCusername: rootpassword: Yuanyao@123driverClassName: com.mysql.cj.jdbc.Driver

3.测试

此时可以通过API访问:

➜  ~ curl http://localhost:9099/hello/tom
{"name":"tom","age":23}%                                                        

可以看到,已经可以从数据库中查询出数据了。

4.异常Invalid value type for attribute ‘factoryBeanObjectType’: java.lang.String

如果使用的mybatis-spring-boot-starter的版本是3.0.2的话,可能会遇到这个问题,导致程序无法启动。这是为什么呢?
这是因为在处理BeanDefinitions的时候,设置的attribute设置的值是beanName,而不是Class对象。

definition.setAttribute(FACTORY_BEAN_OBJECT_TYPE, beanClassName);

好在,在3.0.3这个版本中,已经修复了这个问题:

Class<?> beanClass = Resources.classForName(beanClassName);
// Attribute for MockitoPostProcessor
// https://github.com/mybatis/spring-boot-starter/issues/475
definition.setAttribute(FACTORY_BEAN_OBJECT_TYPE, beanClass);

所以解决方法很简单,只需引用新版本就好了!
当然了,也可以手动配置sqlSessionFactoryBean。

5.总结

这里虽然可以使用程序了,但是有很多问题没有解决,Mybatis是如何与Spring整合的?Mybatis的SqlSession对象是如何加载的?mapper这个接口类,又是怎么被加载的?我们注解的sql语句,如果用xml文件怎么做?

挖坑不断,接下里再填。

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

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

相关文章

nacos配置发布流程详解

1、安装必备环境&#xff1a; 首先&#xff0c;需要安装Java和Maven。Nacos是基于Java开发的&#xff0c;因此Java环境是必不可少的。同时&#xff0c;如果选择从源码部署Nacos&#xff0c;那么需要Maven来构建项目。 2、安装MySQL&#xff1a; Nacos支持使用MySQL作为外置数…

RT_thread nano移植Finsh

参考连接: https://blog.csdn.net/baseball214/article/details/131341722 移植的前提是,你已经有一个可以使用的nano功能. 1.将rtthread-nano-master\rt-thread\components文件复制到工程. 2.添加Finsh中的.c以及相关.h头文件路径 3.注释掉finsh_config.h文件中以下两个宏…

C语言中的数据类型转换:隐式类型转换与显示类型转换

一. 简介 本文简单学习一下&#xff0c;C语言中的数据类型转换。重点学习一下隐式类型转换。 二. C语言中的数据类型转换&#xff1a;隐式类型转换与显示类型转换 类型转换&#xff08;TypeCasting&#xff09;&#xff1a;在C语言中是将一种数据类型值转换为另一种数据类型…

transfomer中attention为什么要除以根号d_k

简介 得到矩阵 Q, K, V之后就可以计算出 Self-Attention 的输出了&#xff0c;计算的公式如下: A t t e n t i o n ( Q , K , V ) S o f t m a x ( Q K T d k ) V Attention(Q,K,V)Softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)Softmax(dk​ ​QKT​)V 好处 除以维…

leetcode102. 二叉树的层序遍历

一、题目描述&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 二、输入输出实例&#xff1a; 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&am…

基于 Redis 实现分布式锁的全过程

前言 这一篇文章拖了有点久&#xff0c;虽然在项目中使用分布式锁的频率比较高&#xff0c;但整理成文章发布出来还是花了一点时间。在一些移动端、用户量大的互联网项目中&#xff0c;经常会使用到 Redis 分布式锁作为控制访问高并发的工具。 一、关于分布式锁 总结&#x…

【HDFS】处理状态为RECEIVING_BLOCK的增量块汇报

带着以下问题: RECEIVING_BLOCK状态的IBR,block的长度汇报上来有用么?BlockManager#processIncrementalBlockReport里,处理IBR,里面有一个case分支,专门处理RECEIVING_BLOCK状态的块。 case RECEIVING_BLOCK:// receving计数器++receiving++;// 第三个参数副本状态是RBWp…

20.Redis之缓存

1.什么是缓存&#xff1f; Redis 最主要的用途,三个方面:1.存储数据(内存数据库)2.缓存 【redis 最常用的场景】3.消息队列【很少见】 缓存 (cache) 是计算机中的⼀个经典的概念. 在很多场景中都会涉及到. 核⼼思路就是把⼀些常⽤的数据放到触⼿可及(访问速度更快)的地⽅, ⽅…

基础—SQL—DQL(数据查询语言)聚合函数

一、引言 一般情况下&#xff0c;我们在进行分组查询的时候&#xff0c;一般配合着聚合函数来进行操作&#xff0c;所以先了解和学习聚合函数再学习和操作分组查询。 二、DQL—聚合函数 1、介绍 聚合函数指的是讲一列数据作为一个整体&#xff0c;进行纵向的计算。 2、常见…

域内用户枚举和密码喷洒

一. 域内用户枚举原理和流量 1. 原理 在AS-REQ阶段客户端向AS发送用户名&#xff0c;cname字典存放用户名&#xff0c;AS对用户名进行验证&#xff0c;用户存在和不存在返回的数据包不一样。 不同之处主要是在返回数据包中的状态码不同&#xff0c;根据不同的状态码来区分账…

20分钟Angular框架快速入门

Angular框架快速入门可以按照以下步骤进行&#xff1a; 一、准备工作 安装Node.js&#xff1a;Angular依赖于Node.js进行开发&#xff0c;因此首先需要安装Node.js。确保安装的是最新稳定版本。 二、安装Angular CLI 打开命令行工具&#xff1a;在Windows上可以使用CMD或Pow…

数学建模 —— 人工神经网络(6)

目录 一、人工神经网络 1.1 人工神经网络结构 1.2 神经元/感知器 1.3 激活函数 1.3.1 sign函数 1.3.2 sigmoid函数&#xff08;Logistic函数&#xff09; 1.3.3 tanh双曲正切函数 1.3.4 ReLU函数 1.4 分类 二、BP人工神经网络 2.1 概述 2.2 处理过程 2.3 例题 2.…

Android Studio插件开发 - Dora SDK的IDE插件

IDE插件开发简介 Android Studio是一种常用的集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于开发Android应用程序。它提供了许多功能和工具&#xff0c;可以帮助开发人员更轻松地构建和调试Android应用程序。 如果你想开发Android Studio插件&#xff0c;以下是一…

移动系统编程-安装和运行Ionic应用程序 (Installation and Running Ionic Apps)

安装 (Installation) 假设您已经安装了Node.js和Angular&#xff0c;您可以使用以下命令安装Ionic&#xff1a; npm install -g ionic/cli您也可以不使用CLI安装Ionic&#xff0c;但如果您使用的是最新版本的Cordova&#xff0c;这样做可能会导致版本不匹配&#xff0c;不推荐…

基础技术-ELF系列(3)-libelf使用

成就更好的自己 本篇是基础技术系列中ELF相关技术的第三篇&#xff0c;也是计划中的最后一篇&#xff08;后续遇到问题可能还会有后续&#xff09;。本文将会以上一篇文章中提到的实际问题写一段Demo为例&#xff0c;着重讲解一下libelf库的基本使用。 没有看过之前文章的朋友…

【技术实操】银河高级服务器操作系统实例分享,数据库日志文件属主不对问题分析

1. 问题现象描述 2023 年 06 月 30 日在迁移数据库过程中&#xff0c;遇到数据库 crash 的缺陷&#xff0c;原因如下&#xff1a;在数据库启动时候生成的一组临时文件中&#xff0c;有 owner 为 root 的文件&#xff0c; 文件权限默认为 640&#xff0c; 当数据库需要使用的时…

「C系列」C 基本语法

文章目录 一、C 基本语法1. **程序结构**2. **数据类型**3. **变量声明**4. **运算符**6. **函数**7. **指针**8. **数组**9. **结构体和联合体**10. **预处理指令**11. **内存管理** 二、C 关键字1. 整体概览2. 具体关键字数据类型关键字控制流关键字其他关键字C11新增关键字总…

高速服务区智慧公厕管理系统引导屏UI界面展示

在现代社会&#xff0c;高速服务区作为人们出行途中的重要休憩场所&#xff0c;其各项设施的智能化水平也在不断提升。其中&#xff0c;智慧公厕管理系统的出现&#xff0c;为人们带来了更加便捷、舒适的如厕体验&#xff0c;而引导屏 UI 界面更是这一系统的重要展示窗口。 智慧…

mdk 编程入门:探索编程世界的神秘之旅

mdk 编程入门&#xff1a;探索编程世界的神秘之旅 在科技日新月异的今天&#xff0c;编程已成为一项不可或缺的技能。MDK编程作为其中的一员&#xff0c;以其独特的魅力和广泛的应用领域吸引着越来越多的初学者。那么&#xff0c;如何入门MDK编程呢&#xff1f;本文将带你走进…

Python | Leetcode Python题解之第126题单词接龙II

题目&#xff1a; 题解&#xff1a; class Solution:def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[List[str]]:ans []if endWord not in wordList:return anssize len(beginWord)cur_word_set {beginWord}ws set(wordList)# 用于…