SpringBoot 实战 (九) | 整合 Mybatis

2024-04-27 12:48

本文主要是介绍SpringBoot 实战 (九) | 整合 Mybatis,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

微信公众号:一个优秀的废人
如有问题或建议,请后台留言,我会尽力解决你的问题。

前言

如题,今天介绍 SpringBoot 与 Mybatis 的整合以及 Mybatis 的使用,本文通过注解的形式实现。

什么是 Mybatis

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生 Map 使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

优点:

  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个 jar 文件+配置几个 sql 映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
  • 灵活:mybatis 不会对应用程序或者数据库的现有设计强加任何影响。 sql 写在 xml 里,便于统一管理和优化。通过 sql 基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
  • 解除 sql 与程序代码的耦合:通过提供 DAL 层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql 和代码的分离,提高了可维护性。
  • 提供映射标签,支持对象与数据库的 orm 字段关系映射
  • 提供对象关系映射标签,支持对象关系组建维护
  • 提供xml标签,支持编写动态 sql。

缺点:

  • 编写 SQL 语句时工作量很大,尤其是字段多、关联表多时,更是如此。
  • SQL 语句依赖于数据库,导致数据库移植性差,不能更换数据库。
  • 框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
  • 二级缓存机制不佳
准备工作
  • IDEA
  • JDK1.8
  • SpringBoot 2.1.3

sql 语句,创建表,插入数据:

CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL,`age` double DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `student` VALUES ('1', 'aaa', '21');
INSERT INTO `student` VALUES ('2', 'bbb', '22');
INSERT INTO `student` VALUES ('3', 'ccc', '23');
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>2.1.3.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.nasus</groupId><artifactId>mybatis</artifactId><version>0.0.1-SNAPSHOT</version><name>mybatis</name><description>mybatis Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><!-- 启动 web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- mybatis 依赖 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.0</version></dependency><!-- mysql 连接类 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- druid 数据库连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.9</version></dependency><!-- lombok 插件 用于简化实体代码 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- 单元测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.hibernate.javax.persistence</groupId><artifactId>hibernate-jpa-2.1-api</artifactId><version>1.0.0.Final</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
application.yaml 配置文件
spring:datasource:url: jdbc:mysql://localhost:3306/testusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver
实体类
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {@Id@GeneratedValueprivate Integer id;private String name;private Integer age;}

使用了 lombok 简化了代码。

dao 层
import com.nasus.mybatis.domain.Student;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;@Mapper
public interface StudentMapper {@Insert("insert into student(name, age) values(#{name}, #{age})")int add(Student student);@Update("update student set name = #{name}, age = #{age} where id = #{id}")int update(@Param("name") String name, @Param("age") Integer age, @Param("id") Integer id);@Delete("delete from student where id = #{id}")int delete(int id);@Select("select id, name as name, age as age from student where id = #{id}")Student findStudentById(@Param("id") Integer id);@Select("select id, name as name, age as age from student")List<Student> findStudentList();
}

这里有必要解释一下,@Insert 、@Update、@Delete、@Select 这些注解中的每一个代表了执行的真实 SQL。 它们每一个都使用字符串数组 (或单独的字符串)。如果传递的是字符串数组,它们由每个分隔它们的单独空间串联起来。这就当用 Java 代码构建 SQL 时避免了“丢失空间”的问题。 然而,如果你喜欢,也欢迎你串联单独 的字符串。属性:value,这是字符串 数组用来组成单独的 SQL 语句。

@Param 如果你的映射方法的形参有多个,这个注解使用在映射方法的参数上就能为它们取自定义名字。若不给出自定义名字,多参数(不包括 RowBounds 参数)则先以 “param” 作前缀,再加上它们的参数位置作为参数别名。例如 #{param1},#{param2},这个是默认值。如果注解是 @Param(“id”),那么参数就会被命名为 #{id}。

service 层
import com.nasus.mybatis.domain.Student;
import java.util.List;public interface StudentService {int add(Student student);int update(String name, Integer age, Integer id);int delete(Integer id);Student findStudentById(Integer id);List<Student> findStudentList();}

实现类:

import com.nasus.mybatis.dao.StudentMapper;
import com.nasus.mybatis.domain.Student;
import com.nasus.mybatis.service.StudentService;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class StudentServiceImpl implements StudentService {@Autowiredprivate StudentMapper studentMapper;/*** 添加 Student* @param name* @param age* @return*/@Overridepublic int add(Student student) {return studentMapper.add(student);}/*** 更新 Student* @param name* @param age* @param id* @return*/@Overridepublic int update(String name, Integer age, Integer id) {return studentMapper.update(name,age,id);}/*** 删除 Student* @param id* @return*/@Overridepublic int delete(Integer id) {return studentMapper.delete(id);}/*** 根据 id 查询 Student* @param id* @return*/@Overridepublic Student findStudentById(Integer id) {return studentMapper.findStudentById(id);}/*** 查询所有的 Student* @return*/@Overridepublic List<Student> findStudentList() {return studentMapper.findStudentList();}
}
controller 层构建 restful API
import com.nasus.mybatis.domain.Student;
import com.nasus.mybatis.service.StudentService;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/Student")
public class StudentController {@Autowiredprivate StudentService studentService;@PostMapping("")public int add(@RequestBody Student student){return studentService.add(student);}@PutMapping("/{id}")public int updateStudent(@PathVariable("id") Integer id, @RequestParam(value = "name", required = true) String name,@RequestParam(value = "age", required = true) Integer age){return studentService.update(name,age,id);}@DeleteMapping("/{id}")public void deleteStudent(@PathVariable("id") Integer id){studentService.delete(id);}@GetMapping("/{id}")public Student findStudentById(@PathVariable("id") Integer id){return studentService.findStudentById(id);}@GetMapping("/list")public List<Student> findStudentList(){return studentService.findStudentList();}
}
测试结果

