当前位置: 首页 > news >正文

一文学会 Spring 整合 MyBatis

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:SSM 框架从入门到精通
✨特色专栏:国学周更-心性养成之路
🥭本文内容:一文学会 Spring 整合 MyBatis

文章目录

    • 一、Spring 项目整体目录结构
    • 二、Spring 整合 MyBatis 开发环境
    • 三、Mapper 接口无实现类开发整合
        • 【1】创建一个 Maven 项目,然后再 pom.xml 文件中添加相关依赖
        • 【2】在 resources —> config 目录下,创建数据库配置文件 jdbc.properties
        • 【3】在 resources —> config 目录下,创建 MyBatis 配置文件 mybatis-config.xml
        • 【4】在 resources —> config 目录下,创建 Spring 配置文件 spring-config.xml
        • 【5】创建实体类 User
        • 【6】创建 Mapper 接口 UserMapper
        • 【7】创建与 UserMapper 接口映射的 UserMapper.xml 文件
        • 【8】创建 Service 业务层接口 UserService
        • 【9】创建 UserService 接口的实现类 UserServiceImpl
        • 【10】创建测试类

在这里插入图片描述

  Spring 整合 MyBatis 可以实现让数据库连接,事务管理,实例化对象的创建与依赖关系等都统一由 Spring 负责,以及数据库的增删改查操作由 spring-mybatis 整合包提供的 SqlSessionTemplate 对象来操作,或者利用整合包扫描接口,依据 Mapper 映射文件直接创建代理实现类,无须程序员手工实现接口,大大简化了开发流程。SpringMVC 本来就是 Spring 框架的一部分,这两者无须再做整合,所以 SSM 整合的关键就是Spring对MyBatis的整合,三大框架整合完成后,将以 Spring 为核心,调用有关资源,高效运作。

一、Spring 项目整体目录结构

在这里插入图片描述

二、Spring 整合 MyBatis 开发环境

  Spring 整合 MyBatis 开发环境除了需要 Spring 的jar包和 MyBatis 的jar包,还需要 SpringMyBatis 整合的中间件 mybatis-spring-xxx.jar,此外还需要数据库驱动jar包 mysql-connector-java-xxx.jar。

三、Mapper 接口无实现类开发整合

项目案例:Spring + MyBatis 实现对 user 数据库的查询。

实现步骤:

【1】创建一个 Maven 项目,然后再 pom.xml 文件中添加相关依赖

<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><groupId>cn.kgc.sm</groupId><artifactId>spring06</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>spring06</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--测试工具--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!--druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.9</version></dependency><!--mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version></dependency><!--IOC 依赖注入--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.9</version></dependency><!--mybatis&spring 整合包--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.5</version></dependency><!--aspects 切面--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.3.9</version></dependency><!--jdbc--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.9</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.3.9</version></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version></dependency><!-- 日志工具--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!--mybatis分页插件--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.2.1</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.9</version><scope>test</scope></dependency></dependencies>
</project>

【2】在 resources —> config 目录下,创建数据库配置文件 jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///java2218?serverTimezone=UTC&useSSL=false&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root

【3】在 resources —> config 目录下,创建 MyBatis 配置文件 mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><setting name="logImpl" value="LOG4J"/><setting name="mapUnderscoreToCamelCase" value="true"/><!--全局开启二级缓存--><setting name="cacheEnabled" value="true"/></settings><!--配置mybatis分页插件--><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><!-- 配置mysql方言 --><property name="helperDialect" value="mysql" /><!-- 设置为true时,如果pageSize=0就会查询出全部的结果 --><property name="pageSizeZero" value="true" /><!-- 3.3.0版本可用,分页参数合理化,默认false禁用 --><!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 --><!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 --><property name="reasonable" value="true" /></plugin></plugins>
</configuration>

【4】在 resources —> config 目录下,创建 Spring 配置文件 spring-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--引入外部数据源的配置参数--><context:property-placeholder location="classpath:config/jdbc.properties"></context:property-placeholder><!--初始化数据库连接池--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></bean><!--sqlSessionFactory--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!--设置数据库连接池--><property name="dataSource" ref="dataSource"></property><!--设置mybatis全局配置文件位置--><property name="configLocation" value="config/mybatis-config.xml"></property><!--设置别名的包--><property name="typeAliasesPackage" value="cn.kgc.sm"></property><!--设置mapper.xml文件的位置--><property name="mapperLocations" value="mapper/*.xml"></property></bean><!--mapper接口扫描  生成接口代理对象 同时完成对象的托管--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="cn.kgc.sm.mapper"></property></bean><!--开启包扫描  base-package  设置需要扫描的包 --><context:component-scan base-package="cn.kgc.sm"></context:component-scan>
</beans>

【5】创建实体类 User

package cn.kgc.sm.entity;import lombok.Data;@Data
public class User {private Integer uId;private String uName;private String uPassword;private Integer uState;}

