MyBatis初级实战之二:增删改查

本文是《MyBatis初级实战》系列的第二篇,通过前文我们知道了如何在SpringBoot中集成MyBatis,本篇就一起来练习基本功:增删改查;

本篇概览

本篇要练习的内容如下:

  1. 单表的增删改查

  2. 批量新增

  3. 联表查询

全文由以下部分组成:

  1. 新建工程

  2. 增加启动类

  3. 增加swagger的配置类,工程包含了swagger,以便稍后在浏览器上验证

  4. 增加配置文件

  5. 增加实体类

  6. 增加mapper配置文件

  7. 增加mapper接口

  8. 增加service,调用mapper接口

  9. 增加controller,调用service服务

  10. 编写单元测试用例

  11. 验证

源码下载

  1. 如果您不想编码,可以在GitHub下载所有源码,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):

| 名称 | 链接 | 备注 |

| :-- | :-- | :-- |

| 项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |

| git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |

| git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |

  1. 这个git项目中有多个文件夹,本章的应用在mybatis文件夹下,如下图红框所示:

在这里插入图片描述

开发

  1. 本文的实战使用的数据库和表结构与前文《MyBatis初级实战之一:Spring Boot集成》一模一样;

  2. 前文《MyBatis初级实战之一:Spring Boot集成》新建了父工程mybatis,本文继续在此工程中新增子工程,名为curd,整个子工程文件结构如下:

在这里插入图片描述

  1. 修改父工程mybatis的pom.xml,在dependencyManagement节点下新增两个dependency节点,如下所示,这么做是为了统一管理依赖库的版本:

io.springfox

springfox-swagger-ui

2.5.0

com.google.code.gson

gson

2.8.6

  1. 名为curd子工程,其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 https://maven.apache.org/xsd/maven-4.0.0.xsd”>

4.0.0

com.bolingcavalry

mybatis

1.0-SNAPSHOT

…/pom.xml

com.bolingcavalry

curd

0.0.1-SNAPSHOT

curd

Demo project for Mybatis CURD in Spring Boot

<java.version>1.8</java.version>

org.springframework.boot

spring-boot-starter-web

org.mybatis.spring.boot

mybatis-spring-boot-starter

mysql

mysql-connector-java

runtime

org.springframework.boot

spring-boot-starter-test

test

org.junit.vintage

junit-vintage-engine

io.springfox

springfox-swagger2

io.springfox

springfox-swagger-ui

junit

junit

test

com.google.code.gson

gson

org.springframework.boot

spring-boot-maven-plugin

  1. 增加启动类,注意要用MapperScan注释来指定mapper接口代码的包路径:

package com.bolingcavalry.curd;

import org.mybatis.spring.annotation.MapperScan;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

@MapperScan(“com.bolingcavalry.curd.mapper”)

public class CurdApplication {

public static void main(String[] args) {

SpringApplication.run(CurdApplication.class, args);

}

}

  1. 本次实战用到了swagger,这样可以很方便的通过浏览器向各个controller接口发送请求,以下是配置类:

package com.bolingcavalry.curd;

import springfox.documentation.service.Contact;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import springfox.documentation.builders.ApiInfoBuilder;

import springfox.documentation.builders.PathSelectors;

import springfox.documentation.builders.RequestHandlerSelectors;

import springfox.documentation.service.ApiInfo;

import springfox.documentation.service.Tag;

import springfox.documentation.spi.DocumentationType;

import springfox.documentation.spring.web.plugins.Docket;

import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration

@EnableSwagger2

