【Spring】Spring 整合 MyBatis

在实际项目开发中,将 Spring 和 MyBatis 进行整合可以提高开发效率、简化配置、增强事务管理和可维护性,同时利用 Spring 的强大功能能提升系统的稳定性。这里从独立使用 MyBatis 开始,逐步实现与 Spring 框架的整合。

MyBatis 独立开发

现在,通过一个简单的案例来展示 MyBatis 的开发过程。

(1)创建 user 表

首先,创建一张用于测试的数据表。运行 sql 代码,在 db 数据库中创建一张 users 表:

CREATE DATABASE db;
USE db;DROP TABLE IF EXISTS users;
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(20) NOT NULL,password VARCHAR(20) NOT NULL
);INSERT INTO users VALUES (1, 'aa', '123');

(2)创建 Maven 项目

在 IDEA 中创建一个 Maven 项目,这里进入 New Project 选项中创建:

在这里插入图片描述

这里将 GroupId 命名为 com.it

(3)导入依赖

Maven 项目创建完成后,在项目的 pom.xml 文件中导入 MySQL 和 MyBatis 依赖:

<dependencies><!-- MyBatis 依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version></dependency><!-- MySQL 依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version></dependency>
</dependencies>

(4)创建 MyBatis 核心配置文件

在 src/main/resources 文件夹下创建一个 mybatis-config.xml 文件。首先,从 MyBatis 官网 拷贝一份模板至 mybatis-config.xml 文件中,并且在模板的基础上引入外部配置文件和删除 mapper 配置(后续使用注解配置 SQL 映射):

<?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><!-- 引入外部配置文件  --><properties resource="jdbc.properties"/><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments>
</configuration>

接着,在 src/main/resources 文件夹下创建一个 jdbc.properties 文件,名称与 mybatis-config.xml 文件中引入的配置文件名保持一致,其内容为:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///db?useSSL=false
jdbc.username=root
jdbc.password=123456

(5)创建 POJO 类

在 com.it.domain 文件夹下定义 User 类,属性名称与数据库字段保持一致:

