欢迎访问我的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注解修饰接口文件并使用;

- 接下来开始实战,咱们先把数据准备好;

准备数据

  • 请您自行准备好MySQL服务,我这边MySQL是部署在docker上的,可以参考《群晖DS218+部署mysql 》;
  • 创建名为mybatis的数据库;
  • mybatis数据库下执行以下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');

源码下载

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

  • 这个git项目中有多个文件夹,《MyBatis初级实战》系列的源码在mybatis文件夹下,如下图红框所示:

关于父子工程

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

  • parent节点原本如下:
com.bolingcavalry        mybatis        1.0-SNAPSHOT../pom.xml
  • 请替换成以下内容(也就是直接用>spring-boot-starter-parent作为父工程):
org.springframework.boot        spring-boot-starter-parent        2.3.2.RELEASE
  • 子工程中的dependency节点中没有version子节点,这些都放在父工程的dependencyManagement中统一管理了,请您将version添加到子工程的各个dependency节点:
  • 接下来开始编码

创建父工程

  • 创建名为mybatis的maven工程,pom.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>4.0.0org.springframework.boot        spring-boot-starter-parent        2.3.2.RELEASEcom.bolingcavalry    mybatis    1.0-SNAPSHOTpomUTF-8UTF-81.8simpleorg.mybatis.spring.boot                mybatis-spring-boot-starter                2.1.3
  • 至此,准备工作算是全部完成了,接下来咱们开始创建一个典型的Spring Boot集成MyBatis的项目吧;

Spring Boot集成MyBatis

  • 在父工程mybatis之下新建名为simple的Spring Boot子工程,其pom.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>4.0.0com.bolingcavalry        mybatis        1.0-SNAPSHOT../pom.xmlcom.bolingcavalry    simple    0.0.1-SNAPSHOTsimpleDemo project for Spring Boot1.8org.springframework.boot            spring-boot-starter-web        org.mybatis.spring.boot            mybatis-spring-boot-starter            2.1.3mysql            mysql-connector-java            runtimeorg.springframework.boot            spring-boot-starter-test            testorg.junit.vintage                    junit-vintage-engine                org.springframework.boot                spring-boot-maven-plugin            
  • Spring Boot配置文件是simple/src/main/resources/application.yml,内容如下:
server:  port: 8080spring:  # 数据源  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
  • 新建实体类User.java:
package com.bolingcavalry.simple.entity;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 +                '}';    }}
  • 新建实体类Log.java:
package com.bolingcavalry.simple.entity;import java.sql.Date;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 +                '}';    }}
  • 接下来会新建三个配置文件,先来看下它们的位置,以免后面放错地方引起不必要的麻烦:
  • application.yml所在目录下,新增名为mybatis-config.xml的文件,这是mybatis的配置文件,本例很简单只有一个配置,内容如下:
  • resources/mappers目录下,新增名为UserMapper.xml的文件,和user表相关的查询都在此,本文只有一个查询user表的操作,注意下文中的resultType等于User,这里没有写User类的完整路径,是因为前面mybatis-config.xml文件中配置了typeAliases的package节点的缘故:
<?xml version="1.0" encoding="UTF-8"?>        select * from user where id = #{id}    
  • 再新增LogMapper.xml,如下所示,log表中的user_id字段在Log.java中没有同名的字段,因此要新增resultMap来建立数据库和实体类的字段映射关系,再在select节点用上这个关系,注意要用resultMap属性(UserMapper.xml中用的是resultType):
<?xml version="1.0" encoding="UTF-8"?>        select * from log where id = #{id}    
  • 接下来是业务要用到的接口文件,第一个是UserMapper.java:
package com.bolingcavalry.simple.mapper;import com.bolingcavalry.simple.entity.User;import org.springframework.stereotype.Repository;@Repositorypublic interface UserMapper {    User sel(int id);}
  • 第二个是LogMapper.java:
