Spring同时集成JPA与Mybatis

Spring同时集成JPA与Mybatis

目录

Spring同时集成JPA与Mybatis

ORM

Spring ORM

Spring ORM 同时集成JPA与Mybatis

一、创建一个SpringBoot项目

二、建立用户信息登记表

三、Web应用项目集成mysql

四、添加Spring Data JPA和Mybatis依赖

五、添加数据表映射实体类

六、创建数据接口层

6.1 声明JPA接口

6.2 声明MyBatis接口

七、创建业务服务层

八、创建控制器

九、设计视图模板

9.1 设计一个用户列表的视图模板

9.2 设计一个提交用户信息的表单模板

9.3 设计一个用户模糊查找页面模板

十、运行应用

10.1用户列表

10.2增加用户

10.3查找用户


 

 

 

本文章向大家介绍Spring同时集成JPA与Mybatis,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

 

 

 

ORM

  • ORM的出现,使得关系型数据库映射成了对象;简单来说,有了ORM之后,JAVA程序员从面向JDBC编程转化成面向JAVA对象编程。

Spring ORM

  • Spring对ORM的解决方案主要体现在以下方面:
    1. 统一的资源管理方式与异常管理:Spring使用各种ORM框架,资源管理及使用方式都是统一的;同时Spring会将各个ORM框架的异常转译到Spring异常体系下。
    2. 统一的事务管理:Spring通过IoC和AOP技术,形成了事务管理抽象层,接管了各种ORM框架下的数据访问的事务管理。
  • 随着版本的升级,Spring核心包中对ORM的各种解决方案也越来越精炼。本文我们重点将介绍同时集成Spring Data JPA和Mybatis两个ORM框架。

Spring ORM 同时集成JPA与Mybatis

  • 在同一个项目中一般只会单独集成Spring Data JPA,或者单独集成Mybatis。但两者也可以混合使用(一般没这个必要),本文为了更加深入探索Spring ,将通过一个DEMO应用两者的并展示相似点与不同之处。

一、创建一个SpringBoot项目

  1. 在IntelliJ IDEA中创建新项目
  1. 通过地址https://start.spring.io/初始化项目;
  1. 指定项目通用信息:
  1. 选择项目依赖Starter:
  1. 生成的项目结构:

二、建立用户信息登记表

  • 根据用户信息模型类,设计用户信息登录表
DROP DATABASE IF EXISTS user_info;CREATE DATABASE user_infoDEFAULT CHARACTER SET utf8DEFAULT COLLATE utf8_general_ci;use user_info;SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;

三、Web应用项目集成mysql

  • 增加依赖
 <!--Mysql依赖包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version><scope>runtime</scope></dependency><!-- 数据库连接池:druid数据源驱动 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version></dependency>
  • Spring数据源配置
###数据源配置
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourceusername: rootpassword: rootdriver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpyurl: jdbc:log4jdbc:mysql://localhost:3306/user_info?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true

四、添加Spring Data JPA和Mybatis依赖

<!--pom.xml--><!--Spring Data JPA--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- mybatis --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version></dependency>

五、添加数据表映射实体类

/*** 用户类--映射表user** @author zhuhuix*/
@Entity
@Table(name="user_info")
public class User implements Serializable {// 用户id@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;// 用户名@NotBlank(message = "用户名称不能为空")@Column(name="name")private String name;// 邮箱@Column(name="email")@Pattern(message ="邮箱格式不符", regexp = "^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$")private String email;public User(Long id, String name, String email) {this.id = id;this.name = name;this.email = email;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}
}

六、创建数据接口层

6.1 声明JPA接口

  • 借助Spring Data JPA,我们可以通过继承CrudRepository接口,快速定义应用的数据层。CrudRepository定义并实现了很多用于crud(创建、读取、更新、删除)操作的方法,我们根本就不用编写实现类!当应用启动的时候,Spring Data JPA会在运行期自动生成实现类。
/*** 基于SpringMVC框架开发web应用--数据操作层*/
public interface UserRepository extends CrudRepository<User,Long> {}
  • CrudRepository的一些默认实现
public interface CrudRepository<T, ID> extends Repository<T, ID> {<S extends T> S save(S var1);<S extends T> Iterable<S> saveAll(Iterable<S> var1);Optional<T> findById(ID var1);boolean existsById(ID var1);Iterable<T> findAll();Iterable<T> findAllById(Iterable<ID> var1);long count();void deleteById(ID var1);void delete(T var1);void deleteAll(Iterable<? extends T> var1);void deleteAll();
}

6.2 声明MyBatis接口

  • 虽然强大的Spring Data JPA已经帮我们封装了多种数据操作,但由于业务逻辑的复杂度及自定义 SQL的需求,我们仍然可以运用MyBatis框架完成ORM的处理。
