SpringBoot第六篇:整合通用Mapper
作者:追梦1819
原文:https://www.cnblogs.com/yanfei1819/p/10876339.html
版权声明:本文为博主原创文章,转载请附上博文链接!
引言
在以往的项目中,对于dao层的常规 CRUD 操作,我们通常使用 JPA、JDBC 时会做一个所谓的 BaseDaoMapper 以减少代码量。而通用 Mapper 刚好是这一环节的替代品,代码更简单,更优雅,也是 Mybatis 用的很广泛的一个插件。
不过需要注意的一点是,通用 Mapper 支持单表操作,不支持通用的多表联合查询。
使用
下面通过用增删改查的简单示例,演示 Mapper 的用法,本系列的demo都是按照 Java web 的项目架构来,所以还是按照 MVC 的模式进行。不过注意,因为此处只是为了演示最基本的功能。为了防止舍本逐末,故代码作了最简单的优化,只保留最基本的功能代码,实际业务代码可能会复杂得多。
准备工作,初始化数据库:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`age` int(3) NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 50 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (14, 'admin', 21);
INSERT INTO `user` VALUES (48, 'teacher', 20);
INSERT INTO `user` VALUES (49, 'student', 22);
SET FOREIGN_KEY_CHECKS = 1;
创建 SpringBoot 项目。
首先,引入maven依赖(因为通用 Mapper 是建立在 Mybatis 的基础上的,所以在引入 Mapper 之前,必须先引入Mybatis 依赖):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
然后,配置数据库信息:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.1.88:3306/test?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=pass123
下一步,创建实体类以作数据库映射:
package com.yanfei1819.mybatismapperdemo.entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* Created by 追梦1819 on 2019-05-07.
*/
@Table(name = "user")
public class User {
@Id
@GeneratedValue(generator = "JDBC") // 自增字段
private Long id;
private String name;
private int age;
// set/get 省略
}
上述的注解:
@Table(name = "user")映射数据表名@Id主键id@GeneratedValue(generator = "JDBC")自增字段这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段)。 这种情况对应的xml类似下面这样:
<insert id="insertAuthor" useGeneratedKeys="true" keyProperty="id">
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
</insert>
如果表字段与实体类属性不一致,可以用注解
再下一步,创建代理接口:
package com.yanfei1819.mybatismapperdemo.dao;
import com.yanfei1819.mybatismapperdemo.entity.User;
import tk.mybatis.mapper.common.Mapper;
/**
* Created by 追梦1819 on 2019-05-07.
*/
@org.apache.ibatis.annotations.Mapper
public interface UserMapper extends Mapper<User> {
}
该接口就是通用 Mapper 的核心部分。该接口继承 Mapper。
再者,创建service层接口和实现类:
package com.yanfei1819.mybatismapperdemo.service;
import com.yanfei1819.mybatismapperdemo.entity.User;
import java.util.List;
/**
* Created by 追梦1819 on 2019-05-07.
*/
public interface UserService {
int insertUser(User user);
int updateUser(User user);
int deleteUser(Long id);
List<User> listUsers();
User getUserById(Long id);
}
实现类:
package com.yanfei1819.mybatismapperdemo.service.impl;
import com.yanfei1819.mybatismapperdemo.dao.UserMapper;
import com.yanfei1819.mybatismapperdemo.entity.User;
import com.yanfei1819.mybatismapperdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* Created by 追梦1819 on 2019-05-07.
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public int insertUser(User user) {
return userMapper.insert(user);
}
@Override
public int updateUser(User user) {
return userMapper.updateByPrimaryKey(user);
}
@Override
public int deleteUser(Long id) {
return userMapper.deleteByPrimaryKey(id);
}
@Override
public List<User> listUsers() {
return userMapper.selectAll();
}
@Override
public User getUserById(Long id) {
return userMapper.selectByPrimaryKey(id);
}
}
最后,创建controller层:
package com.yanfei1819.mybatismapperdemo.web.controller;
import com.yanfei1819.mybatismapperdemo.entity.User;
import com.yanfei1819.mybatismapperdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Created by 追梦1819 on 2019-05-07.
*/
@RestController
public class UserController {
@Autowired
private UserService service;
@GetMapping("/listUsers")
public List<User> listUser(){
return service.listUsers();
}
@GetMapping("/getUserById/{id}")
public User getUserById(@PathVariable Long id){
return service.getUserById(id);
}
@PostMapping("/insertUser")
public int insertUser(User user){
return service.insertUser(user);
}
@PostMapping("/updateUser")
public int updateUser(User user){
return service.updateUser(user);
}
@GetMapping("/deleteUser/{id}")
public int deleteUser(@PathVariable Long id){
return service.deleteUser(id);
}
}
启动类是:
package com.yanfei1819.mybatismapperdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//import tk.mybatis.spring.annotation.MapperScan; // 注意此处引入的jar
@SpringBootApplication
//@MapperScan("com.yanfei1819.mybatismapperdemo.db")
public class MybatisMapperDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisMapperDemoApplication.class, args);
}
}
要注意一点, UserMapper 接口中的 @org.apache.ibatis.annotations.Mapper 注解可以被启动类中的注解 @MapperScan(value = {"com.yanfei1819.mybatismapperdemo.db.*"}) 代替。
但是这里要注意一个坑,使用了通用 Mapper 的导入的 @MapperScan 的jar包,不再是 import org.mybatis.spring.annotation.MapperScan;,而是 import tk.mybatis.spring.annotation.MapperScan; ,不然会报错。
启动项目,可测试结果。
常用API
此处列举一些常用的API:
增
int insert(T record);保存一个实体,null的属性也会保存,不会使用数据库默认值int insertSelective(T record);保存一个实体,null的属性不会保存,会使用数据库默认值查
List<T> selectAll();查询全部结果T selectByPrimaryKey(Object key);根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号List<T> selectByExample(Object example);根据Example条件进行查询List<T> select(T record);根据实体中的属性值进行查询,查询条件使用等号T selectOne(T record);根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号int selectCount(T record);根据实体中的属性查询总数,查询条件使用等号改
int updateByPrimaryKey(T record);根据主键更新实体全部字段,null值会被更新int updateByExample(@Param("record") T record, @Param("example") Object example);根据Example条件更新实体record包含的全部属性,null值会被更新int updateByPrimaryKeySelective(T record);根据主键更新属性不为null的值删
int deleteByPrimaryKey(Object key);根据主键字段进行删除,方法参数必须包含完整的主键属性int delete(T record);根据实体属性作为条件进行删除,查询条件使用等号int deleteByExample(Object example);根据Example条件删除数据
参考
文档一:https://mapperhelper.github.io/docs
文档二:https://github.com/abel533/Mapper
总结
项目中常规的增删改查是避免不了的,而且逻辑几乎不变。如果每一个增删改查都写一个方法,那冗余代码想必不少。即使是代码生成器生成代码【参考本人博客:SpringBoot第八篇:整合 MyBatis-Generator】,也是不利于代码的拓展的。
针对这个问题,有很多解决方案,甚至自己封装一个通用方法,也未尝不可(本人工作初期,项目中所用的基本都是这种解决方案)。不过在多方案中,个人还是比较喜欢通用 Mapper,一是它与 MyBatis 无缝对接;二是代码量极少,无需配置;当然,更重要的是,已经有现成的轮子了,何必再重复去造轮子呢?
源码:我的GitHub
<全文完>

