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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 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>]

其他接口可以参考测试。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
14天前
|
SQL 负载均衡 安全
安全至上:Web应用防火墙技术深度剖析与实战
【10月更文挑战第29天】在数字化时代,Web应用防火墙(WAF)成为保护Web应用免受攻击的关键技术。本文深入解析WAF的工作原理和核心组件,如Envoy和Coraza,并提供实战指南,涵盖动态加载规则、集成威胁情报、高可用性配置等内容,帮助开发者和安全专家构建更安全的Web环境。
34 1
|
1月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
105 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
53 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
17天前
|
负载均衡 监控 算法
论负载均衡技术在Web系统中的应用
【11月更文挑战第4天】在当今高并发的互联网环境中,负载均衡技术已经成为提升Web系统性能不可或缺的一环。通过有效地将请求分发到多个服务器上,负载均衡不仅能够提高系统的响应速度和处理能力,还能增强系统的可扩展性和稳定性。本文将结合我参与的一个实际软件项目,从项目概述、负载均衡算法原理以及实际应用三个方面,深入探讨负载均衡技术在Web系统中的应用。
48 2
|
22天前
|
搜索推荐 Java 数据库连接
Java|在 IDEA 里自动生成 MyBatis 模板代码
基于 MyBatis 开发的项目,新增数据库表以后,总是需要编写对应的 Entity、Mapper 和 Service 等等 Class 的代码,这些都是重复的工作,我们可以想一些办法来自动生成这些代码。
30 6
|
28天前
|
人工智能 前端开发
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
|
29天前
|
存储 安全 数据库
后端技术在现代Web开发中的实践与创新
【10月更文挑战第13天】 本文将深入探讨后端技术在现代Web开发中的重要性,通过实际案例分析展示如何利用先进的后端技术提升用户体验和系统性能。我们将从基础架构设计、数据库优化、安全性保障等方面展开讨论,为读者提供清晰的指导和实用的技巧。无论是新手开发者还是经验丰富的技术人员,都能从中获得启发和帮助。
33 2
|
30天前
|
机器学习/深度学习 移动开发 JavaScript
Web实时通信的学习之旅:SSE(Server-Sent Events)的技术详解及简单示例演示
Web实时通信的学习之旅:SSE(Server-Sent Events)的技术详解及简单示例演示
123 0
|
1月前
|
自然语言处理 Cloud Native 数据安全/隐私保护
后端技术在现代Web开发中的实践与创新
本文探讨了后端技术在现代Web开发中的重要性及其应用。通过分析当前流行的后端框架和开发模式,揭示了如何利用这些技术来构建高效、可扩展的Web应用程序。同时,文章也讨论了未来后端技术的发展趋势,为开发者提供了一些启示。

热门文章

最新文章