/*** mybatis数据层接口**/
@Repository
public interface UserMapper {// 自定义添加通过用户名称模糊查找用户信息List<User> findByName(String name);}
  • Mybatis Mapper映射
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mybatis.UserMapper"><!-- 自定义模糊查找 SQL --><select id="findByName" resultType="com.example.demo.register.User">select * from user where name like concat('%',#{name},'%')</select></mapper>
  • Spring添加MyBatis配置 修改application.yml配置文件:定位mapper文件扫描路径
#MyBatis扫描mapper文件配置
mybatis:mapper-locations: classpath:mapper/*Mapper.xml
  • 在启动类里加上注解用于给出需要扫描的mapper文件路径
@SpringBootApplication
@MapperScan(basePackages = "com.example.demo.register")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

七、创建业务服务层

  • 创建UserService服务层直接调用由Spring Data JPA及Mybatis接口各自提供的数据操作方法,以实现用户信息的增删改查。
/*** 调用Spring Data JPA和Mybatis接口进行业务处理*/
@Service
public class UserService {// Spring Data JPA@Autowiredprivate UserRepository userRepository;// Mybatis@Autowiredprivate UserMapper userMapper;// 返回所有的用户public List<User> listUsers() {return (List<User>) userRepository.findAll();}// 保存用户public User saveUser(User user) {return userRepository.save(user);}// 删除用户public void deleteUser(Long id) {userRepository.deleteById(id);}// 查找用户public User findUser(Long id) {return userRepository.findById(id).get();}// 根据名称查找用户--Mybatispublic List<User> searchUser(String name) {return userMapper.findByName(name);}}

八、创建控制器

  • 控制器的主要职责是处理HTTP请求传递给视图以便于渲染浏览器展现。
  • SpirngMVC的请求注解

注解

描述

@RequestMapping

通用的请求

@GetMapping

处理HTTP GET请示

@PostMapping

处理HTTP POST请示

@PutMapping

处理HTTP PUT请示

@DeleteMapping

处理HTTP DELETE请示

/*** 用户控制器*/
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;// 保存用户并返回到用户列表页面@PostMappingpublic ModelAndView saveUser(@Valid User user, Errors errors, Model model) {if (errors.hasErrors()) {model.addAttribute("user", user);if (errors.getFieldError("name") != null) {model.addAttribute("nameError", errors.getFieldError("name").getDefaultMessage());}if (errors.getFieldError("email") != null) {model.addAttribute("emailError", errors.getFieldError("email").getDefaultMessage());}return new ModelAndView("register", "userModel", model);}userService.saveUser(user);//重定向到list页面return new ModelAndView("redirect:/user");}// 获取用户操作表单页面@GetMapping("/form")public ModelAndView createForm(Model model, @RequestParam(defaultValue = "0") Long id) {if (id > 0) {model.addAttribute("user", userService.findUser(id));} else {model.addAttribute("user", new User());}return new ModelAndView("register", "userModel", model);}// 获取用户列表显示页面@GetMappingpublic ModelAndView list(Model model) {model.addAttribute("userList", userService.listUsers());return new ModelAndView("userlist", "userModel", model);}// 模糊查找输入页面@GetMapping("/index")public ModelAndView index(Model model) {model.addAttribute("user", new User());return new ModelAndView("index", "userModel", model);}// 查找提交并跳转用户列表@PostMapping("/search")public ModelAndView search(@ModelAttribute User user, Model model) {model.addAttribute("userList", userService.searchUser(user.getName()));return new ModelAndView("userlist", "userModel", model);}// 删除用户@RequestMapping(path = "/del")public ModelAndView del(@RequestParam(name = "id") Long id) {userService.deleteUser(id);return new ModelAndView("redirect:/user");}
}

九、设计视图模板

9.1 设计一个用户列表的视图模板

  • Thymeleaf提供了一个属性th:each,它会迭代一个元素集合,为集合中的每个条目渲染HTML,我们可以利用这个属性,设计出用户的列表视图。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"xmlns:layout="http://www.ultrag.net.nz/thymeleaf/layout"
>
<head><meta charset="UTF-8">
</head>
<body>
<h3>用户列表</h3>
<div><a th:href="@{/user/form}">创建用户</a><a th:href="@{/user/index}">查找用户</a>
</div>
<table border="1"><thead><tr><td>ID</td><td>邮箱</td><td>名称</td><td>操作</td></tr></thead><tbody><tr th:if="${userModel.userList.size()} eq 0"><td colspan="3">没有用户信息!</td></tr><tr th:each="user:${userModel.userList}"><td th:text="${user.id}"></td><td th:text="${user.email}"></td><td th:text="${user.name}"></td><td><a th:href="@{/user/form(id=${user.id})}"> 修改 </a> <a th:href="@{/user/del(id=${user.id})}"> 删除 </a></td></tr></tbody>
</table>
</body>
</html>

9.2 设计一个提交用户信息的表单模板