【6】创建 Mapper 接口 UserMapper

package cn.kgc.sm.mapper;import cn.kgc.sm.entity.User;import java.util.List;public interface UserMapper {List<User> selectAll();
}

【7】创建与 UserMapper 接口映射的 UserMapper.xml 文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.kgc.sm.mapper.UserMapper"><select id="selectAll" resultType="user">select * from user</select>
</mapper>

【8】创建 Service 业务层接口 UserService

package cn.kgc.sm.service;import cn.kgc.sm.entity.User;
import cn.kgc.sm.mapper.UserMapper;import java.util.List;public interface UserService {List<User> selectAll();
}

【9】创建 UserService 接口的实现类 UserServiceImpl

package cn.kgc.sm.service.impl;import cn.kgc.sm.entity.User;
import cn.kgc.sm.mapper.UserMapper;
import cn.kgc.sm.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;
@Service
public class UserServiceImpl implements UserService {@AutowiredUserMapper userMapper;@Overridepublic List<User> selectAll() {System.out.println("users = ");List<User> users = userMapper.selectAll();System.out.println("users = " + users);return users;}
}

【10】创建测试类

package cn.kgc.sm.mapper;import cn.kgc.sm.entity.User;
import cn.kgc.sm.service.UserService;
import junit.framework.TestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.List;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:config/spring-config.xml")
public class UserMapperTest {@AutowiredUserService userService;@Testpublic void Test01(){List<User> users = userService.selectAll();users.forEach(user -> System.out.println("user = " + user));
//        for (User user : users) {
//            System.out.println("user = " + user);
//        }}}

运行结果:

在这里插入图片描述


  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

相关文章:

一文学会 Spring 整合 MyBatis

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

ElasticSearch - 文档 | 索引文档 | 检索文档 | 创建索引并指明映射

文章目录1. ElasticSearch是面向文档的2. 索引员工文档3. 检索员工文档4. 映射1. ElasticSearch是面向文档的 在应用程序中对象很少只是一个简单的键和值的列表。通常&#xff0c;它们拥有更复杂的数据结构&#xff0c;可能包括日期、地理信息、其他对象或者数组等。 Elastic…...

SQL中的DML、DDL、DCL分别是什么意思

SQL命令的分类 数据定义语言 DDL&#xff08;DataDefinition Language&#xff09; 是 SQL 语言集中负责数据结构定义。 DDL 的核心指令是CREATE、ALTER、DROP。 操作的对象包括&#xff1a;库、表、视图、索引等。 如&#xff1a;CREATE TABLE ; ALTER INDEX; DROP VIEW; 数据…...

kubeasz部署k8s高可用集群

前言&#xff1a;如无特殊说明&#xff0c;所有操作都用root账号在所有节点执行。 说明&#xff1a;kubeasz是一款国产开源的k8s部署软件&#xff0c;采用ansible role的部署方式&#xff0c;部署k8s二进制集群。熟悉ansible role的用该软件部署k8s方便快捷。 一、机器 deplo…...

2022年工程机械出口专题研究【重工】

文章目录2022年工程机械出口专题研究1、中国是全球工程机械第一大市场&#xff0c;竞争力逐步提升2、工程机械出口高增&#xff0c;市场分布趋于多元&#xff0c;企业营收获益3、海外市场高速增长原因为何&#xff1f;4、海外市场增长动能预测附件&#xff1a;2022年工程机械出…...

[python入门(51)] - python时间日期格式time和datetime

目录 ❤ 预备知识 ❤ UTC time Coordinated Universal Time ❤ epoch time ❤ timestamp&#xff08;时间戳&#xff09; ❤ stamptime时间戳 ❤ struct_time时间元组 ❤ format time 格式化时间 ❤ time模块​编辑 ❤ 获取当前时间的方法 ❤ 当传入默认参…...

别担心ChatGPT距离替代程序猿还有距离

经过多天对chat-GPT在工作的使用&#xff0c;我得出一个结论&#xff0c;它睁眼瞎说就算了&#xff0c;它还积极认错&#xff0c;绝不改正&#xff0c;错误答案极具误导性&#xff0c;啥也不说了&#xff0c;请看图。 经过N次较量它固执的认为 0011 1101 0110 0101在最高位是左…...

SpringBoot项目打包部署到阿里云服务器、通过Maven插件制作Docker镜像、部署项目容器、配置生产环境

制作通用模块jar包 通用模块不是运行的&#xff0c;而且要被其他模块引入的&#xff0c;所以该模块不能采用springboot打包方式制作jar包&#xff0c;否则其他模块无法引入通用模块。 1、修改通用模块&#xff0c;设置模块为非Springboot项目 <?xml version"1.0&qu…...

OpenGov的首个方案已上线Moonriver

随着公投128的通过&#xff0c;作为Runtime 2100的一部分&#xff0c;Moonbeam在Moonriver上推出了OpenGov。Moonbeam上的OpenGov部署将从Moonriver开始&#xff0c;以获得社区反馈。未来将举行公投&#xff0c;让社区来决定OpenGov如何发展并转移至Moonbeam。 Moonriver上的O…...

(三十一)大白话MySQL如果事务执行到一半要回滚怎么办?再探undo log回滚日志原理

之前我们已经给大家深入讲解了在执行增删改操作时候的redo log的重做日志原理&#xff0c;其实说白了&#xff0c;就是你对buffer pool里的缓存页执行增删改操作的时候&#xff0c;必须要写对应的redo log记录下来你做了哪些修改 如下图所示&#xff1a; 这样万一要是你提交事…...

机器学习-基于KNN及其改进的汉字图像识别系统

一、简介和环境准备 knn一般指邻近算法。 邻近算法&#xff0c;或者说K最邻近&#xff08;KNN&#xff0c;K-NearestNeighbor&#xff09;分类算法是数据挖掘分类技术中最简单的方法之一。而lmknn是局部均值k最近邻分类算法。 本次实验环境需要用的是Google Colab和Google Dr…...

Zebec生态持续深度布局,ZBC通证月内翻倍或只是开始

“Zebec生态近日利好不断&#xff0c;除了推出了回购计划外&#xff0c; Nautilus Chain 、Zebec Labs等也即将面向市场&#xff0c;都将为ZBC通证深度赋能。而ZBC通证涨幅月内突破100%&#xff0c;或许只是开始。”近日&#xff0c;流支付生态Zebec生态通证ZBC迎来了大涨&…...

Leetcode.1238 循环码排列

题目链接 Leetcode.1238 循环码排列 Rating &#xff1a; 1775 题目描述 给你两个整数 n和 start。你的任务是返回任意 (0,1,2,,...,2^n-1)的排列 p&#xff0c;并且满足&#xff1a; p[0] startp[i]和 p[i1]的二进制表示形式只有一位不同p[0]和 p[2^n -1]的二进制表示形式也…...

spring boot的包扫描范围

目录标题一、误解二、正确的理解三、不同包也能扫描到Bean的方法一、误解 一开始我一直以为spring boot默认的包扫描范围是启动类的同级目录和子目录下的Bean。其实正真是与启动类在同个包以及子包下的Bean。 我一直误解了包的概念&#xff0c;包并不是只文件夹&#xff08;文…...

常青科技冲刺A股上市:研发费用率较低,关联方曾拆出资金达1亿元

近日&#xff0c;江苏常青树新材料科技股份有限公司&#xff08;下称“常青科技”或“常青树科技”&#xff09;递交招股书&#xff0c;准备在上海证券交易所主板上市。本次冲刺上市&#xff0c;常青科技计划募资8.50亿元&#xff0c;光大证券为其保荐机构。 据招股书介绍&…...

【Linux】工具(1)——yum

好久不见&#xff0c;让大家久等啦~最近开学被一系列琐事所耽误了&#xff0c;接下来会进入稳定更新状态~话不多说&#xff0c;在我们了解Linux基本内容之后&#xff0c;我们的目的是要在Linux环境下进行软硬件开发&#xff0c;在这个过程中我们会用到一系列工具&#xff0c;例…...

MySQL - 排序与分页

目录1. 排序1.2 排序规则1.2 单列排序1.3 多列排序2. 分页2.1 实现规则1. 排序 1.2 排序规则 使用 ORDER BY 子句排序 ASC&#xff08;ascend&#xff09;&#xff1a;升序DESC&#xff08;descend&#xff09;&#xff1a;降序 ORDER BY 子句在SELECT语句的结尾。 1.2 单列…...

自动化测试框架对比

Robot Framework&#xff08;RF&#xff09; 链接&#xff1a;http://robotframework.org/ Robot Framework&#xff08;RF&#xff09;是用于验收测试和验收测试驱动开发&#xff08;ATDD&#xff09;的自动化测试框架。 基于 Python 编写&#xff0c;但也可以在 Jython&…...

第7章 Memcached replace 命令教程

Memcached replace 命令教程用于替换已存在的 key(键) 的 value(数据值)。 如果 key 不存在&#xff0c;则替换失败&#xff0c;并且将获得响应 NOT_STORED。 语法&#xff1a; replace 命令的基本语法格式如下&#xff1a; replace key flags exptime bytes [noreply]value…...

我记不住的那些maven内容

背景&#xff1a; 之前使用maven都是基于IDE并且对maven本身也很少究其过程和原理&#xff0c;当出现问题也不知道如何解决&#xff0c;后续想使用命令行来进行操作&#xff0c;并通过文档记录一下学习的内容加深理解以防止忘记。 一、简要介绍 maven是通过插件来增强功能&am…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...