Spring全家桶系列--SpringBoot与Mybatis结合

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Spring全家桶系列--SpringBoot与Mybatis结合

Mybatis 是一个持久层ORM框架,负责Java与数据库数据交互,也可以简易理解为中介,相对于它,还有个中介是hibernate,不过在mybatis中sql语句的灵活性,可优化性比较强,这也是现在大多数人选择的原因。


1. mapper.xml、dao接口、实体类自动生成


下载 :

https://pan.baidu.com/s/1JY7Xduk5E3KPm58AjnueuQ 工具包


image.png


1.1 修改配置文件generator.xml


解压之后,这里把文件拷贝到了C:\resources\generator文件夹下,以下称为"当前文件目录"


一次配置,终身受益

generator.xml


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
  3. <generatorConfiguration>
  4.    <!-- 数据库驱动包位置 也就是刚解压的文件的位置加上 mysql-connector-java-5.1.34.jar-->
  5.    <classPathEntrylocation="C:\resources\generator\mysql-connector-java-5.1.34.jar"/>
  6.    <!--这里也适用Oracle数据库的自动生成-->
  7.    <!-- <classPathEntry location="C:\resources\generator\ojdbc6.jar" /> -->
  8.    <contextid="DB2Tables"targetRuntime="MyBatis3">
  9.        <commentGenerator>
  10.            <!-- 去除生成日期 -->
  11.            <propertyname="suppressDate"value="true"/>
  12.            <!-- 去除所有的注解 -->
  13.            <propertyname="suppressAllComments"value="true"/>
  14.        </commentGenerator>
  15.        <!-- 数据库链接URL、用户名、密码 -->
  16.        <jdbcConnectiondriverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/ceilan"userId="root"password="123456">
  17.        <!-- <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@localhost:1521:orcl" userId="scott" password="tiger">-->
  18.        </jdbcConnection>
  19.        <!--java类型处理器-->
  20.        <javaTypeResolver>
  21.            <propertyname="forceBigDecimals"value="false"/>
  22.        </javaTypeResolver>
  23.        <!-- 生成模型的包名和位置 -->
  24.        <javaModelGeneratortargetPackage="com.example.entity"targetProject="C:\resources\generator\src">
  25.            <propertyname="enableSubPackages"value="true"/>
  26.            <propertyname="trimStrings"value="true"/>
  27.        </javaModelGenerator>
  28.        <!-- 生成的映射文件包名和位置 -->
  29.        <sqlMapGeneratortargetPackage="mapping"targetProject="C:\resources\generator\src">
  30.            <propertyname="enableSubPackages"value="true"/>
  31.        </sqlMapGenerator>
  32.        <!-- 生成DAO的包名和位置 -->
  33.        <javaClientGeneratortype="XMLMAPPER"targetPackage="com.example.dao"targetProject="C:\resources\generator\src">
  34.            <propertyname="enableSubPackages"value="true"/>
  35.        </javaClientGenerator>
  36.        <!-- 要生成哪个表,更改tableName(数据库里表名)和domainObjectName(实体名,一般首字母大写)就可以 -->
  37.        <tabletableName="area"domainObjectName="Area"enableCountByExample="false"enableUpdateByExample="false"enableDeleteByExample="false"enableSelectByExample="false"selectByExampleQueryId="false"/>
  38.    </context>
  39. </generatorConfiguration>


1.2 用Java运行自动生成


在当前目录下打开cmd命令,运行如下

注 : windows系统可直接执行 [ 生成.bat ] 批处理文件


  1. java -jar mybatis-generator-core-1.3.2.jar-configfile generator.xml -overwrite


image.png


然后把当前目录src下的com文件夹拷贝到项目文件夹下

把mapping文件拷贝到resources文件夹下


image.png


目录结构如上


2.集成Mybatis框架


2.1 引入依赖


  1. compile "mysql:mysql-connector-java:5.1.39"
  2. compile 'org.mybatis.spring.boot:mybatis-spring-boot-starter:1.2.0'


2.2 启动类DemoApplication.java增加扫描配置


  1. package com.example;

  2. import org.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.web.bind.annotation.RequestMapping;

  6. @SpringBootApplication
  7. // mapper接口 扫描包配置
  8. @MapperScan(value ="com.example.dao")
  9. publicclassDemoApplication{
  10.    publicstaticvoid main(String[] args){
  11.        SpringApplication.run(DemoApplication.class, args);
  12.    }
  13. }


2.3 添加项目首页index.html