public class User{private Integer id;private String username;private String password;public Integer getId() {return id;}public String getUsername() {return username;}public String getPassword() {return password;}public void setId(Integer id) {this.id = id;}public void setUsername(String username) {this.username = username;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

(6)使用注解配置 SQL 映射

在 com.it.dao 文件夹下定义 UserDao 接口,并通过注解实现 SQL 语句的映射:

public interface UserDao {@Insert("INSERT into users(username,password) VALUES (#{username},#{password}))")void save(User user);@Delete("DELETE FROM users WHERE id = #{id}")void delete(Integer id);@Update("UPDATE users set name = #{name}}")void update(User user);@Select("SELECT * FROM users")List<User> findAll();@Select("SELECT * FROM users WHERE id = #{id}")User findById(Integer id);
}

在之前创建的 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><!-- 引入外部配置文件  --><properties resource="db.properties"/><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!-- 绑定接口 --><mappers><mapper class="com.it.dao.UserDao"/></mappers>
</configuration>

(7)测试

在 com.it 包下创建一个 App 类,测试 MyBatis 项目是否能正常运行:

public class App {public static void main(String[] args) throws IOException {// 1. 创建 SqlSessionFactoryBuilder 对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();// 2. 加载 mybatis-config.xml 配置文件InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");// 3. 创建 SqlSessionFactory 对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);// 4. 获取 SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 5. 使用 SqlSession 对象执行查询,获取 UserUserDao userDao = sqlSession.getMapper(UserDao.class);User user = userDao.findById(1);System.out.println(user);// 6. 释放资源sqlSession.close();}
}

运行上述代码后可正常查询出创建 users 数据库表时插入的用户信息。至此,MyBatis 独立项目运行成功。

Spring 整合

现在,从 App 类中的 Main 运行程序出发,分析一下 MyBatis 中可以交给 Spring 框架管理的 Bean 对象,以此实现整合。查看 Main 方法可知,前三个步骤是初始化 SqlSessionFactory 对象。第四步骤和五步骤用于获取连接和获取数据层接口,这部分主要与业务相关。最后,第六步关闭连接。在这个过程中,核心对象是 SqlSessionFactory 对象。因此,可以将 SqlSessionFactory 对象交给 Spring 框架管理,进而实现框架整合。

综上,整个整合思路是这样的:将 SqlSessionFactory 对象交给 Spring 框架管理。而由于 SqlSessionFactory 对象涉及 mybatis-config.xml 文件,因此,需要将该文件中涉及的对象一起交给 Spring 框架管理,比如 dataSource。

(1)引入 Spring 依赖

首先,我们需要引入 Spring 框架。在 MyBatis 独立开发项目的基础上,向 pom.xml 文件中导入 Spring 依赖:

<!-- Spring 依赖 -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version>
</dependency>

(2)引入 Spring 操作数据库的依赖

在 pom.xml 文件中导入与 Spring 操作数据库相关的依赖:

<!-- Spring JDBC 依赖 -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.10.RELEASE</version>
</dependency>

(3)引入 Spring 整合 MyBatis 的依赖

在 pom.xml 文件中导入与 Spring 整合 MyBatis 相关的依赖:

<!-- Spring 整合 MyBatis 依赖 -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.0</version>
</dependency>

这个依赖包实际上属于 MyBatis 提供的,即 Spring 提供统一规范,MyBatis 负责实现。

(4)整合 dataSource 管理

这里使用德鲁伊连接池(数据源)对数据库连接进行管理。在使用 Spring 框架时,可以将德鲁伊数据源交给 Spring 管理。首先,在 pom.xml 文件中导入相关依赖:

<!-- Druid 连接池依赖 -->
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version>
</dependency>

接着,选择纯注解开发模式,在 com.it.config 包下面创建一个 JdbcConfig 类:

public class JdbcConfig {@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String userName;@Value("${jdbc.password}")private String password;// 1. 定义一个方法获取要管理的对象// 2. 添加 @Bean,表示当前方法的返回值是一个 Bean@Bean("dataSource")public DataSource dataSource () {DruidDataSource ds = new DruidDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(userName);ds.setPassword(password);return ds;}
}

其中,dataSource 方法用于返回数据源 Bean 对象,代替了 mybatis-config.xml 文件中对数据源的配置项。

(5)整合 MyBatis

选择纯注解开发模式,在 com.it.config 包下面创建一个 MybatisConfig 配置类,用于实现对 SqlSessionFactory 对象的管理:

public class MybatisConfig {@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();// 用于替代 mybatis-config.xml 配置文件中的数据源配置项ssfb.setDataSource(dataSource);return ssfb;}@Beanpublic MapperScannerConfigurer mapperScannerConfigurer() {MapperScannerConfigurer msc = new MapperScannerConfigurer();// 用于替代 mybatis-config.xml 配置文件中的绑定接口项msc.setBasePackage("com.it.dao");return msc;}
}

其中,sqlSessionFactory 方法用于返回需要 Spring 管理的 SqlSessionFactory Bean 对象。在纯注解模式下,引用类型注入只需要为 Bean 定义方法设置形参即可,容器会根据类型自动装配对象。因此,这个方法将通过 dataSource 形参自动注入上一步中生成的数据源 Bean 对象。另外,由于 mybatis-config.xml 文件中指定了绑定接口项,因此,也需要创建对应的 mapperScannerConfigurer 来替代配置文件。

(6)创建核心配置类

完成 JdbcConfig 和 MybatisConfig 配置类之后,在 com.it.config 包下面创建一个 SpringConfig 核心配置类,将上述两个配置类通过 SpringConfig 引入:

@Configuration
@ComponentScan("com.it")
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class, MybatisConfig.class})
public class SpringConfig {
}

注意,需要使用 @Configuration 注解表示这个类为配置类。使用 @ComponentScan 注解对包进行扫描,以此注入相关 Bean 对象。使用 @PropertySource 注解指定数据源的配置文件,最后使用 @Import 注解将 JdbcConfig 数据源配置类、 MybatisConfig 配置类引入。

(7)整合测试

在完成上述步骤后,可以将原本保留的 mybatis-config.xml 配置文件删除。至此,便完成了 Spring 对 MyBatis 的整合。现在通过 App1 类对整合结果进行测试:

public class App1 {public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);UserDao userDao = ctx.getBean(UserDao.class);User user = userDao.findById(1);System.out.println(user);}
}