public class SwaggerConfig {

@Bean

public Docket createRestApi() {

return new Docket(DocumentationType.SWAGGER_2)

.apiInfo(apiInfo())

.tags(new Tag(“UserController”, “用户服务”), new Tag(“LogController”, “日志服务”))

.select()

// 当前包路径

.apis(RequestHandlerSelectors.basePackage(“com.bolingcavalry.curd.controller”))

.paths(PathSelectors.any())

.build();

}

//构建 api文档的详细信息函数,注意这里的注解引用的是哪个

private ApiInfo apiInfo() {

return new ApiInfoBuilder()

//页面标题

.title(“MyBatis CURD操作”)

//创建人

.contact(new Contact(“程序员欣宸”, “https://github.com/zq2599/blog_demos”, “zq2599@gmail.com”))

//版本号

.version(“1.0”)

//描述

.description(“API 描述”)

.build();

}

}

  1. application.yml内容如下:

server:

port: 8080

spring:

数据源

datasource:

username: root

password: 123456

url: jdbc:mysql://192.168.50.43:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC

driver-class-name: com.mysql.cj.jdbc.Driver

mybatis配置

mybatis:

配置文件所在位置

config-location: classpath:mybatis-config.xml

映射文件所在位置

mapper-locations: classpath:mappers/*Mapper.xml

日志配置

logging:

level:

root: INFO

com:

bolingcavalry:

curd:

mapper: debug

  1. 增加user表的实体类User.java,里面带有swagger的注解,方便在swagger页面展示:

package com.bolingcavalry.curd.entity;

import io.swagger.annotations.ApiModel;

import io.swagger.annotations.ApiModelProperty;

@ApiModel(description = “用户实体类”)

public class User {

@ApiModelProperty(value = “用户ID”)

private Integer id;

@ApiModelProperty(value = “用户名”, required = true)

private String name;

@ApiModelProperty(value = “用户地址”, required = false)

private Integer age;

@Override

public String toString() {

return “User{” +

“id=” + id +

“, name='” + name + ‘’’ +

“, age=” + age +

‘}’;

}

// 省去get和set方法,请您自行补齐

}

  1. 增加log表的实体类Log.java,里面带有swagger的注解,方便在swagger页面展示:

package com.bolingcavalry.curd.entity;

import io.swagger.annotations.ApiModel;

import io.swagger.annotations.ApiModelProperty;

import java.sql.Date;

/**

  • @Description: 实体类

  • @author: willzhao E-mail: zq2599@gmail.com

  • @date: 2020/8/4 8:24

*/

@ApiModel(description = “日志实体类”)

public class Log {

@ApiModelProperty(value = “日志ID”)

private Integer id;

@ApiModelProperty(value = “用户ID”)

private Integer userId;

@ApiModelProperty(value = “日志内容”)

private String action;

@ApiModelProperty(value = “创建时间”)

private Date createTime;

@Override

public String toString() {

return “Log{” +

“id=” + id +

“, userId=” + userId +

“, action='” + action + ‘’’ +

“, createTime=” + createTime +

‘}’;

}

// 省去get和set方法,请您自行补齐

}

  1. 为联表查询的结果准备一个bean,名为LogExtend.java,继承自Log.java,自己只有个userName字段,对应联表查询user表的name字段:

package com.bolingcavalry.curd.entity;

import io.swagger.annotations.ApiModel;

import io.swagger.annotations.ApiModelProperty;

@ApiModel(description = “日志实体类(含用户表的字段)”)

public class LogExtend extends Log {

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

@ApiModelProperty(value = “用户名”)

private String userName;

@Override

public String toString() {

return “LogExtend{” +

“id=” + getId() +

“, userId=” + getUserId() +

“, userName='” + getUserName() + ‘’’ +

“, action='” + getAction() + ‘’’ +

“, createTime=” + getCreateTime() +

‘}’;

}

}

  1. 增加user表的mapper映射文件,可见都是些很简单sql,要注意的是批量新增的节点,这里面用到了foreach语法,可以通过集合动态生成sql:
<?xml version="1.0" encoding="UTF-8"?>

select * from user where id = #{id}

insert into user (id, name, age) values (#{id}, #{name}, #{age})

insert into user (id, name, age)

values

(#{user.id}, #{user.name}, #{user.age})

select id, name, age from user where name like concat(‘%’, #{name}, ‘%’)

delete from user where id= #{id}

delete from user

update user set name = #{name}, age = #{age} where id = #{id}

select count(*) from user

  1. 增加log表的mapper映射文件,如下所示,请关注联表操作selExtend,其结果是logExtendResultMap:
<?xml version="1.0" encoding="UTF-8"?>

insert into log (id, user_id, action, create_time) values (#{id}, #{userId}, #{action}, #{createTime})

select l.id as id,

l.user_id as user_id,

l.action as action,

l.create_time as create_time,

u.name as user_name

from log as l

left join user as u

on l.user_id = u.id

where l.id = #{id}

  1. 增加用户表的mapper接口类UserMapper.java ,对应着映射文件中的sql节点的id:

package com.bolingcavalry.curd.mapper;

import com.bolingcavalry.curd.entity.LogExtend;

import com.bolingcavalry.curd.entity.User;

import org.springframework.stereotype.Repository;

import java.util.List;

@Repository

public interface UserMapper {

User sel(int id);

int insertWithFields(User user);

int insertBatch(List users);

int clearAll();

List findByName(String name);

int update(User user);

int delete(int id);

int totalCount();

LogExtend selExtend(int id);

}

  1. 增加日志表的mapper接口类LogMapper.java,对应着映射文件中的sql节点的id:

package com.bolingcavalry.curd.mapper;

import com.bolingcavalry.curd.entity.Log;

import com.bolingcavalry.curd.entity.LogExtend;

import org.springframework.stereotype.Repository;

@Repository

public interface LogMapper {

Log sel(int id);

LogExtend selExtend(int id);

int insertWithFields(Log log);

}

  1. mapper接口完成后就是service层,先写user表的service,如下所示,可见都是对mapper接口的调用:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

写在最后

学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌

Mybatis面试专题

蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌

MySQL面试专题

蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌

并发编程面试专题

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-SYfocaB8-1712174069289)]

[外链图片转存中…(img-XHmimRvz-1712174069290)]

[外链图片转存中…(img-P6vS0xj9-1712174069290)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

写在最后

学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

[外链图片转存中…(img-9DNRvBT8-1712174069291)]

Mybatis面试专题

[外链图片转存中…(img-etbfTsaM-1712174069291)]

MySQL面试专题

[外链图片转存中…(img-Z6gHekRz-1712174069291)]

并发编程面试专题

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值