  • 用户通过这个视图,录入名称与邮箱地址,提交保存新用户的信息。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"xmlns:layout="http://www.ultrag.net.nz/thymeleaf/layout"
>
<head><meta charset="UTF-8">
</head>
<body>
<h3>登记用户</h3>
<form action="/users" th:action="@{/user}" method="POST" th:object="${userModel.user}"><input type="hidden" name="id" th:value="*{id}">名称:<br><input type="text" name="name" th:value="*{name}"><br>邮箱:<br><input type="text" name="email" th:value="*{email}"><input type="submit" value="提交" >
</form>
</body>
</html>

9.3 设计一个用户模糊查找页面模板

<!-- index.html-->
<!DOCTYPE html>
<html  xmlns:th="http://www.thymeleaf.org" >
<head><meta charset="UTF-8"/><title>Title</title>
</head><body><h3>查找用户</h3><form action="/users" th:action="@{/user/search}" method="POST" th:object="${userModel.user}">名称:<br><input type="text" name="name" th:value="*{name}" ><br><input type="submit" value="查询" ></form></body></html>

十、运行应用

  • 到目前为止,我们已经开发了User用户类、JPA数据接口、Mybatis数据接口、UserService用户服务类、UserController控制器、用户列表视图模板、用户登记视图模板、用户模糊查找页面模板,接下来我们尝试启动程序,并进行操作测试。

10.1用户列表

10.2增加用户