除。至此,便完成了 Spring 对 MyBatis 的整合。现在通过 App1 类对整合结果进行测试:

public class App1 {public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);UserDao userDao = ctx.getBean(UserDao.class);User user = userDao.findById(1);System.out.println(user);}
}

最终,成功返回了 users 表中 id 等于 1 的用户信息。

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

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

相关文章

JavaWeb学习(1)(同步或异步请求、依赖jQuery简单实现Ajax技术)

目录 一、Web的基本流程与页面局部刷新。 &#xff08;1&#xff09;web开发时基本流程。 &#xff08;2&#xff09;页面的"全局刷新"与"局部刷新"。 二、Ajax技术。 &#xff08;1&#xff09;基本介绍。 &#xff08;2&#xff09;基本特点。 1、与服务…

win11 vs2022 python3.9环境下运行jupyterlab

jupyter官网及简介&#xff1a;https://jupyter.org/ Jupyter 集合“浏览器 编程 文档 绘图 多媒体 发布”众多功能与一身&#xff0c;适合探究式学习。 JupyterLab是最新的基于网络的笔记本、代码和数据的互动开发环境。 Jupyter Notebook是JupyterLab的上一代版本。 由…

STM32 进阶 定时器 2基本定时器 基本定时器中断案例:LED闪烁

基本定时器 基本定时器TIM6和TIM7各包含一个16位自动装载计数器&#xff0c;由各自的可编程预分频器驱动。 这2个定时器是互相独立的&#xff0c;不共享任何资源。 这个2个基本定时器只能向上计数&#xff0c;由于没有外部IO&#xff0c;所以只能计时&#xff0c;不能对外部…

libaom 源码分析:帧间帧内预测编码