查询全部学生信息结果

其他接口已通过 postman 测试,无问题。

源码下载:github 地址

后语

以上为 SpringBoot 实战 (九) | 整合 Mybatis 的教程,除了注解方式实现以外,Mybatis 还提供了 XML 方式实现。想了解更多用法请移步官方文档。

最后,对 Python 、Java 感兴趣请长按二维码关注一波,我会努力带给你们价值,如果觉得本文对你哪怕有一丁点帮助,请帮忙点好看,让更多人知道。

另外,关注之后在发送 1024 可领取免费学习资料。资料内容详情请看这篇旧文:Python、C++、Java、Linux、Go、前端、算法资料分享

这篇关于SpringBoot 实战 (九) | 整合 Mybatis的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/940543

相关文章

springboot+vue+mybatis基于协同过滤算法的新闻推荐系统+PPT+论文+讲解+售后

本系统为用户而设计制作新闻推荐系统,旨在实现新闻推荐智能化、现代化管理。本新闻推荐管理自动化系统的开发和研制的最终目的是将新闻推荐管理的运作模式从手工记录数据转变为网络信息查询管理,从而为现代管理人员的使用提供更多的便利和条件。使新闻推荐系统数字化、智能化,是提高工作效率的重要举措。 为了更好地发挥本系统的技术优势,根据新闻推荐系统的需求,本文尝试以B/S经典设计模式中的Spring Boot框

深度解析 Spring 源码:揭秘 AbstractAutowireCapableBeanFactory 的 Bean 生命周期处理

文章目录 一、AbstractAutowireCapableBeanFactory 概述1.1 详细分析1.2 设计思想 二、深入解析AbstractAutowireCapableBeanFactory 的实现细节2.1 Bean 实例化过程分析2.1.1 createBean()2.1.2 createBeanInstance() 2.2 Bean 属性注入的实现机制2.2.1 pop

微服务架构与Spring Cloud

1 微服务架构 1.1 微服务架构概述         微服务架构(Microservice Architecture, MSA)是一种新型的服务端架构设计方案,通过将应用程序拆分成多个小型、自治的服务,实现了服务的松耦合和快速迭代。         微服务架构特征主要包括以下几个方面:         1、基于服务的分布式架构:微服务架构将应用程序拆分成多个服务,每个服务负责一个小部

【Kotlin】Java三目运算转成 kotlin 表达

这行代码会直接计算 array.size == 1 的布尔值,并将其赋值给 result。在 Kotlin 中,不需要使用三元操作符,因为条件表达式本身就返回一个布尔值 java 中三木运算: int [] array = new int[]{1, 2, 3, 4, 5}; boolean test = array >1 true :false; 在 Kotlin 中,你可以使用类似的表达式来

Kotlin学习积累第3天,Kotlin和Java一些语法的比较(持续总结......)

不同KotlinJava数据类型转换 eg:字符串类型转整型          var x="10"          var s=x.toInt() eg:字符串类型转整型          String x="10";          int s=Integer.parseInt(x); 方法声明fun name(){}void name(){}构造函数通过constructor进行构造构

spring boot 利用配置文件,实现数据动态注入

目录 准备工作   方式1:@value 方式2:批量为属性赋值(禁止大写) 整合指定配置文件 @PropertySources  准备工作  首先在yml文件中,手动添加测试数据  方式1:@value 使用@Value("${}")注解来获取,spel表达式 说明:当spring容器启动时,会加载yml文件,动态实现数据封装,解析到@Value注解的时候,会根据

eclipse配置了mybatis的dtd文件,mapper.xml依然不会自动提示的问题

目录 1,正确配置 2,为什么你配置了dtd文件,依然不生效? 1,xml文件不全 1,正确配置 如图: 有人说这里的keytype要对应着写 比如你选的public ID    那你的key就要写成 -//mybatis.org//DTD Mapper 3.0//EN 比如你选的URI    那你的key就要写成 http://mybatis.org/dtd/myb

MyBatis框架基础在eclipse中使用的最全教程

它封装了JDBC操作的繁琐操作,对JDBC进行了封装,它相比传统的JDBC访问数据库,性能更加优异,具有高度的灵活性、可优化性和易于维护等特点,我们只需要关注 sql语句本身, 而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。 配置MyBatis 下载MyBatis包,下载地址https://github.com/mybatis/mybatis-3/r

at org.apache.jsp.index_jsp._jspInit(index_jsp.java:23)

at org.apache.jsp.index_jsp._jspInit(index_jsp.java:23) 环境:Tomcat6 + jdk6 Tomcat服务启动成功,但访问index.jsp出错,Tomcat报错如下: 严重: Servlet.service() for servlet jsp threw exception java.lang.NullPointerEx

SpringBoot框架如何接入RocketMQ?

目录 一、SpringBoot框架介绍 二、RocketMQ介绍 三、RocketMQ的应用场景 四、SpringBoot框架如何接入RocketMQ 一、SpringBoot框架介绍 Spring Boot是一个开源的Java框架,它基于Spring框架,旨在简化Java应用程序的开发。Spring Boot通过自动化配置和约定优于配置的原则,大幅减少了开发者在搭建和配置Ja