07.深入浅出 Spring Boot - 数据访问之Mybatis(附代码下载)
MyBatis 在Spring Boot应用非常广,非常强大的一个半自动的ORM框架。
- 代码下载:https://github.com/Jackson0714/study-spring-boot.git
- 05. 深入浅出 Spring Boot - 数据访问之JDBC(源码分析+代码下载)
- 06. 深入浅出 Spring Boot - 数据访问之Druid(附代码下载)
- 07. 深入浅出 Spring Boot - 数据访问之Mybatis(附代码下载)
一、什么是MyBatis
支持定制化SQL、存储过程以及高级映射的优秀的持久层框架
避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
可以对配置和原生Map使用简单的 XML 或注解
将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录
数据库、数据源、数据库连接池、JDBC、JDBC实现是什么关系?
- JDBC:Java和关系型数据库的桥梁,是一个规范,不是实现。不同类型的数据库需要有自己的JDBC实现
- 数据源:包含数据库连接池,连接池管理。常见的有C3P0、HikariDataSoiurce、Druid等
- 连接池:预先创建一些数据库连接,放到连接池里面,用的时候从连接池里面取,用完后放回连接池
- 连接池管理:创建数据库连接,管理数据库连接
- JDBC实现:MySQL JDBC实现、Oracle JDBC实现等其他实现
- MyBatis对JDBC进行了封装
二、整合MyBatis
我们基于之前创建的项目spring-boot-06-data-druid 来创建spring-boot-07-data-mybatis项目
1)引入MyBatis依赖
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
2)引入其他依赖
<dependencies>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<!-- Druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
3)依赖图
三、用注解方式使用 MyBatis
1.准备创建department表的脚本
DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`department_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2.application.yml 自动执行脚本
initialization-mode: always
schema:
- classpath:department.sql
执行一次后,注释 initialization-mode
# initialization-mode: always
3.创建department 实体类
package com.jackson0714.springboot.entity;
public class Department {
private Long id;
private String departmentName;
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
}
public String getDepartmentName() {
return departmentName;
}
}
4.创建Mapper映射类,并将SQL注解到方法上
增删改查,你要的都在这里:
@Mapper
public interface DepartmentMapper {
@Select("select * from department")
List<Map<String, Object>> getAllDepartment();
@Select("select * from department where id=#{id}")
Department getDepartmentById(Long id);
@Delete("delete from department where id=#{id}")
int deleteDepartment(Long id);
@Insert("insert into department(department_name) values(#{departmentName})")
int createDepartment(String departmentName);
@Update("update department set department_name=#{departmentName} where id=#{id}")
int updateDepartmentById(Long id, String departmentName);
}
5.创建MyBatis 配置类
增加自定义配置:如果表的字段名有下划线格式的,转为驼峰命名格式
@org.springframework.context.annotation.Configuration
public class MyBatisConfig {
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return new ConfigurationCustomizer() {
@Override
public void customize(Configuration configuration) {
// 如果表的字段名有下划线格式的,转为驼峰命名格式
configuration.setMapUnderscoreToCamelCase(true);
}
};
}
}
6.创建DepartmentController
@Api(value = "DepartmentController", description = "部门controller")
@RequestMapping("/v1/client")
@RestController
public class DepartmentController {
@Autowired
DepartmentMapper departmentMapper;
@ApiOperation(value = "1.查询所有部门")
@GetMapping("/dept/getAllDepartment")
public List<Map<String, Object>> getAllDepartment() {
return departmentMapper.getAllDepartment();
}
@ApiOperation(value = "2.根据id查询某个部门")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "需要查询的部门id")
})
@GetMapping("/dept/{id}")
public Department getDepartmentById(@PathVariable Long id) {
return departmentMapper.getDepartmentById(id);
}
@ApiOperation(value = "3.新增部门")
@ApiImplicitParams({
@ApiImplicitParam(name = "name", value = "部门名称")
})
@PostMapping("/dept/create")
public int createDepartment(@RequestParam String name) {
return departmentMapper.createDepartment(name);
}
@ApiOperation(value = "4.根据id删除部门")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "需要删除的部门id")
})
@PostMapping("/dept/delete")
public int deleteDepartment(@RequestParam Long id) {
return departmentMapper.deleteDepartment(id);
}
@ApiOperation(value = "5.根据id更新部门名称")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "需要更新的部门id"),
@ApiImplicitParam(name = "name", value = "需要更新的部门名称")
})
@PostMapping("/dept/update")
public int updateDepartmentById(@RequestParam Long id, @RequestParam String name) {
return departmentMapper.updateDepartmentById(id, name);
}
}
使用Swagger来测试
四、用配置方式使用 MyBatis
1. 文件结构
2. 创建user表的脚本
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_name` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '用户名',
`password` varchar(255) COLLATE utf8mb4_bin NOT NULL,
`salt` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '随机盐',
`nickName` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '用户名',
`phone` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '手机号',
`avatar` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '头像',
`mini_openId` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '小程序OpenId',
`lock_flag` char(1) COLLATE utf8mb4_bin DEFAULT '0' COMMENT '0-正常,9-锁定',
`del_flag` char(1) COLLATE utf8mb4_bin DEFAULT '0' COMMENT '0-正常,1-删除',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`user_id`),
KEY `user_wx_openid` (`mini_openId`),
KEY `user_idx1_username` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='用户表';
3. 插入一条User数据
INSERT INTO user(user_name, password, nick_name, phone) values ("jackson0714", "123", "悟空聊架构", "123456")
4. 创建User实体类
package com.jackson0714.springboot.entity;
import lombok.Data;
import java.sql.Timestamp;
@Data
public class User {
private Long userId;
private String userName;
private String password;
private String salt;
private String nickName;
private String phone;
private String avatar;
private String miniOpenId;
private String openId;
private Boolean lockFlag;
private Boolean delFlag;
private Timestamp createTime;
private Timestamp updateTime;
}
需要安装Lombok插件
需要引入Lombok依赖
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
5. 创建调用User方法的 UserMapper 接口
// @Mapper 或MapperScan 将接口扫描装配到装配容器中
public interface UserMapper {
User getUserById(Long userId);
}
6. 创建接口方法与SQL脚本的映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jackson0714.springboot.mapper.UserMapper">
<select id="getUserById" resultType="com.jackson0714.springboot.entity.User">
SELECT * FROM user WHERE user_id=#{userId}
</select>
</mapper>
7. 创建UserController文件
@Api(value = "UserController", description = "用户controller")
@RequestMapping("/v1/client")
@RestController
public class UserController {
@Autowired
UserMapper userMapper;
@ApiOperation(value = "1.根据id查询某个用户")
@ApiImplicitParams({
@ApiImplicitParam(name = "需要查询的用户userId", value = "需要查询的用户userId")
})
@GetMapping("/emp/{userId}")
public User getUser(@PathVariable("userId") Long userId) {
return userMapper.getUserById(userId);
}
}
8. 添加MapperScan注解
@MapperScan(value = "com.jackson0714.springboot.mapper")
@SpringBootApplication
public class Springboot07DataMybatisApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot07DataMybatisApplication.class, args);
}
}
9.在Swagger上测试
10. 查看Druid监控
Spring Boot 整合MyBatis 讲完了,持续更新 《深入浅出 Spring Boot 系列》
- 代码下载:https://github.com/Jackson0714/study-spring-boot.git
- 05. 深入浅出 Spring Boot - 数据访问之JDBC(源码分析+代码下载)
- 06. 深入浅出 Spring Boot - 数据访问之Druid(附代码下载)
- 07. 深入浅出 Spring Boot - 数据访问之Mybatis(附代码下载)
关注公众号:悟空聊架构,
回复pmp,领取pmp资料!
回复悟空,领取架构师资料!
关注我,带你每天进步一点点!
07.深入浅出 Spring Boot - 数据访问之Mybatis(附代码下载)的更多相关文章
- 06.深入浅出 Spring Boot - 数据访问之Druid
代码下载:https://github.com/Jackson0714/study-spring-boot.git 一.Druid是什么? 1.Druid是数据库连接池,功能.性能.扩展性方面都算不错 ...
- Spring Boot 数据访问集成 MyBatis 与事物配置
对于软件系统而言,持久化数据到数据库是至关重要的一部分.在 Java 领域,有很多的实现了数据持久化层的工具和框架(ORM).ORM 框架的本质是简化编程中操作数据库的繁琐性,比如可以根据对象生成 S ...
- Spring Boot数据访问之整合Mybatis
在Mybatis整合Spring - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中谈到了Spring和Mybatis整合需要整合的点在哪些方面,需要将Mybatis中数据库连接池等相关对 ...
- Spring Boot数据访问之动态数据源切换之使用注解式AOP优化
在Spring Boot数据访问之多数据源配置及数据源动态切换 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中详述了如何配置多数据源及多数据源之间的动态切换.但是需要读数据库的地方,就 ...
- Spring Boot数据访问之多数据源配置及数据源动态切换
如果一个数据库数据量过大,考虑到分库分表和读写分离需要动态的切换到相应的数据库进行相关操作,这样就会有多个数据源.对于一个数据源的配置在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的 ...
- Spring Boot数据访问之Druid连接池的配置
在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中数据源连接池方式缺省(type)情况下默认使用HikariCP,那不缺省如何配置呢?我们 ...
- Spring Boot数据访问之数据源自动配置
Spring Boot提供自动配置的数据访问,首先体验下,Spring Boot使用2.5.5版本: 1)导入坐标: 2.5.25版本支持8.0.26mysql数据库驱动.spring-boot-st ...
- Spring Boot 框架下使用MyBatis访问数据库之基于XML配置的方式
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...
- Spring04-SpringEL&Spring JDBC数据访问
一. SpringEL入门 Spring动态语言(简称SpEL) 是一个支持运行时查询和操作对象图的强大的动态语言,语法类似于EL表达式,具有诸如显示方法和基本字符串模板函数等特性. 1. 准备工作 ...
随机推荐
- mac环境下创建bash_profile文件并写入内容 更改php环境变量
1. 启动终端Terminal 2. 进入当前用户的home目录 输入cd ~ 3. 创建.bash_profile 输入touch .bash_profile 4. 编辑.bash_profile文 ...
- svn http
yum install -y httpd subversion mod_dav_svn mkdir -p /var/lib/svn cd /var/lib/svn svnadmin create de ...
- Docker系列四: 使用UI管理docker容器
一.什么是Portainer? Portainer是Docker的图形化管理工具,提供状态显示面板.应用模板快速部署.容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作).事件日志显示.容 ...
- 系统学习Javaweb9----BootStrap1
学习内容: 1.BootStrap的简述 2.BootStrap环境搭建 3.BootStrap环境搭建-基本模板创建 4.BootStrap环境搭建-基本模板讲解 5.BootStrap布局容器 6 ...
- slqmap简单使用
网址:-u 指定哪个参数:-p 需要登录用--cookie 获得所有数据库:--dbs 获得所有用户:--users 指定某个数据库:-D 显示所有表--tables 指定某个数据表:-T 显示列:- ...
- vs编译完提示不支持尝试的执行操作
最近公司在用MFC做项目,编译完就弹窗提示,不支持尝试的执行操作,开始没注意,但是点击弹窗提示无反应: 问题原因:dialog里的控件有的已经删除了,但是DoDataExchange函数还存在控件的关 ...
- [LC] 102. Binary Tree Level Order Traversal
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- Array.prototype.slice.call()方法的理解
1.基础1)slice() 方法可从已有的数组中返回选定的元素. start:必需.规定从何处开始选取.如果是负数,那么它规定从数组尾部开始算起的位置.也就是说,-1 指最后一个元素,-2 指倒数第二 ...
- 【转】Mac下显示User下的资源Library
在Mac OS 中Library文件夹是默认不显示的,这对普通用户来说是有好处的,可以防止用户误操作删除Library文件夹,但对于iOS的开发者来说是非常麻烦的,特别是ArcGIS Runtime ...
- LeetCode Day 2
LeetCode0004 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 n ...