前言
文章图片
作为业务开发,和数据库交互,对业务数据进行CRUD的操作就是项目中最常见的要求了,从最原始的JDBC的操作,到现在的最广泛的JPA,Hibernete, MyBatis等ORM的架构;无不都是在实现和数据库进行交互的实现; 在我们的业务开发里,数据库作为业务数据和用户数据的最终落地的归宿;使得我们的数据库CRUD操作成为一个程序员不可缺少的工作要求; 虽然笔者觉得CRUD是个不需要太多技术要求的工作;但是作为程序员我们还是必须掌握这个技巧;今天的这个文章就给新入门的朋友,介绍一下在Springboot的开发架构中如何使用Mybatisplus进行业务上的CRUD实现;
Mybatisplus Mybatisplus不是一个独立的产品,他是在Mybatis这个ORM的工具上进行了更高应用方面封装和扩展的一个增强开发工具包;他的所有技术的支持点还是Mybatis;所以要在这个CRUD上进行更深入的探究的话,还是要回归大Mybatis本身上,和ORM这个技术领域上,这个就不在本文章的范畴之内了; 总的来说,Mybatisplus的目的就是为了提高程序员的使用Mybatis进行数据库的CRUD项目的开发效率;本文就是介绍Mybatisplus的开发工程
文章图片
【微服务|Springboot集成Mybatisplus,轻松CRUD】
引入依赖包 需要在Pom.xml里引入mybatis的springboot包
com.baomidou
mybatis-plus-boot-starter
xxxx-starter这个是springboot开发项目中非常常见的依赖,在项目的pom.xml中经常可以看到各式各样的starter,这些starter都是基于springboot技术的组件,通常都是在某个功能上面进行使用autoconfiguration的机制来扩展项目的功能的;同样的这个mybatis-plus-boot-starter就是用来让项目通过autoconfiguration来集成mybatisplus的功能的。
项目配置文件 在项目的springboot配置文件里,添加有关数据库的配置
spring:
datasource:
url: jdbc:mysql://${datasource.ip}:13306/codeman?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
username: ${datasource.username}
password: ${datasource.password}
driver-class-name: com.mysql.cj.jdbc.Driver
通过以上的配置,我们在项目里就配置了一个JDBC访问的数据库源信息; 在Spingboot启动的时候,会加重以上的配置信息;这个spring.datasource会成为默认的datasource的Bean实例;在上面的配置中,我们使用的是mysql的数据库,用的是com.mysql.cj.jdbc.Driver的驱动
实体类定义 Mybatis是一个ORM的架构,通过机制实现Object和Table Relation的映射关系,这样通过ORM建立的机制,我们就可以向操作数据对象的方式一样来操作数据库里的表; 实体类也就是操作的基体
/**
* 省市
*/
@Setter
@Getter
@TableName("db_codeman_city_test")
public class City extends SuperEntity {/**
* 城市数据库ID,不要使用,使用cityCode
*
* 前端忽略,忽略,忽略
*
* 后端也请尽量忽略本字段的使用,统一使用cityCode
*
* cityDao.getCityByCode(cityCode);
*/
@TableId(type = IdType.AUTO)
private String id;
/**
* 省名称
*/
private String provinceName;
/**
* 市名称
*/
private String name;
}
以上的代码注意几点
使用@TableName可以进行表名的映射;支持驼峰命名
字段默认会进行数据库字段的映射,支持驼峰命名
定义Mapper接口 Mapper接口是数据库访问层的接口定义,也是Mybatis的SQL映射文件和调用的入口接口定义
@Mapper
public interface CityDao extends BaseMapper {
public List listMonths(string userid);
}
以上是Mybatis的SQL文件,可以通过namespace将两者绑定在一起;
SELECT
SUM(IF(d.on_into = 1,duad.amount,0)) in_amount
,SUM(IF(d.on_into = 0,duad.amount,0)) out_amount
,DATE_FORMAT(d.create_time,'%Y-%m') `key`
,DATE_FORMAT(d.create_time,'%Y年%m月') `value`
,d.`user_id`
FROM `xxxxxx_detail` d,db_codeman_city_test a
WHERE a.id = d.id and d.`on_deleted` = 0
d.userId = #{userid}
GROUP BY `key`
,d.`user_id`
ORDER BY `key` DESC
通过上面的Mapper和SQL文件,调用CityDao接口的listMonths方法就可以调用到SQL文件中的这条SQL语句,参数通过#{userid}进行传递;
这里的底层实现非常的过瘾,熟悉了Spring的IOC机制和IOC过程后,就可以实现类似MybatisPlus的这样的实现了,动态的将SQL和interface进行绑定, 笔者就使用类似的实现方式,分别实现了ElasticSearch, MangoDB以及Redis的类似Mapper的实现;非常的过瘾,不过没有开源;
Service代码 到这里基本上已经算是和Mybatisplus没太多关系的步骤了,实现CRUD的操作,通过上面两步就已经实现了, Service这块的代码,是演示如何对我们集成实现的CRUD代码进行调用
@Slf4j
@Service
public class CityServiceImpl implements CityService {
@Autowired
CityDao cityDao;
@Override
public City selectById(String id) {
return cityDao.selectById(id);
}
@Override
public List summaryById(String userid) {
return cityDao.listMonths(userid);
}
@Override
public City createCity(City city) {
return cityDao.insert(city)
}
}
在Service的实现里面,可以看到通过Autowired方式IOC的装置一个CityDao对象,通过IOC的方式,这个CityDao我们本身定义的一个接口,并没有在任何地方去实现这个接口,但是通过Autowired以后,可以动态的代理处一个CityDao的对象,并且这个cityDao代理的对象可以通过listMonths调用到SQL查询;这个是使用的Java的动态代理的技术,所以这里的CityDao的对象是个动态的代理对象,如何产生的就是我上段说的,特别有意思的一段实现,有兴趣,有毅力的朋友们可以深入到代码的调用过程中,通过Debug的方式,追踪到底层的源代码里去看看实现的机制。
这样,我们可以在自己的Controller或者Job,或者消费者等代码里,通过调用CityService的接口,就能够完成CRUD的操作,对数据库进行使用了。
结束语 今天咱们的这个文章只是比较简单的从实战的方面,给大家介绍了在SpingBoot的项目中,使用MybatisPlus进行数据库的CRUD操作, 没有涉及到一些高级的应用,比如分页,数据库多租户, 批量操作,动态SQL, 自定义的Hook函数,以及拦截器等方面的高级使用; 另外还有上面两段提到的,MybatisPlus是如何通过动态代理的技术,自动的去对Mapper接口进行动态代理的过程,这两个个方面都是稍高级的话题,特别是第二个话题,需要朋友们有一定的开发基础和经验以后才比较方便的能够讲解的清楚; 在以后的文章中,如果有朋友需要,我会进一步去探究上面两个高级话题。
歇息大家继续关注。
文章图片
推荐阅读
- java|SpringBoot+MyBatisPlus
- springboot系列|【springboot系列】springboot整合mybatisplus实现CRUD
- jvm|关于JVM和JDK
- java|Spring Boot干货系列((一)优雅的入门篇 | 掘金技术征文)
- java|Java 中台技术盘点,这些技术你了解还远远不够
- java|朱晔的互联网架构实践心得S2E2(写业务代码最容易掉的10种坑 | 掘金年度征文...)
- Spring|猿创征文|Spring Boot运行原理及功能实现方式
- 笔记|15天完成民猫电商毕设——消息模块收尾(12th day)
- 前端|微信公众号支付(JSAPI)