整体流程框架逻辑 帧间帧内预测模式的分区类型 不论是 RD 模式还是 nonRD 模式,libaom 中分区只应用 PARTITION_NONE、PARTITION_HORZ、PARTITION_VERT、PARTITION_SPLIT 四种类型,不像 AV1 标准中介绍的那样有十种类型(其实 libaom 源码中也实现了所有了类型,但在正式版中…

达梦归档文件名与实例对应关系

默认的&#xff0c;达梦归档文件名比较难以看懂&#xff0c;且多实例下不好区分 靠它就行 select upper(to_char((select DB_MAGIC), xxxxxxxxxx)) mag_id; 这样就对上号了。

JavaScript实现圆周运动效果

在 JavaScript 中&#xff0c;可以通过 requestAnimationFrame 和数学公式来实现圆周运动效果。以下是示例代码&#xff1a; 示例代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewp…

11.爬虫

前言&#xff1a; 正则表达式的作用&#xff1a; 作用一&#xff1a;校验字符串是否满足规则 作用二&#xff1a;在一段文本中查找满足要求的内容 一.Pattern类和Matcher类&#xff1a; 1.Pattern类&#xff1a;表示正则表达式 a.因此获取Pattern对象就相当于获取正则表达式…

Java项目实战II基于微信小程序的无中介租房系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着城市化进程的加速&#xff0c;租房市场日益繁荣&a…

Linux里面实时查看项目的tomcat服务器日志文件

目录 前言 一、查看tomcat服务器日志 二、运行项目验证&#xff08;篇外&#xff09; (一)运行自己的项目 二、发送验证码测试 前言 这个可以查看在Linux系统里面部署运行项目的日志&#xff0c;日志内可以查看到运行和各种错误以及前后端交互传输的各种数据&#xff0c;…

12,攻防世界simple_php

simple_php 题目来源:Cyberpeace-n3k0 题目描述: 小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 进入靶场 这段PHP代码是一个简单的web应用示例&#xff0c;让我们逐步分析这段代码&#xff1a; show_source(__FILE__);&#xff1a;这行代码会显示当前文件的…

Webpack Tree Shaking 技术原理及应用实战,优化代码,精简产物

前言 在前端开发中&#xff0c;优化代码体积和提升应用性能是至关重要的课题。Webpack 提供了多种优化手段来帮助开发者实现这一目标&#xff0c;Tree Shaking 就是其中一种非常重要的优化技术&#xff0c;它通过在编译阶段移除未被使用的代码模块&#xff0c;从而显著减小最终…

5G CPE核心器件-基带处理器(三)

5G CPE 核心器件 -5G基带芯片 基带芯片简介基带芯片组成与结构技术特点与发展趋势5G基带芯片是5G CPE中最核心的组件,负责接入5G网络,并进行上下行数据业务传输。移动通信从1G发展到5G,终端形态产生了极大的变化,在集成度、功耗、性能等方面都取得巨大的提升。 基带芯片简…

SpringBoot高级-底层原理

目录 1 SpringBoot自动化配置原理 01-SpringBoot2高级-starter依赖管理机制 02-SpringBoot2高级-自动化配置初体验 03-SpringBoot2高级-底层原理-Configuration配置注解 04-SpringBoot2高级-底层原理-Import注解使用1 05-SpringBoot2高级-底层原理-Import注解使用2 06-S…

ES常见问题汇总

ES常见问题汇总 1.Es的作用&#xff08;elasticsearch&#xff09; 作用&#xff1a; elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 ELK技术栈 elasticsearch结合kibana、Logstash&…

linux环境宝塔服务部署安装及介绍

一、简介 宝塔面板是一款服务器管理软件&#xff0c;支持windows和linux系统&#xff0c;可以通过Web端轻松管理服务器&#xff0c;提升运维效率。例如&#xff1a;创建管理网站、FTP、数据库&#xff0c;拥有可视化文件管理器&#xff0c;可视化软件管理器&#xff0c;可视化C…

ONES 功能上新|ONES Project 甘特图再度升级

ONES Project 甘特图支持展示工作项标题、进度百分比、依赖关系延迟时间等信息。 应用场景&#xff1a; 在使用甘特图规划项目任务、编排项目计划时&#xff0c;可以对甘特图区域进行配置&#xff0c;展示工作项的工作项标题、进度百分比以及依赖关系延迟时间等维度&#xff0c…

跨域请求限制的通俗解释

什么是跨域 想象一下&#xff0c;每个网站就像一个独立的小国家&#xff0c;有自己的边界&#xff08;域名&#xff09;。比如&#xff0c;https://example1.com是一个国家&#xff0c;https://example2.com是另一个国家。浏览器就像是这些国家之间的海关&#xff0c;它会检查从…

javascript删除对象属性

1、操作符 delete object.property const obj {age: 19,name: hanmeimei, } delete obj.age2、Reflect.deleteProperty(object, propertyKey) 还会返回布尔值 const obj {age: 19,name: hanmeimei, } Reflect.deleteProperty(obj, name)

Linux 查看系统资源常用命令

目录 Linux 查看系统资源常用命令 一、top 二、htop 三、vmstat 四、iostat 五、mpstat 六、free 七、sar 八、ps 九、pstree 十、lsof 十一、uptime 十二、dmesg 十三、dmidecode 十四、lsblk 十五、blkid 十六、fdisk -l 十七、parted -l 十八、df -h 十…

【text2sql】低资源场景下Text2SQL方法

SFT使模型能够遵循输入指令并根据预定义模板进行思考和响应。如上图&#xff0c;、 和 是用于通知模型在推理过程中响应角色的角色标签。 后面的内容表示模型需要遵循的指令&#xff0c;而 后面的内容传达了当前用户对模型的需求。 后面的内容代表模型的预期输出&#xff0c;也…