SpringBoot第六篇:整合通用Mapper的更多相关文章
- Mybatis整合通用Dao,Mybatis整合通用Mapper,MyBatis3.x整合通用 Mapper3.5.x
Mybatis整合通用Dao,Mybatis整合通用Mapper,MyBatis3.x整合通用 Mapper3.5.x ============================== 蕃薯耀 2018年 ...
- Springboot整合通用mapper
通用Mapper的分享使用 参考博客 Mybatis的通用mapper和Hibernate一样都实现了JPA接口,简化了数据库的操作 和Hibernate的对比 Hibernate和Mybatis都是 ...
- Springboot 整合通用mapper和pagehelper展示分页数据(附github源码)
简介 springboot 设计目的就是为了加速开发,减少xml的配置.如果你不想写配置文件只需要在配置文件添加相对应的配置就能快速的启动的程序. 通用mapp 通用mapper只支持对单表的操作,对 ...
- SpringBoot快速整合通用Mapper
前言 后端业务开发,每个表都要用到单表的增删改查等通用方法,而配置了通用Mapper可以极大的方便使用Mybatis单表的增删改查操作. 通用mapper配置 1.添加maven: <depen ...
- (一 、上)搭建简单的SpringBoot + java + maven + mysql + Mybatis+通用Mapper 《附项目源码》
最近公司一直使用 springBoot 作为后端项目框架, 也负责搭建了几个新项目的后端框架.在使用了一段时间springBoot 后,感觉写代码 比spring 更加简洁了(是非常简洁),整合工具也 ...
- Spring Boot从入门到实战:整合通用Mapper简化单表操作
数据库访问是web应用必不可少的部分.现今最常用的数据库ORM框架有Hibernate与Mybatis,Hibernate貌似在传统IT企业用的较多,而Mybatis则在互联网企业应用较多.通用Map ...
- SpringBoot(十六)_springboot整合JasperReport6.6.0
现在项目上要求实现套打,结果公司里有个人建议用JaperReport进行实现,就进入这个东西的坑中.好歹经过挣扎现在已经脱离此坑中.现在我也是仅能实现读取数据库数据转成pdf进行展示,包括中文的展示. ...
- 十一、springboot(六)整合Thymeleaf
1.添加jar包依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId ...
- SpringBoot第七篇:整合Mybatis-Plus
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10881666.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 一看这个名 ...
随机推荐
- angularjs $http提交数据探索
前两天在搞自己的项目,前端js框架用的是angularjs框架:网站整的差不多的时候出事了:那就是当我用$http.post()方法向服务器提交一些数据的时候:后台总是接收不到数据: 于是采用了其他方 ...
- jQuery查找子元素与后代元素
1. 子元素: $().children('选择器') 如选择type为file的子元素 $(this).children("input[type=file]") 或者 $(& ...
- 英语发音规则---Y字母
英语发音规则---Y字母 一.总结 一句话总结: 1.Y字母在单词最前面读发[j]? yes /jes/ [jɛs] n. 是 yard /jɑːd/ [jɑd] n. 院子 yellow /'jel ...
- Python基础-处理json函数
#json是一种通用的数据类型,所有的语言都认识#json是一个字符串,json串里面都得是双引号,主要是这四个函数 #dump#dumps#load#loads import jsonnames = ...
- JavaUtil_01_MD5加密
一.百度翻译MD5工具类 昨天做java微信开发,引用百度翻译API给公众号添加翻译功能时,需要使用MD5生成签名.注意,使用MD5生成签名后一定要转成小写,不然百度翻译后台不会认你这个签名的,会报无 ...
- [原]NYOJ-括号匹配-2(java)
大学生程序代写 //http://acm.nyist.net/JudgeOnline/problem.php?pid=2 括号配对问题 时间限制:3000 ms | 内存限制:65535 KB ...
- 求解范围中 gcd(a,b)== prime 的有序对数
题目: 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 输入: 一个整数N. 输出: 如题. Sample Input 4 Sample Output ...
- poj2420 A Star not a Tree? 模拟退火
题目大意: 给定n个点,求一个点,使其到这n个点的距离最小.(\(n \leq 100\)) 题解 模拟退火上 #include <cmath> #include <cstdio&g ...
- bzoj 1069: [SCOI2007]最大土地面积 凸包+旋转卡壳
题目大意: 二维平面有N个点,选择其中的任意四个点使这四个点围成的多边形面积最大 题解: 很容易发现这四个点一定在凸包上 所以我们枚举一条边再旋转卡壳确定另外的两个点即可 旋(xuan2)转(zhua ...
- POJ1379:Run Away
我对模拟退火的理解:https://www.cnblogs.com/AKMer/p/9580982.html 我对爬山的理解:https://www.cnblogs.com/AKMer/p/95552 ...