技术:Java-Web基础|MyBatis整合到SpringBoot(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 上一篇简单介绍了下MyBatis,知道并了解什么是MyBatis,MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。


1 引言

上一篇简单介绍了下MyBatis,知道并了解什么是MyBatis,MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。


具体详细可以参考这里,【技术:Java-Web基础|MyBatis(一)】。


这一章节,我们实际手操一下,看下MyBatis是如何工作的。虽然比较早期的一些技术,作为了解就可以了。我们现在基本上都是使用MyBatis-Plus来操作。


2 MyBatis实操

这一章节是MyBatis整合到SpringBoot,实现CURD。


2.1 创建实验项目

这里,我们使用IDEA创建一个项目,创建一个名称为tool-mybatis的项目。创建项目的结构如下,我这里是父子项目,将项目放在了tool-demo模块下,如果只需要查看MyBatis,只需要创建这个就好。其中蓝色部分为默认初始化项目结构,后续黑色为新增。

├── tool-mybatis

├── doc

│   └── mybatis.sql

├── pom.xml

├── src

│   ├── main

│   │   ├── java

│   │   │   └── com

│   │   │       └── liu

│   │   │           ├── ToolMybatisApplication.java

│   │   │           └── mybatis

│   │   │               ├── BizTempController.java

│   │   │               ├── domain

│   │   │               │   └── BizTemp.java

│   │   │               ├── mapper

│   │   │               │   └── BizTempMapper.java

│   │   │               └── service

│   │   │                   ├── BizTempService.java

│   │   │                   └── impl

│   │   │                       └── BizTempServiceImpl.java

│   │   └── resources

│   │       ├── application.yml

│   │       ├── com.liu.mybatis.mapper

│   │       │   └── BizTempMapper.xml


2.2 创建实验表

这里我创建一张表,名称为`biz_temp`,创建表结构脚本如下,最后新增两条数据进去(实验的表,我放在上面结构的doc文件夹中):

REATE TABLE `biz_temp` (      `id` int(11)NOTNULL AUTO_INCREMENT,      `sn` varchar(32)NOTNULL COMMENT '流水号',      `operator` varchar(32)NOTNULL COMMENT '办理人',      `operator_phone` varchar(32)NOTNULL COMMENT '办理人手机号码',      `operator_desc` varchar(1000)NOTNULL COMMENT '处理详情',      `operator_time` datetime DEFAULT NULL COMMENT '处理时间',      `created_by` varchar(32) DEFAULT NULL COMMENT '创建人',      `created_time` datetime DEFAULT NULL COMMENT '创建时间',      `updated_by` varchar(32) DEFAULT NULL COMMENT '更新人',      `updated_time` datetime DEFAULT NULL COMMENT '更新时间',      PRIMARY KEY (`id`) USING BTREE,      KEY `ids_sn` (`sn`),      KEY `ids_operator` (`operator`),      KEY `ids_submit_time` (`operator_time`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='临时业务异常信息';INSERTINTO `biz_temp`(`id`, `sn`, `operator`, `operator_phone`, `operator_desc`, `operator_time`, `created_by`, `created_time`, `updated_by`, `updated_time`)VALUES(1,'0ed704749be211eab558c739c840e6c0','张三','13800138999','同意',NULL,NULL,NULL,NULL,NULL);INSERTINTO `biz_temp`(`id`, `sn`, `operator`, `operator_phone`, `operator_desc`, `operator_time`, `created_by`, `created_time`, `updated_by`, `updated_time`)VALUES(2,'2700553c9be211eab558c739c840e6c0','李四','13800138888','同意',NULL,NULL,NULL,NULL,NULL);

查看创建表,插入的数据

image.png


2.3 引入maven依赖

想要使用MyBatis,那么我们得引入Mabatis的依赖。当前我们使用包管理器Maven来引入依赖,Maven的依赖如下:

<dependencies><!-- SpringBoot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring-boot.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><version>${spring-boot.version}</version></dependency><!-- MyBatis SpringBoot --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis-springboot.version}</version></dependency><!-- MySQL --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql-jdbc.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId><version>${spring-boot.version}</version></dependency></dependencies>


2.4 创建实体关系

创建实体类BizTemp.java

packagecom.liu.mybatis.domain;
importorg.apache.commons.lang3.builder.ToStringBuilder;
importjava.io.Serializable;
importjava.util.Date;
/*** <p> BizTemp </p>** @author Aion.Liu* @version v1.0.0* @description TODO* @since 2022/9/3 22:39*/publicclassBizTempimplementsSerializable {
publicLongid;
publicStringsn;
publicStringoperator;
publicStringoperatorPhone;
publicStringoperatorDesc;
publicDateoperatorTime;
publicStringcreatedBy;
publicDatecreatedTime;
publicStringupdatedBy;
publicDateupdatedTime;
publicLonggetId() {
returnid;
    }
publicvoidsetId(Longid) {
this.id=id;
    }
publicStringgetSn() {
returnsn;
    }
publicvoidsetSn(Stringsn) {
this.sn=sn;
    }
publicStringgetOperator() {
returnoperator;
    }
publicvoidsetOperator(Stringoperator) {
this.operator=operator;
    }
publicStringgetOperatorPhone() {
returnoperatorPhone;
    }
publicvoidsetOperatorPhone(StringoperatorPhone) {
this.operatorPhone=operatorPhone;
    }
publicStringgetOperatorDesc() {
returnoperatorDesc;
    }
publicvoidsetOperatorDesc(StringoperatorDesc) {
this.operatorDesc=operatorDesc;
    }
publicStringgetCreatedBy() {
returncreatedBy;
    }
publicvoidsetCreatedBy(StringcreatedBy) {
this.createdBy=createdBy;
    }
publicDategetOperatorTime() {
returnoperatorTime;
    }
publicvoidsetOperatorTime(DateoperatorTime) {
this.operatorTime=operatorTime;
    }
publicStringgetUpdatedBy() {
returnupdatedBy;
    }
publicvoidsetUpdatedBy(StringupdatedBy) {
this.updatedBy=updatedBy;
    }
publicDategetUpdatedTime() {
returnupdatedTime;
    }
publicvoidsetUpdatedTime(DateupdatedTime) {
this.updatedTime=updatedTime;
    }
publicDategetCreatedTime() {
returncreatedTime;
    }
publicvoidsetCreatedTime(DatecreatedTime) {
this.createdTime=createdTime;
    }
@OverridepublicStringtoString() {
returnnewToStringBuilder(this)
                .append("id", id)
                .append("sn", sn)
                .append("operator", operator)
                .append("operatorPhone", operatorPhone)
                .append("operatorDesc", operatorDesc)
                .append("operatorTime", operatorTime)
                .append("createdBy", createdBy)
                .append("createdTime", createdTime)
                .append("updatedBy", updatedBy)
                .append("updatedTime", updatedTime)
                .toString();
    }
}


2.4 创建服务类

创建服务类,用于业务处理BizTempService.java

packagecom.liu.mybatis.service;
importcom.liu.mybatis.domain.BizTemp;
importjava.util.List;
/*** <p> BizService </p>** @author Aion.Liu* @version v1.0.0* @description TODO* @since 2022/9/3 22:43*/publicinterfaceBizTempService {
List<BizTemp>findAll();
voidsaveBizTemp(BizTempuser);
voidupdateBizTemp(BizTempuser);
voiddeleteBizTemp(Integerid);
List<BizTemp>findBizTempBySn(Stringsn);
intgetTotal();
BizTempfindBizTempById(intid);
}


创建服务类,用于业务处理BizTempServiceImpl.java

packagecom.liu.mybatis.service.impl;
importcom.liu.mybatis.domain.BizTemp;
importcom.liu.mybatis.mapper.BizTempMapper;
importcom.liu.mybatis.service.BizTempService;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Service;
importjava.util.List;
/*** <p> BizServiceImpl </p>** @author Aion.Liu* @version v1.0.0* @description TODO* @since 2022/9/3 22:44*/@ServicepublicclassBizTempServiceImplimplementsBizTempService {
@AutowiredpublicBizTempMapperbizTempMapper;
@OverridepublicList<BizTemp>findAll() {
returnbizTempMapper.findAll();
    }
@OverridepublicvoidsaveBizTemp(BizTempbizTemp) {
bizTempMapper.saveBizTemp(bizTemp);
    }
@OverridepublicvoidupdateBizTemp(BizTempbizTemp) {
bizTempMapper.updateBizTemp(bizTemp);
    }
@OverridepublicvoiddeleteBizTemp(Integerid) {
bizTempMapper.deleteBizTemp(id);
    }
@OverridepublicList<BizTemp>findBizTempBySn(Stringsn) {
returnbizTempMapper.findBizTempBySn(sn);
    }
@OverridepublicintgetTotal() {
returnbizTempMapper.getTotal();
    }
@OverridepublicBizTempfindBizTempById(intid) {
returnbizTempMapper.findBizTempById(id);
    }
}


2.6 创建数据库连接业务接口

业务接口主要是映射xml文件,BizTempMapper.java

packagecom.liu.mybatis.mapper;
importcom.liu.mybatis.domain.BizTemp;
importorg.apache.ibatis.annotations.Mapper;
importjava.util.List;
/*** <p> BizService </p>** @author Aion.Liu* @version v1.0.0* @description TODO* @since 2022/9/3 22:43*/publicinterfaceBizTempMapper {
List<BizTemp>findAll();
voidsaveBizTemp(BizTempuser);
voidupdateBizTemp(BizTempuser);
voiddeleteBizTemp(Integerid);
List<BizTemp>findBizTempBySn(Stringsn);
intgetTotal();
BizTempfindBizTempById(intid);
}


数据库操作XML,BizTempMapper.xml

<?xmlversion="1.0" encoding="UTF-8"?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--会以namespace 和 id 在mapper 中查询具体的方法resultType 表示返回对象的数据类型parameterType 表示传入的数据对象id  唯一标识,要与命名空间(抽象方法)中定义的方法名称一致最主要的目的是:防止接口ID重名--><mappernamespace="com.liu.mybatis.mapper.BizTempMapper"><!-- id,在文件中唯一的标识,映射com.liu.mybatis.mapper.BizTempMapper中的方法 --><!-- resultType,返回的结果 --><selectid="findAll"resultType="com.liu.mybatis.domain.BizTemp">        select * from biz_temp;
</select><!-- parameterType,接收参数的类型 --><insertid="saveBizTemp"parameterType="com.liu.mybatis.domain.BizTemp"><!-- 将自增id存入biz_temp对象中 --><selectKeykeyColumn="id"resultType="int"order="AFTER"keyProperty="id">            select last_insert_id()
</selectKey>        insert into `biz_temp`
            (`sn`, `operator`, `operator_phone`, `operator_desc`, `operator_time`)
               values
            (#{sn}, #{operator}, #{operator_phone}, #{operator_desc}, #{operator_time})
</insert><updateid="updateBizTemp"parameterType="com.liu.mybatis.service.BizTempService">        update biz_temp set operator = #{operator} where id = #{id}
</update><selectid="findBizTempBySn"parameterType="String"resultType="BizTemp">        select * from biz_temp where sn like "%${sn}%"
</select><!-- resultType,返回结果类型,常量类型 --><selectid="getTotal"resultType="int">        select count(*) from biz_temp
</select><deleteid="deleteBizTemp"parameterType="int">        delete from biz_temp where id = #{id}
</delete><selectid="findBizTempById"parameterType="int"resultType="BizTemp">        select * from biz_temp where id = #{id}
</select></mapper>


2.7 数据库连接yml

server:
  port: 9000
spring:
  application:
    name: tool-mybatis
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/study?characterEncoding=utf8
    username: mybatis-study
    password: mybatis-study_1234
mybatis:
  mapper-locations: classpath:com.liu.mybatis.mapper/*Mapper.xml
  type-aliases-package: com.liu.mybatis
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl


2.8 编写页面控制器

packagecom.liu.mybatis;
importcom.liu.mybatis.domain.BizTemp;
importcom.liu.mybatis.service.impl.BizTempServiceImpl;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;
importjava.util.Date;
importjava.util.List;
importjava.util.UUID;
/*** <p> BizTempController </p>** @author Aion.Liu* @version v1.0.0* @description TODO* @since 2022/9/4 00:36*/@RestController@RequestMapping("biz-temp/")
publicclassBizTempController {
@AutowiredpublicBizTempServiceImplbizTempService;
@RequestMapping("/findAll")
publicvoidTestFindAll() {
List<BizTemp>bizTempList=bizTempService.findAll();
for (BizTempBizTemp : bizTempList)
System.out.println(BizTemp);
    }
@RequestMapping("/saveBizTemp")
publicvoidTestSaveBizTemp() {
BizTempbizTemp=newBizTemp();
bizTemp.setOperator("张三"+System.currentTimeMillis());
System.out.println(bizTemp);
bizTempService.saveBizTemp(bizTemp);
System.out.println(bizTemp);
    }
@RequestMapping("/getTotal")
publicvoidTestGetTotal() {
System.out.println("获取数据库记录数:"+bizTempService.getTotal());
    }
@RequestMapping("/findBizTemoBuName")
publicvoidTestFindBizTempByName() {
List<BizTemp>BizTemps=bizTempService.findBizTempBySn("553c9be211e");
for (BizTempBizTemp : BizTemps) System.out.println(BizTemp);
    }
@RequestMapping("/updateBizTemp")
publicvoidTestUpdateBizTemp() {
BizTempbizTemp=newBizTemp();
bizTemp.setSn(UUID.randomUUID().toString().replace("-", ""));
bizTemp.setOperator("张三"+System.currentTimeMillis());
bizTemp.setOperatorDesc("测试");
bizTemp.setOperatorPhone("13800138000");
bizTemp.setOperatorTime(newDate());
bizTemp.setCreatedBy("admin");
bizTemp.setCreatedTime(newDate());
bizTempService.updateBizTemp(bizTemp);
    }
@RequestMapping("/deleteBizTemp")
publicvoidTestDeleteBizTemp() {
bizTempService.deleteBizTemp(4);
    }
@RequestMapping("/findBizTempById")
publicvoidTestFindBizTempById() {
BizTempbizTemp=bizTempService.findBizTempById(2);
System.out.println(bizTemp);
    }
}


2.9 访问测试

当我们请求测试地址:http://localhost:9000/biz-temp/findAll

看到控制台打印:

==>  Preparing: select * from biz_temp;
==> Parameters: 
<==    Columns: id, sn, operator, operator_phone, operator_desc, operator_time, created_by, created_time, updated_by, updated_time
<==        Row: 1, 0ed704749be211eab558c739c840e6c0, 张三, 13800138999, 同意, null, null, null, null, null
<==        Row: 2, 2700553c9be211eab558c739c840e6c0, 李四, 13800138888, 同意, null, null, null, null, null
<==      Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@26e62ceb]
com.liu.mybatis.domain.BizTemp@2336f1f6[id=1,sn=0ed704749be211eab558c739c840e6c0,operator=张三,operatorPhone=<null>,operatorDesc=<null>,operatorTime=<null>,createdBy=<null>,createdTime=<null>,updatedBy=<null>,updatedTime=<null>]
com.liu.mybatis.domain.BizTemp@6b8a1838[id=2,sn=2700553c9be211eab558c739c840e6c0,operator=李四,operatorPhone=<null>,operatorDesc=<null>,operatorTime=<null>,createdBy=<null>,createdTime=<null>,updatedBy=<null>,updatedTime=<null>]

其他接口可以参考测试。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
1月前
|
监控 Cloud Native Java
Quarkus 云原生Java框架技术详解与实践指南
本文档全面介绍 Quarkus 框架的核心概念、架构特性和实践应用。作为新一代的云原生 Java 框架,Quarkus 旨在为 OpenJDK HotSpot 和 GraalVM 量身定制,显著提升 Java 在容器化环境中的运行效率。本文将深入探讨其响应式编程模型、原生编译能力、扩展机制以及与微服务架构的深度集成,帮助开发者构建高效、轻量的云原生应用。
167 44
|
1月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
242 1
|
2月前
|
安全 Java 编译器
new出来的对象,不一定在堆上?聊聊Java虚拟机的优化技术:逃逸分析
逃逸分析是一种静态程序分析技术,用于判断对象的可见性与生命周期。它帮助即时编译器优化内存使用、降低同步开销。根据对象是否逃逸出方法或线程,分析结果分为未逃逸、方法逃逸和线程逃逸三种。基于分析结果,编译器可进行同步锁消除、标量替换和栈上分配等优化,从而提升程序性能。尽管逃逸分析计算复杂度较高,但其在热点代码中的应用为Java虚拟机带来了显著的优化效果。
74 4
|
2月前
|
Java API Maven
2025 Java 零基础到实战最新技术实操全攻略与学习指南
本教程涵盖Java从零基础到实战的全流程,基于2025年最新技术栈,包括JDK 21、IntelliJ IDEA 2025.1、Spring Boot 3.x、Maven 4及Docker容器化部署,帮助开发者快速掌握现代Java开发技能。
529 1
|
2月前
|
Java 测试技术 API
2025 年 Java 开发者必知的最新技术实操指南全览
本指南涵盖Java 21+核心实操,详解虚拟线程、Spring Boot 3.3+GraalVM、Jakarta EE 10+MicroProfile 6微服务开发,并提供现代Java开发最佳实践,助力开发者高效构建高性能应用。
360 4
|
1月前
|
安全 Cloud Native Java
Java 模块化系统(JPMS)技术详解与实践指南
本文档全面介绍 Java 平台模块系统(JPMS)的核心概念、架构设计和实践应用。作为 Java 9 引入的最重要特性之一,JPMS 为 Java 应用程序提供了强大的模块化支持,解决了长期存在的 JAR 地狱问题,并改善了应用的安全性和可维护性。本文将深入探讨模块声明、模块路径、访问控制、服务绑定等核心机制,帮助开发者构建更加健壮和可维护的 Java 应用。
154 0
|
2月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
156 3
|
2月前
|
存储 人工智能 算法
Java 大视界 -- Java 大数据在智能医疗影像数据压缩与传输优化中的技术应用(227)
本文探讨 Java 大数据在智能医疗影像压缩与传输中的关键技术应用,分析其如何解决医疗影像数据存储、传输与压缩三大难题,并结合实际案例展示技术落地效果。
|
2月前
|
机器学习/深度学习 算法 Java
Java 大视界 -- Java 大数据在智能物流运输车辆智能调度与路径优化中的技术实现(218)
本文深入探讨了Java大数据技术在智能物流运输中车辆调度与路径优化的应用。通过遗传算法实现车辆资源的智能调度,结合实时路况数据和强化学习算法进行动态路径优化,有效提升了物流效率与客户满意度。以京东物流和顺丰速运的实际案例为支撑,展示了Java大数据在解决行业痛点问题中的强大能力,为物流行业的智能化转型提供了切实可行的技术方案。
|
2月前
|
分布式计算 Cloud Native 安全
Java:历久弥新的技术基石
Java:历久弥新的技术基石