package com.bolingcavalry.simple.mapper;import com.bolingcavalry.simple.entity.Log;import org.springframework.stereotype.Repository;@Repositorypublic interface LogMapper {    Log sel(int id);}
  • 上述两个类都使用了Repository注解,作用是避免在编码过程中IDEA给出红线提示,如下图:
  • 映射配置完毕,接下来就可以在应用中使用了,先为user做一个service类UserService.java,里面通过Autowired注解注入UserMapper的实现:
package com.bolingcavalry.simple.service;import com.bolingcavalry.simple.entity.User;import com.bolingcavalry.simple.mapper.UserMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class UserService {    @Autowired    UserMapper userMapper;    public User sel(int id){        return userMapper.sel(id);    }}
  • 再为log做service类LogService.java:
package com.bolingcavalry.simple.service;import com.bolingcavalry.simple.entity.Log;import com.bolingcavalry.simple.mapper.LogMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class LogService {    @Autowired    LogMapper logMapper;    public Log sel(int id){        return logMapper.sel(id);    }}
  • 最后是响应web请求的controller类,第一个是UserController.java:
package com.bolingcavalry.simple.controller;import com.bolingcavalry.simple.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class UserController {    @Autowired    private UserService userService;    @RequestMapping("user/{id}")    public String GetUser(@PathVariable int id){        return userService.sel(id).toString();    }}
  • 再为log做service类LogService.java:
package com.bolingcavalry.simple.service;import com.bolingcavalry.simple.entity.Log;import com.bolingcavalry.simple.mapper.LogMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class LogService {    @Autowired    LogMapper logMapper;    public Log sel(int id){        return logMapper.sel(id);    }}
  • 最后是响应web请求的controller类,第一个是UserController.java:
package com.bolingcavalry.simple.controller;import com.bolingcavalry.simple.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class UserController {    @Autowired    private UserService userService;    @RequestMapping("user/{id}")    public String GetUser(@PathVariable int id){        return userService.sel(id).toString();    }}
  • 然后是LogController.java:
package com.bolingcavalry.simple.controller;import com.bolingcavalry.simple.service.LogService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class LogController {    @Autowired    private LogService logService;    @RequestMapping("log/{id}")    public String log(@PathVariable int id){        return logService.sel(id).toString();    }}
  • 最后是引导类SimpleApplication.java,注意MapperScan注解会自动扫描包路径下的所有接口,这样UserMapper和LogMapper就不用加Mapper注解了:
package com.bolingcavalry.simple;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@MapperScan("com.bolingcavalry.simple.mapper")public class SimpleApplication {    public static void main(String[] args) {        SpringApplication.run(SimpleApplication.class, args);    }}
  • 至此,编码完成,可以启动验证了;

验证

  • 启动SpringBoot应用的方式有两种,最简单的办法是在IDEA中直接启动,如下图
  • 第二种是simple的目录下执行mvn clean package -U,就会在target目录得到文件simple-0.0.1-SNAPSHOT.jar,再执行java -jar simple-0.0.1-SNAPSHOT.jar即可启动;
  • 在浏览器访问http://localhost:8080/user/3,可以得到user表的查询结果:
  • 访问http://localhost:8080/log/3,可以得到log表的查询结果:
  • 在控制台可以看到日志如下所示,这是我们开发期间调试问题的重要线索:
  • 至此,入门级SpringBoot集成MyBatis的实战就完成了,接下来的系列内容会有更多实战,咱们一起来学习和掌握MyBatis的基本用法;

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

