当前位置: 首页 > news >正文

Springboot集成Mybatisplus,轻松CRUD

前言

作为业务开发,和数据库交互,对业务数据进行CRUD的操作就是项目中最常见的要求了,从最原始的JDBC的操作,到现在的最广泛的JPA,Hibernete, MyBatis等ORM的架构;无不都是在实现和数据库进行交互的实现; 在我们的业务开发里,数据库作为业务数据和用户数据的最终落地的归宿;使得我们的数据库CRUD操作成为一个程序员不可缺少的工作要求; 虽然笔者觉得CRUD是个不需要太多技术要求的工作;但是作为程序员我们还是必须掌握这个技巧;今天的这个文章就给新入门的朋友,介绍一下在Springboot的开发架构中如何使用Mybatisplus进行业务上的CRUD实现;

Mybatisplus

Mybatisplus不是一个独立的产品,他是在Mybatis这个ORM的工具上进行了更高应用方面封装和扩展的一个增强开发工具包;他的所有技术的支持点还是Mybatis;所以要在这个CRUD上进行更深入的探究的话,还是要回归大Mybatis本身上,和ORM这个技术领域上,这个就不在本文章的范畴之内了; 总的来说,Mybatisplus的目的就是为了提高程序员的使用Mybatis进行数据库的CRUD项目的开发效率;本文就是介绍Mybatisplus的开发工程

引入依赖包

需要在Pom.xml里引入mybatis的springboot包

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>

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<City> {
    public List<City> listMonths(string userid);
}

以上是Mybatis的SQL文件,可以通过namespace将两者绑定在一起;

<mapper namespace="com.joinsun.application.codeman.citymanagement.repos.dao.CityDao ">

    <select id="listMonths" resultType="com.joinsun.application.codeman.citymanagement.model.vo.CityVo">
		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
		<if test="null != userId">
			d.userId = #{userid}
		</if>
		GROUP BY `key`
		<if test="null == userId">
			,d.`user_id`
		</if>
		ORDER BY `key` DESC
    </select>

</mapper>

通过上面的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<CityVo> 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接口进行动态代理的过程,这两个个方面都是稍高级的话题,特别是第二个话题,需要朋友们有一定的开发基础和经验以后才比较方便的能够讲解的清楚; 在以后的文章中,如果有朋友需要,我会进一步去探究上面两个高级话题。

歇息大家继续关注。

相关文章:

  • IDEA生成时序图和类图(案例超详解)
  • 笔试选择题-树
  • 用神经网络模拟3个距离为0的粒子
  • 【重识云原生】第六章容器6.1.10节——DockerFile解析
  • 20220910编译ITX-3588J的Buildroot的系统1(编译uboot)
  • 100 ECMAScript6数组方法
  • 循环神经网络
  • web安全常见漏洞 之CSRF
  • 【面试题 - mysql】进阶篇 - 分库分表
  • 中秋节——嫦娥奔月
  • 文件的上传下载
  • 数学建模学习(101):车辆路线规划问题
  • 为Ubuntu网页设置稳定的数据隧道
  • 通宵三天 我做了一个超级好玩的中秋节小游戏
  • 都这麽大了还不快了解防火墙?
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 5、React组件事件详解
  • Angular 响应式表单之下拉框
  • CentOS7 安装JDK
  • centos安装java运行环境jdk+tomcat
  • ES6核心特性
  • ES6之路之模块详解
  • go语言学习初探(一)
  • If…else
  • Invalidate和postInvalidate的区别
  • Java,console输出实时的转向GUI textbox
  • JavaScript 基本功--面试宝典
  • Java应用性能调优
  • JSONP原理
  • MobX
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • MYSQL 的 IF 函数
  • PAT A1120
  • PermissionScope Swift4 兼容问题
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • python 装饰器(一)
  • XForms - 更强大的Form
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 通信类
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 用简单代码看卷积组块发展
  • 在Mac OS X上安装 Ruby运行环境
  • 数据可视化之下发图实践
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #每日一题合集#牛客JZ23-JZ33
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (2)STL算法之元素计数
  • (4)logging(日志模块)
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (简单) HDU 2612 Find a way,BFS。
  • (排序详解之 堆排序)
  • (三分钟)速览传统边缘检测算子
  • (循环依赖问题)学习spring的第九天
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介