在resources的templates文件中新建index.html


index.html


  1. <!DOCTYPE html>
  2. <htmllang="en">
  3. <head>
  4.    <metacharset="UTF-8">
  5.    <title>Title</title>
  6. </head>
  7. <body>
  8.    <h1>Welcome SpringBoot</h1>
  9. </body>
  10. </html>

然后在 DemoApplication 启动类中添加

  1.    //欢迎页面 首页
  2.    @RequestMapping("/")
  3.    publicString index(){
  4.        return"index";
  5.    }

之前已经在application.yml中配置了资源映射设置,如下

  1. spring:
  2.  mvc:
  3.    view:
  4.      suffix:.html
  5.  resources:
  6.    static-locations: classpath:/templates


所以现在的项目启动访问 http://localhost:8080/ 是可以直接访问到首页的


3.添加业务层和控制层实现CRUD(增删改查)


增加业务逻辑层包service以及在其下增加impl包用来实现其接口


3.1业务逻辑层接口 AreaService.java


  1. package com.example.service;

  2. import com.example.entity.Area;

  3. /**
  4. * 这里给dao层的代码拷贝过来先使用
  5. * created by cfa  2018-11-08 下午 9:56
  6. **/
  7. publicinterfaceAreaService{


  8.    int deleteByPrimaryKey(Integer id);

  9.    int insert(Area record);

  10.    int insertSelective(Area record);

  11.    Area selectByPrimaryKey(Integer id);

  12.    int updateByPrimaryKeySelective(Area record);

  13.    int updateByPrimaryKey(Area record);
  14. }


3.2业务层实现类 AreaServiceImpl.java


  1. package com.example.service.impl;

  2. import com.example.dao.AreaMapper;
  3. import com.example.entity.Area;
  4. import com.example.service.AreaService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;

  7. import java.io.Serializable;

  8. /**
  9. * 这里的@Service注解相当于自动注册到Spring的Bean
  10. * 相当于原来的Application.xml里的 <bean id="areaServiceImpl" class="com.example.service.impl.AreaServiceImpl"/>
  11. * created by cfa  2018-11-08 下午 9:58
  12. **/
  13. @Service
  14. publicclassAreaServiceImplimplementsAreaService,Serializable{

  15.    privatefinalAreaMapper areaMapper;

  16.    @Autowired
  17.    publicAreaServiceImpl(AreaMapper areaMapper){
  18.        this.areaMapper = areaMapper;
  19.    }

  20.    @Override
  21.    publicint deleteByPrimaryKey(Integer id){
  22.        return areaMapper.deleteByPrimaryKey(id);
  23.    }

  24.    @Override
  25.    publicint insert(Area record){
  26.        return areaMapper.insert(record);
  27.    }

  28.    @Override
  29.    publicint insertSelective(Area record){
  30.        return areaMapper.insertSelective(record);
  31.    }

  32.    @Override
  33.    publicArea selectByPrimaryKey(Integer id){
  34.        return areaMapper.selectByPrimaryKey(id);
  35.    }

  36.    @Override
  37.    publicint updateByPrimaryKeySelective(Area record){
  38.        return areaMapper.updateByPrimaryKeySelective(record);
  39.    }

  40.    @Override
  41.    publicint updateByPrimaryKey(Area record){
  42.        return areaMapper.updateByPrimaryKey(record);
  43.    }
  44. }


3.3控制层的AreaController.java


  1. package com.example.controller;


  2. import com.example.entity.Area;
  3. import com.example.service.AreaService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;

  7. @RestController
  8. @RequestMapping("area")
  9. publicclassAreaController{

  10.    privatefinalAreaService areaService;

  11.    @Autowired
  12.    publicAreaController(AreaService areaService){
  13.        this.areaService = areaService;
  14.    }

  15.    @RequestMapping("query")
  16.    publicArea areaList(){
  17.        return areaService.selectByPrimaryKey(1);
  18.    }

  19. }


看到这里,想必看到很多次@Autowired,@Service等注解了,这就是Spring的两大核心之一的IOC(Inversion of Control),也就是DI依赖注入;


Spring的两大核心AOP和IOC大家面试的时候也基本都有问到,到这里你IOC就不用头疼了;


在Spring之前我们写代码,用到某个类,我们都需要去new一下,现在有个叫Spring,我把控制权交给它,OK,然后在给业务层盖上章(加注解),然后让这个叫Spring的家伙开始工作的时候,交给他去做,控制层需要逻辑A,OK,之前我们已经在控制层用DI注入了A,Spring就会把A的调用给控制层,下面说松紧耦合度,Spring之前,到处写的都是new新建对象,修改一个类很难,现在随意修改,只需要盖个章(DI),让Spring去管就可以了,你现在要问我原理,那些文邹邹的,后续在研究研究,原理相当于文言文,只有研究透了,才能用大家都理解的话写出来。


业务层提供的接口加实现类就是为了实现松耦合,不然一个类就解决了,就像一个手机,坏了,里面的电池,屏幕,主板什么的拆下来还能用,这就是松耦合。


4.热部署插件


问题1:开发人员每次修改了一个java文件就需要重启tomcat,开发效率很低是不?


答:Jrebel热部署插件解决你的问题:

https://mp.weixin.qq.com/s/4Gu5xWWnqtXAoXYDLVmXMA


问题2:你为什么不选择springboot自带的热部署插件


答: 和之前的朋友问我的一样,问我为啥不把生成代码的插件放在项目中,一个项目还好,你要是写了多个项目,一个一个去部署,麻烦不,所以一次配置,一劳永逸。


5.关于AOP——Spring的又一大核心


面向切面编程(AOP是Aspect Oriented Program的首字母缩写)我们知道,面向对象的特点是继承、多态和封装.而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配.实际上也就是说,让不同的类设计不同的方法。这样代码就分散到一个个的类中去了。


这样做的好处是降低了代码的复杂程度,使类可重用.但是人们也发现,在分散代码的同时,也增加了代码的重复性.什么意思呢?比如说,我们在两个类中,可能都需要在每个方法中做日志。按面向对象的设计方法,我们就必须在两个类的方法中都加入日志的内容。也许他们是完全相同的,但就是因为面向对象的设计让类与类之间无法联系,而不能将这些重复的代码统一起来。


也许有人会说,那好办啊,我们可以将这段代码写在一个独立的类独立的方法里,然后再在这两个类中调用。但是,这样一来,这两个类跟我们上面提到的独立的类就有耦合了,它的改变会影响这两个类。那么,有没有什么办法,能让我们在需要的时候,随意地加入代码呢?这种在运行时,动态地将代码切入到类的指定方法、 指定位置上的编程思想就是面向切面的编程。


一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。


这样看来,AOP其实只是OOP的补充而已。OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中加入特定的代码。有了AOP,OOP变得立体了。如果加上时间维度,AOP使OOP由原来的二维变为三维了,由平面变成立体了。从技术上来说,AOP基本上是通过代理机制实现的。


AOP在编程历史上可以说是里程碑式的,对OOP编程是一种十分有益的补充 引自:http://xiaobashagua.iteye.com/blog/1963683你问我为啥排这么紧,哈哈,好东西是留给有耐心的人看的,如果你把这篇文章的IOC和AOP仔细看了,你会对这俩的理解又深了一个层次


5.小叙


本文代码已上传:


Github:https://github.com/cuifuan/springboot-demo


如果你是来学框架怎么写CRUD的,我错了,没让你看到具体的,我在写的是在写代码的时候,对插件工具的使用,和了解这些东西的作用,提高开发效率,并且知道自己用的是什么以及基本原理,而不是仅仅是一个“码农”,谢谢阅览。



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
Java 数据库连接 数据库
spring和Mybatis的逆向工程
通过本文的介绍,我们了解了如何使用Spring和MyBatis进行逆向工程,包括环境配置、MyBatis Generator配置、Spring和MyBatis整合以及业务逻辑的编写。逆向工程极大地提高了开发效率,减少了重复劳动,保证了代码的一致性和可维护性。希望这篇文章能帮助你在项目中高效地使用Spring和MyBatis。
7 1
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
56 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
67 2
|
1月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
109 1
|
1月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
28 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
1月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
27 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
1月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
97 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
1月前
|
Java 测试技术 Spring
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
这篇文章介绍了Spring Boot中配置文件的语法、如何读取配置文件以及如何通过静态工具类读取配置文件。
61 0
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
|
1月前
|
SQL Java 数据库连接
mybatis使用二:springboot 整合 mybatis,创建开发环境
这篇文章介绍了如何在SpringBoot项目中整合Mybatis和MybatisGenerator,包括添加依赖、配置数据源、修改启动主类、编写Java代码,以及使用Postman进行接口测试。
17 0
mybatis使用二:springboot 整合 mybatis,创建开发环境
|
1月前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
105 0
下一篇
无影云桌面