MyBatis初级实战之一:Spring Boot集成

欢迎访问我的GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;

MyBatis初级实战

《MyBatis初级实战》系列旨在通过一系列编码实战,和读者一起掌握MyBatis的基本用法,帮助初学者快速运用MyBatis参与实际开发;

聚焦MyBatis

《MyBatis初级实战》面向的是对MyBatis有兴趣的读者,向读者们提供可用的方案和代码,这里不是比较Hibernate、sqltoy-orm的地方,作者也十分认可这些ORM框架,但《MyBatis初级实战》不参与比较;

关于MyBatis

引自官方:MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

实战环境

《MyBatis初级实战》系列的环境信息如下:

  1. JDK:1.8.0_181
  2. mybatis-spring-boot-starter:2.1.3(对应的MyBatis:3.5.5)
  3. Spring Boot:2.3.2.RELEASE
  4. MySQL:5.7.29
  5. 实战环境:win10
  6. 开发工具:IntelliJ IDEA 2019.2.1 (Ultimate Edition)

Spring Boot集成MyBatis常规步骤概览

Spring Boot集成MyBatis的常规步骤如下:

  1. maven中添加mybatis-spring-boot-starter的依赖;
  2. Spring Boot的配置中指定MyBatis配置文件的位置;
  3. Spring Boot的配置中指定MyBatis映射文件的位置;
  4. 添加MyBatis配置文件,后续MyBatis的常规配置集中在此;
  5. 映射文件xxxMapper.xml及其对应的接口文件;
  6. 业务代码中,Autowired注解修饰接口文件并使用;
  • 接下来开始实战,咱们先把数据准备好;