  • 点击页面上的创建用户,登记新用户,并提交

10.3查找用户

该web应用一切运行正常。

 

 

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

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

相关文章

m3u8,一个超酷的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超酷的 Python 库 - m3u8。 Github地址&#xff1a;https://github.com/globocom/m3u8 在网络视频传输中&#xff0c;HLS&#xff08;HTTP Live Streaming&#xff09;是一…

2.vscode 配置python开发环境

vscode用着习惯了,也不想再装别的ide 1.安装vscode 这一步默认已完成 2.安装插件 搜索插件安装 3.选择调试器 Ctrl Shift P&#xff08;或F1&#xff09;&#xff0c;在打开的输入框中输入 Python: Select Interpreter 搜索&#xff0c;选择 Python 解析器 选择自己安…

LeetCode 567. 字符串的排列

解题思路 滑动窗口的经典例题&#xff0c;直接套模板。 相关代码 class Solution {int hash1[] new int[26];int hash2[] new int[26];public boolean checkInclusion(String s1, String s2) { for(int i0;i<s1.length();i) hash1[s1.charAt(i)-a];char a[] s2.toC…

科研绘图一:箱线图(添加贝赛尔曲线)

R语言绘图系列—箱线图贝赛尔曲线 &#xff08;一&#xff09;: 科研绘图一&#xff1a;箱线图&#xff08;添加贝赛尔曲线&#xff09; 文章目录 R语言绘图系列---箱线图贝赛尔曲线&#xff08;一&#xff09;: 科研绘图一&#xff1a;箱线图&#xff08;添加贝赛尔曲线&…

Linux安装HBase的详细教程及常用方法

Linux安装HBase的详细教程及常用方法如下&#xff1a; 确保已安装Java环境 在Linux上安装HBase之前&#xff0c;首先确保已正确安装了Java环境。使用以下命令检查Java是否已安装&#xff1a; java -version如果Java没有安装&#xff0c;请先安装Java环境。 下载HBase 前往HBas…

plt保存PDF矢量文件中嵌入可编辑字体(可illustrator编辑)

背景&#xff1a; 用默认 plt.savefig() 保存图片&#xff0c;图中文字是以瞄点保存&#xff0c;而不是以文字格式。在编辑矢量图中&#xff0c;无法调整文字大小和字体。 方法&#xff1a; import matplotlib.pyplot as plt import numpy as np# ------输出的图片为illustr…

TMS与WMS:物流领域的双璧,差异与互补

在现代物流领域,运输管理系统(TMS)和仓库管理系统(WMS)是两大核心系统,它们各自扮演着不同的角色,共同推动着物流运作的高效与精准。本文将深入探讨TMS与WMS之间的区别,以及它们如何协同工作,为物流行业带来更大的价值。 一、TMS与WMS:定义与功能之异 TMS,即运输管…

基于Springboot和Redis实现的在线选课系统

1.项目简介 1.1 介绍 毕业设计真的就是demo吗&#xff1f;作为工作前的最后一个校园项目&#xff0c;毕业设计应当尽可能的贴近企业实战&#xff0c;业务不必很复杂&#xff0c;但要做到麻雀虽小五脏俱全。本期学长跟大家一起分享如何开发一个在线选课系统&#xff0c;需求也…

2.二进制的方式读写文件

文章目录 写入文件代码运行结果 读出文件代码运行结果 文件打开模式标记&#xff08;查表&#xff09; 写入文件 ------写文件一共五步&#xff1a;------ 第一步&#xff1a;包含头文件 第二步&#xff1a;创建流对象 第三步&#xff1a;指定方式打开文件 第四步&#xff1a;…

通过路由器监控,优化网络效率

路由器是网络的基本连接组件&#xff0c;路由器监控涉及将路由器网络作为一个整体进行管理&#xff0c;其中持续监控路由器的性能、运行状况、安全性和可用性&#xff0c;以确保更好的操作和最短的停机时间&#xff0c;因此监控路由器至关重要。 为什么路由器监控对组织很重要…

Oracle19c静默部署

Oracle19c静默部署文档 下载地址 https://www.oracle.com/database/technologies/oracle-database-software-downloads.html#db_free 一、系统基础配置 1、创建用户和用户组 # 创建oinstall和dba用户组 groupadd oinstall groupadd dba# 创建Oracle用户 useradd -g oinstall…

C语言中,基本数据类型介绍

C语言当中各种数据类型的大小&#xff0c;首先要了解有哪些数据类型。 一 字符型&#xff1a; 整数&#xff08;字符&#xff09;类型存储大小值范围char1 字节-128 到 127 或 0 到 255&#xff08;2的8次方&#xff09;unsigned char1 字节0 到 255&#xff08;&#xff09;s…

前端框架的发展史介绍框架特点

目录 1.前端框架的发展历程 2.官网、优缺点、使用场景 2.1 jQuery 2.2 AngularJS 2.3 React 2.4 Vue.js 2.5 Angular 1.前端框架的发展历程 jQuery&#xff08;2006年&#xff09;&#xff1a;jQuery是一个非常流行的JavaScript库&#xff0c;用于简化DOM操作和事件处理…

Java面向对象编程(高级)一

在Java中&#xff0c;面向对象编程更是核心设计理念之一&#xff0c;为开发者提供了丰富的工具和特性来创建灵活、可扩展的应用程序。 本博客将深入探讨Java面向对象编程的高级特性&#xff0c;包括但不限于多态、继承、封装、抽象类、接口等方面的内容。我们将从实际案例出发…

C语言从入门到熟悉------第六阶段

头文件 程序是如何编译生成可执行文件的 在编写程序时&#xff0c;可以将所有程序都放在一个.c文件中&#xff0c;然后通过编译器将这个.c文件编译成.obj目标文件。obj就是object的缩写&#xff0c;即“目标”的意思。一个.obj文件就是一个编译单元。一个程序可以由一个编译单…

【数据库】基础操作

系列文章目录 &#x1f308;座右铭&#x1f308;&#xff1a;人的一生这么长、你凭什么用短短的几年去衡量自己的一生&#xff01; &#x1f495;个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C,自顶向下看Java-CSDN博客 ❤️相关文章❤️&#xff1a;清灵白羽 漾情天…

【Qt问题】vs里直接打开qt项目的ui会崩溃

问题描述&#xff1a; 当我用VS2019开发Qt的时候&#xff0c;在VS编译器里要用到Qt的ui设计&#xff0c;但是双击打开发现直接就崩溃了。 解决办法&#xff1a; 崩溃的原因很简单&#xff0c;是因为VS默认用的qt designer打开&#xff0c;所以会崩溃&#xff0c;我们右键单击…

4001 - 【基础】畅通工程

时间限制 : 1 秒 内存限制 : 128 MB 某市调查城镇交通状况,得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府 "村村通工程" 的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要相互之间可达即可)。请你计算出最少还…

LeetCode 新的开始day1

LeetCode 新的开始day1 嗨嗨嗨。。。一个期末加春节&#xff0c;直接给我干颓废了&#xff0c;导致算法之旅被打乱&#xff0c;现在也是准备另起灶炉&#xff0c;好好学习一下了&#xff08;虽然因为服务外包比赛这两个月挺消耗精力的&#xff0c;不够我还是打算抽点时间来算法…

Android中的设计模式---单例模式

1.什么是单例模式? 单例模式是一种创建型设计模式。它保证一个类只有一个实例,并且这个单例类提供一个函数接口让其他类获取到这个唯一的实例。 2.什么情况下会用到单例? ①频繁访问数据库或文件的对象; ②工具类对象; ③创建对象时耗时过多或耗费资源过多,但又经常用…