ideal新建springboot工程_MyBatis初级实战之一:Spring Boot集成相关推荐

  1. springboot 分层_限量!阿里Spring Boot成长笔记终开源!理论实战满满

    前言 随着微服务理念的盛行,微框架的概念也随之诞生,而其中最耀眼的,当属SpringBoot.虽然之前Dropwizard是公认的最早的微框架,但SpringBoot"青出于蓝而胜于蓝&qu ...

  2. SpringBoot进击 | 一浅出:Spring Boot简单快速上手书

    为了后继的 Spring Cloud 学习和进阶,我们需要先行了解 Spring Boot. 1.前言 1.1 认识 Spring Boot Spring Boot 是由 Pivotal 团队提供的全 ...

  3. Elasticsearch实战篇——Spring Boot整合ElasticSearch

    2019独角兽企业重金招聘Python工程师标准>>> 当前Spring Boot很是流行,包括我自己,也是在用Spring Boot集成其他框架进行项目开发,所以这一节,我们一起来 ...

  4. ElasticSearch实战篇 - Spring Boot 整合 ElasticSearch

    点击上方 Java后端,选择 设为星标 优质文章,及时送达 作者:冯文议 链接:segmentfault.com/a/1190000018625101 当前Spring Boot很是流行,包括我自己, ...

  5. springboot整合es_[ElasticSearch从入门到场景实战]spring boot集成SpringData操作es

    人生起起伏伏,有风光无限日,也有落魄失魂时,人在低谷时,唯有"熬过去,才会赢" 前言 Elasticsearch的Spring Data是Spring Data项目的一部分,Spr ...

  6. (转) SpringBoot非官方教程 | 第二篇:Spring Boot配置文件详解

    springboot采纳了建立生产就绪spring应用程序的观点. Spring Boot优先于配置的惯例,旨在让您尽快启动和运行.在一般情况下,我们不需要做太多的配置就能够让spring boot正 ...

  7. SpringBoot非官方教程 | 第二篇:Spring Boot配置文件详解

    springboot采纳了建立生产就绪Spring应用程序的观点. Spring Boot优先于配置的惯例,旨在让您尽快启动和运行.在一般情况下,我们不需要做太多的配置就能够让spring boot正 ...

  8. springboot系列课程笔记-第一章-Spring Boot入门

    一.Spring Boot 入门 1.Spring Boot 简介 简化Spring应用开发的一个框架: 整个Spring技术栈的一个大整合: J2EE开发的一站式解决方案: 2.微服务 2014,m ...

  9. 实战:Spring Boot源码解读与原理分析

    承载着作者的厚望,掘金爆火小册同名读物<Spring Boot源码解读与原理剖析>正式出书! 本书前身是掘金社区销量TOP的小册--<Spring Boot源码解读与原理剖析> ...

最新文章

  1. 吴恩达:人工智能寒冬不会到来,但我们太乐观了
  2. 4、Python —— 函数
  3. shell中如何判断一个变量是否为空
  4. (四) shiro权限与角色
  5. 【java】java 线程组 ThreadGroup
  6. 安卓怎么搭建开发环境 安卓开发环境搭建教程
  7. 机顶盒天线接头怎么接_户户通天线怎么安装图解
  8. 如何使用GitHub客户端
  9. 帆软认证报表工程师FCRA试题
  10. 关于用户登录的记住密码实现思路(考虑到安全问题)
  11. ER studio 安装细节
  12. 开源知识管理系统_开源MrDoc,一个适合个人和小型团队的文档、知识、笔记在线管理系统...
  13. 【浏览器】谷歌浏览器自带翻译失效
  14. 实现百度离线地图、个性化地图及3D WebGL离线地图
  15. Error in network defenition etc/netplan/01-netcfg.yaml line 0 collumn 8: expected mapping.
  16. 参数方程下的特殊图像
  17. python图片显示文本框_用PYTHON以“形式”同时显示图像和文本框
  18. 期货开户手续费是怎么查询?
  19. MYSQL数据库到VUE前端架构
  20. 浅谈CMPP3协议架构实现

热门文章

  1. 使用位运算(与运算)代替%操作
  2. 数据挖掘(data mining),机器学习(machine learning),和人工智能(AI)的区别是什么
  3. tomcat性能调优和性能监控(visualvm)
  4. 微信小程序蓝牙模块BLE开发说明基础知识
  5. Django - Xadmin (四) Filter
  6. 安装 RabbitMQ
  7. 2017.5.8-morning
  8. mysql-聚合函数
  9. Django(1.7 part1)
  10. Orchard使用中的坎坎坷坷