准备数据

  1. 请您自行准备好MySQL服务,我这边MySQL是部署在docker上的,可以参考《群晖DS218+部署mysql》

  2. 创建名为<font color="blue">mybatis</font>的数据库;

  3. <font color="blue">mybatis</font>数据库下执行以下SQL,即可创建本次实战所需数据:

    USE mybatis;

    DROP TABLE IF EXISTS user;

    CREATE TABLE user ( id int(32) NOT NULL AUTO_INCREMENT, name varchar(32) NOT NULL, age int(32) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

    DROP TABLE IF EXISTS log;

    CREATE TABLE log ( id int(32) NOT NULL AUTO_INCREMENT, user_id int(32), action varchar(255) NOT NULL, create_time datetime not null, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

    INSERT INTO mybatis.user (id, name, age) VALUES (3, 'tom', 11); INSERT INTO mybatis.log (id, user_id, action, create_time) VALUES (3, 3, 'read book', '2020-08-07 08:18:16');

源码下载

  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项目中有多个文件夹,本章的应用在<font color="blue">mybatis</font>文件夹下,如下图红框所示: 在这里插入图片描述

关于父子工程

为了整个系列的代码好管理,我这边用maven创建的是父子工程,如果您只要子工程,不需要父子结构,要对子工程的pom.xml做以下调整:

  1. parent节点原本如下:

    <parent> <groupId>com.bolingcavalry</groupId> <artifactId>mybatis</artifactId> <version>1.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent>

请替换成以下内容(也就是直接用>spring-boot-starter-parent作为父工程):

1<parent> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-parent</artifactId> 4 <version>2.3.2.RELEASE</version> 5 <relativePath/> <!-- lookup parent from repository --> 6 </parent>

2. 子工程种的<font color="blue">dependency</font>节点中没有version子节点,这些都放在父工程的<font color="blue">dependencyManagement</font>中统一管理了,请您将<font color="red">version</font>添加到子工程的各个dependency节点:

在这里插入图片描述

  • 接下来开始编码

创建父工程

创建名为<font color="blue">mybatis</font>的maven工程,pom.xml内容如下:

1<?xml version="1.0" encoding="UTF-8"?> 2<project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <parent> 8 <groupId>org.springframework.boot</groupId> 9 <artifactId>spring-boot-starter-parent</artifactId> 10 <version>2.3.2.RELEASE</version> 11 <relativePath/> <!-- lookup parent from repository --> 12 </parent> 13 14 <groupId>com.bolingcavalry</groupId> 15 <artifactId>mybatis</artifactId> 16 <version>1.0-SNAPSHOT</version> 17 <packaging>pom</packaging> 18 19 <properties> 20 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 21 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 22 <java.version>1.8</java.version> 23 </properties> 24 25 <modules> 26 <module>simple</module> 27 </modules> 28 29 <dependencyManagement> 30 31 <dependencies> 32 <dependency> 33 <groupId>org.mybatis.spring.boot</groupId> 34 <artifactId>mybatis-spring-boot-starter</artifactId> 35 <version>2.1.3</version> 36 </dependency> 37 </dependencies> 38 39 </dependencyManagement> 40 41</project>
  • 至此,准备工作算是全部完成了,接下来咱们开始创建一个典型的Spring Boot集成MyBatis的项目吧;

Spring Boot集成MyBatis

  1. 在父工程mybatis之下新建名为<font color="blue">simple</font>的Spring Boot子工程,其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"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.bolingcavalry</groupId> <artifactId>mybatis</artifactId> <version>1.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent>

    1<groupId>com.bolingcavalry</groupId> 2<artifactId>simple</artifactId> 3<version>0.0.1-SNAPSHOT</version> 4<name>simple</name> 5<description>Demo project for Spring Boot</description> 6 7<properties> 8 <java.version>1.8</java.version> 9</properties> 10 11<dependencies> 12 <dependency> 13 <groupId>org.springframework.boot</groupId> 14 <artifactId>spring-boot-starter-web</artifactId> 15 </dependency> 16 <dependency> 17 <groupId>org.mybatis.spring.boot</groupId> 18 <artifactId>mybatis-spring-boot-starter</artifactId> 19 <version>2.1.3</version> 20 </dependency> 21 <dependency> 22 <groupId>mysql</groupId> 23 <artifactId>mysql-connector-java</artifactId> 24 <scope>runtime</scope> 25 </dependency> 26 27 <dependency> 28 <groupId>org.springframework.boot</groupId> 29 <artifactId>spring-boot-starter-test</artifactId> 30 <scope>test</scope> 31 <exclusions> 32 <exclusion> 33 <groupId>org.junit.vintage</groupId> 34 <artifactId>junit-vintage-engine</artifactId> 35 </exclusion> 36 </exclusions> 37 </dependency> 38</dependencies> 39 40<build> 41 <plugins> 42 <plugin> 43 <groupId>org.springframework.boot</groupId> 44 <artifactId>spring-boot-maven-plugin</artifactId> 45 </plugin> 46 </plugins> 47</build>
    </project>
  2. Spring Boot配置文件是<font color="blue">simple/src/main/resources/application.yml</font>,内容如下:

    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: simple: mapper: debug

  3. 新建user表对应的实体类User.java:

    package com.bolingcavalry.simple.entity;

    /**

    • @Description: 实体类

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

    • @date: 2020/8/4 8:24 */ public class User { private Integer id; private String name; private Integer age;

      public Integer getId() { return id; }

      public void setId(Integer id) { this.id = id; }

      public String getName() { return name; }

      public void setName(String name) { this.name = name; }

      public Integer getAge() { return age; }

      public void setAge(Integer age) { this.age = age; }

      @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + ''' + ", age=" + age + '}'; } }

  4. 新建log表对应的实体类Log.java:

    package com.bolingcavalry.simple.entity;

    import java.sql.Date;

    /**

    • @Description: 实体类

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

    • @date: 2020/8/4 8:24 */ public class Log { private Integer id; private Integer userId; private String action; private Date createTime;

      public Integer getId() { return id; }

      public void setId(Integer id) { this.id = id; }

      public Integer getUserId() { return userId; }

      public void setUserId(Integer userId) { this.userId = userId; }

      public String getAction() { return action; }

      public void setAction(String action) { this.action = action; }

      public Date getCreateTime() { return createTime; }

      public void setCreateTime(Date createTime) { this.createTime = createTime; }

      @Override public String toString() { return "Log{" + "id=" + id + ", userId=" + userId + ", action='" + action + ''' + ", createTime=" + createTime + '}'; } }

  5. 接下来会新建三个配置文件,先来看下它们的位置,以免后面放错地方引起不必要的麻烦:

在这里插入图片描述 6. application.yml所在目录下,新增名为<font color="blue">mybatis-config.xml</font>的文件,这是mybatis的配置文件,本例很简单只有一个配置,内容如下:

1<!DOCTYPE configuration 2 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 4<configuration> 5 <typeAliases> 6 <!-- 映射文件中的类不用写全路径了--> 7 <package name="com.bolingcavalry.simple.entity"/> 8 </typeAliases> 9</configuration>

7. <font color="blue">resources/mappers</font>目录下,新增名为<font color="red">UserMapper.xml</font>的文件,和user表相关的查询都在此,本文只有一个查询user表的操作,注意下文中的resultType等于User,这里没有写User类的完整路径,是因为前面mybatis-config.xml文件中配置了typeAliases的package节点的缘故:

1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 3<mapper namespace="com.bolingcavalry.simple.mapper.UserMapper"> 4 <select id="sel" parameterType="int" resultType="User"> 5 select * from user where id = #{id} 6 </select> 7</mapper>

8. 再新增<font color="blue">LogMapper.xml</font>,如下所示,log表中的<font color="blue">user_id</font>字段在Log.java中没有同名的字段,因此要新增resultMap来建立数据库和实体类的字段映射关系,再在select节点用上这个关系,注意要用<font color="red">resultMap</font>属性(UserMapper.xml中用的是<font color="blue">resultType</font>):

1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 3<mapper namespace="com.bolingcavalry.simple.mapper.LogMapper"> 4 5 <resultMap id="logResultMap" type="Log"> 6 <id property="id" column="id" /> 7 <result column="user_id" jdbcType="INTEGER" property="userId" /> 8 <result column="action" jdbcType="VARCHAR" property="action" /> 9 <result column="create_time" jdbcType="TIMESTAMP" property="createTime" /> 10 </resultMap> 11 12 <select id="sel" parameterType="int" resultMap="logResultMap"> 13 select * from log where id = #{id} 14 </select> 15</mapper>

9. 接下来是业务要用到的接口文件,第一个是UserMapper.java:

1package com.bolingcavalry.simple.mapper; 2 3import com.bolingcavalry.simple.entity.User; 4import org.springframework.stereotype.Repository; 5 6@Repository 7public interface UserMapper { 8 User sel(int id); 9}

10. 第二个是LogMapper.java:

1package com.bolingcavalry.simple.mapper; 2 3import com.bolingcavalry.simple.entity.Log; 4import org.springframework.stereotype.Repository; 5 6@Repository 7public interface LogMapper { 8 Log sel(int id); 9}

11. 上述两个类都使用了<font color="blue">Repository</font>注解,作用是避免在编码过程中,IDEA给出红线提示,如下图:

在这里插入图片描述 12. 映射配置完毕,接下来就可以在应用中使用了,先为user做一个service类UserService.java,里面通过<font color="blue">Autowired</font>注解注入UserMapper的实现:

1package com.bolingcavalry.simple.service; 2 3import com.bolingcavalry.simple.entity.User; 4import com.bolingcavalry.simple.mapper.UserMapper; 5import org.springframework.beans.factory.annotation.Autowired; 6import org.springframework.stereotype.Service; 7 8@Service 9public class UserService { 10 @Autowired 11 UserMapper userMapper; 12 13 public User sel(int id){ 14 return userMapper.sel(id); 15 } 16}

13. 再为log做service类LogService.java:

1package com.bolingcavalry.simple.service; 2 3import com.bolingcavalry.simple.entity.Log; 4import com.bolingcavalry.simple.mapper.LogMapper; 5import org.springframework.beans.factory.annotation.Autowired; 6import org.springframework.stereotype.Service; 7 8@Service 9public class LogService { 10 @Autowired 11 LogMapper logMapper; 12 13 public Log sel(int id){ 14 return logMapper.sel(id); 15 } 16}

14. 最后是响应web请求的controller类,第一个是UserController.java:

1package com.bolingcavalry.simple.controller; 2 3import com.bolingcavalry.simple.service.UserService; 4import org.springframework.beans.factory.annotation.Autowired; 5import org.springframework.web.bind.annotation.PathVariable; 6import org.springframework.web.bind.annotation.RequestMapping; 7import org.springframework.web.bind.annotation.RestController; 8 9@RestController 10public class UserController { 11 @Autowired 12 private UserService userService; 13 14 @RequestMapping("user/{id}") 15 public String GetUser(@PathVariable int id){ 16 return userService.sel(id).toString(); 17 } 18}

15. 然后是LogController.java:

1package com.bolingcavalry.simple.controller; 2 3import com.bolingcavalry.simple.service.LogService; 4import org.springframework.beans.factory.annotation.Autowired; 5import org.springframework.web.bind.annotation.PathVariable; 6import org.springframework.web.bind.annotation.RequestMapping; 7import org.springframework.web.bind.annotation.RestController; 8 9@RestController 10public class LogController { 11 @Autowired 12 private LogService logService; 13 14 @RequestMapping("log/{id}") 15 public String log(@PathVariable int id){ 16 return logService.sel(id).toString(); 17 } 18}

16. 最后是引导类SimpleApplication.java,注意MapperScan注解会自动扫描包路径下的所有接口,这样UserMapper和LogMapper就不用加Mapper注解了:

1package com.bolingcavalry.simple; 2 3import org.mybatis.spring.annotation.MapperScan; 4import org.springframework.boot.SpringApplication; 5import org.springframework.boot.autoconfigure.SpringBootApplication; 6 7@SpringBootApplication 8@MapperScan("com.bolingcavalry.simple.mapper") 9public class SimpleApplication { 10 11 public static void main(String[] args) { 12 SpringApplication.run(SimpleApplication.class, args); 13 } 14}
  • 至此,编码完成,可以启动验证了;

验证

  1. 启动SpringBoot应用的方式有两种,最简单的办法是再IDEA中直接启动,如下图:

在这里插入图片描述

  1. 第二种是simple的目录下执行<font color="blue">mvn clean package -U</font>,就会在<font color="blue">target</font>目录得到文件<font color="red">simple-0.0.1-SNAPSHOT.jar</font>,再执行<font color="blue">java -jar simple-0.0.1-SNAPSHOT.jar</font>即可启动;
  2. 在浏览器访问<font color="blue">http://localhost:8080/user/3</font>,可以得到user表的查询结果:

在这里插入图片描述 4. 访问<font color="blue">http://localhost:8080/log/3</font>,可以得到log表的查询结果:

在这里插入图片描述 5. 在控制台可以看到日志如下所示,这是我们开发期间调试问题的重要线索:

在这里插入图片描述 至此,入门级SpringBoot集成MyBatis的实战就完成了,接下来的系列内容会有更多实战,咱们一起来学习和掌握MyBatis的基本用法;

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

欢迎关注公众号:程序员欣宸

微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...

https://github.com/zq2599/blog_demos

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )