SpringBoot2.x 自动化生成代码整合Mybatis

news2025/1/9 16:23:38

前言

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

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

下载 pan.baidu.com/s/1JY7Xduk5… 工具包

1.1 修改配置文件generator.xml

解压之后,这里把文件拷贝到了C:\resources\generator文件夹下,以下称为"当前文件目录"
一次配置,终身受益

generator.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!-- 数据库驱动包位置 也就是刚解压的文件的位置加上 mysql-connector-java-5.1.34.jar-->
    <classPathEntry location="C:\resources\generator\mysql-connector-java-5.1.34.jar" />
    <!--这里也适用Oracle数据库的自动生成-->
    <!-- <classPathEntry location="C:\resources\generator\ojdbc6.jar" /> -->
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <commentGenerator>
            <!-- 去除生成日期 -->
            <property name="suppressDate" value="true"/>
            <!-- 去除所有的注解 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!-- 数据库链接URL、用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/ceilan" userId="root" password="123456">
        <!-- <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@localhost:1521:orcl" userId="scott" password="tiger">-->
        </jdbcConnection>
        <!--java类型处理器-->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
        <!-- 生成模型的包名和位置 -->
        <javaModelGenerator targetPackage="com.example.entity" targetProject="C:\resources\generator\src">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- 生成的映射文件包名和位置 -->
        <sqlMapGenerator targetPackage="mapping" targetProject="C:\resources\generator\src">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <!-- 生成DAO的包名和位置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.dao" targetProject="C:\resources\generator\src">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <!-- 要生成哪个表,更改tableName(数据库里表名)和domainObjectName(实体名,一般首字母大写)就可以 -->
        <table tableName="area" domainObjectName="Area" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
    </context>
</generatorConfiguration>

1.2 用Java运行自动生成

在当前目录下打开cmd命令,运行如下
注 : windows系统可直接执行 [ 生成.bat ] 批处理文件

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

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

目录结构如上

2.集成Mybatis框架

2.1 引入依赖

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

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

package com.example;

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

@SpringBootApplication
// mapper接口 扫描包配置
@MapperScan(value = "com.example.dao")
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

2.3 添加项目首页index.html

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

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>Welcome SpringBoot</h1>
</body>
</html>

然后在 DemoApplication 启动类中添加

    //欢迎页面 首页
    @RequestMapping("/")
    public String index(){
        return "index";
    }

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

spring: 
  mvc:
    view:
      suffix: .html
  resources:
    static-locations: classpath:/templates

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

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

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

3.1业务逻辑层接口 AreaService.java

package com.example.service;

import com.example.entity.Area;

/**
 * 这里给dao层的代码拷贝过来先使用
 * created by cfa  2018-11-08 下午 9:56
 **/
public interface AreaService {

    int deleteByPrimaryKey(Integer id);

    int insert(Area record);

    int insertSelective(Area record);

    Area selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(Area record);

    int updateByPrimaryKey(Area record);
}

3.2业务层实现类 AreaServiceImpl.java

package com.example.service.impl;

import com.example.dao.AreaMapper;
import com.example.entity.Area;
import com.example.service.AreaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.Serializable;

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

    private final AreaMapper areaMapper;

    @Autowired
    public AreaServiceImpl(AreaMapper areaMapper) {
        this.areaMapper = areaMapper;
    }

    @Override
    public int deleteByPrimaryKey(Integer id) {
        return areaMapper.deleteByPrimaryKey(id);
    }

    @Override
    public int insert(Area record) {
        return areaMapper.insert(record);
    }

    @Override
    public int insertSelective(Area record) {
        return areaMapper.insertSelective(record);
    }

    @Override
    public Area selectByPrimaryKey(Integer id) {
        return areaMapper.selectByPrimaryKey(id);
    }

    @Override
    public int updateByPrimaryKeySelective(Area record) {
        return areaMapper.updateByPrimaryKeySelective(record);
    }

    @Override
    public int updateByPrimaryKey(Area record) {
        return areaMapper.updateByPrimaryKey(record);
    }
}

3.3控制层的AreaController.java

package com.example.controller;

import com.example.entity.Area;
import com.example.service.AreaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("area")
public class AreaController {

    private final AreaService areaService;

    @Autowired
    public AreaController(AreaService areaService) {
        this.areaService = areaService;
    }

    @RequestMapping("query")
    public Area areaList(){
        return areaService.selectByPrimaryKey(1);
    }

}

看到这里,想必看到很多次@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.热部署插件

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

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

面向切面编程(AOP是Aspect Oriented Program的首字母缩写)我们知道,面向对象的特点是继承、多态和封装.而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配.实际上也就是说,让不同的类设计不同的方法。这样代码就分散到一个个的类中去了。这样做的好处是降低了代码的复杂程度,使类可重用.但是人们也发现,在分散代码的同时,也增加了代码的重复性.什么意思呢?比如说,我们在两个类中,可能都需要在每个方法中做日志。按面向对象的设计方法,我们就必须在两个类的方法中都加入日志的内容。也许他们是完全相同的,但就是因为面向对象的设计让类与类之间无法联系,而不能将这些重复的代码统一起来。 也许有人会说,那好办啊,我们可以将这段代码写在一个独立的类独立的方法里,然后再在这两个类中调用。但是,这样一来,这两个类跟我们上面提到的独立的类就有耦合了,它的改变会影响这两个类。那么,有没有什么办法,能让我们在需要的时候,随意地加入代码呢?这种在运行时,动态地将代码切入到类的指定方法、 指定位置上的编程思想就是面向切面的编程。 一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。 这样看来,AOP其实只是OOP的补充而已。OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中加入特定的代码。有了AOP,OOP变得立体了。如果加上时间维度,AOP使OOP由原来的二维变为三维了,由平面变成立体了。从技术上来说,AOP基本上是通过代理机制实现的。 AOP在编程历史上可以说是里程碑式的,对OOP编程是一种十分有益的补充 引自:xiaobashagua.iteye.com/blog/196368…你问我为啥排这么紧,哈哈,好东西是留给有耐心的人看的,如果你把这篇文章的IOC和AOP仔细看了,你会对这俩的理解又深了一个层次

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【快速学习系列】Mybatis缓存和使用SpringBoot开启MyBatis缓存+ehcache

【快速学习系列】Mybatis缓存和使用SpringBoot开启MyBatis缓存ehcache Mybatis缓存 MyBatis一级缓存 Mybatis对缓存提供支持&#xff0c;但是在没有配置的默认情况下&#xff0c;它只开启一级缓存&#xff0c;一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一…

全员全域安全守护,蔚来ET7获Euro NCAP五星安全评级背后的硬核实力

2022年11月16日&#xff0c;蔚来智能电动旗舰轿车ET7 获得Euro NCAP&#xff08;欧盟新车安全评鉴协会&#xff09;五星安全评级&#xff0c;成为继ES8之后蔚来又一款获得欧洲五星安全评级的车型。ET7分别在乘客安全、儿童安全、弱势道路使用者安全、辅助安全得分91%、87%、73%…

两个事务并发写,能保证数据唯一吗?

哟&#xff0c;又是我小白。最近有点高产了。 连我自己都害怕了。 直接进入正题吧。 两个事务并发写&#xff0c;能保证数据唯一吗&#xff1f; 我先来解释下标题讲的是个啥。 我们假设有这么一个用户注册的场景。用户并发请求注册新用户。 你有一张数据库表&#xff0c;也就…

【数据可视化】第二章——基于matplotlib的数据可视化

目录系列课程学习目标1. 基于matplotlib的数据可视化2 matplotlib.pyplot函数库简介3 matplotlib.pyplot相关函数简介3.1 plt.plot(x, y, format_string, **kwargs)3.2 plt.title()3.3 plt.xlabel()/ylabel()3.4 plt.legend()3.5 pyplot的中文显示3.5.1 第一种方法3.5.2 第二种…

C#上位机系列(2)—常用控件的介绍:文本标签,按键,输入框

本文是讲解C#.net平台的Winform框架下的第二个内容&#xff0c;手把手介绍项目的创建方式以及一些写软件时常用的功能&#xff0c;讲解从零开始的每一个步骤。 本次介绍三个最常用控件的使用 1.文本控件Label 功能&#xff1a;显示一个文本 2.按键控件Button 功能&#x…

考研 | 组成原理【第二章】数据的表示和运算

考研 | 组成原理【第二章】数据的表示和运算 文章目录考研 | 组成原理【第二章】数据的表示和运算I. 数制与编码a. 进位计数制及其相互转换b. BCD码1. 8421码2. 余3码3. 2421码c. 无符号整数表示和运算1. 表示2. 运算d. 带符号整数的表示和运算1. 原码2. 反码3. 补码4. 移码5. …

多肽标签VSV-G Tag、YTDIEMNRLGK

VSV-G肽是一种源自水泡性口腔炎病毒糖蛋白的11个氨基酸的肽。编号: 191225 中文名称: 多肽标签VSV-G Tag 英文名: VSV-G Tag 英文同义词: VSV tag 单字母: H2N-YTDIEMNRLGK-OH 三字母: H2N-Tyr-Thr-Asp-Ile-Glu-Met-Asn-Arg-Leu-Gly-Lys-COOH 氨基酸个数: 11 分子式: C57H94N16…

【HMS Core】ScanPlus和Push推送库出现冲突该如何解决?

1、问题描述 项目中之前是同时集成了华为统一扫码服务SDK和华为推送SDK&#xff0c;这两天升级华为推送版本至6.3.0.304时发现这两个库出现了冲突&#xff0c; 这两个库的依赖版本情况如下所示&#xff1a; implementation com.huawei.hms:scanplus:2.7.0.301 implementatio…

[附源码]java毕业设计小型医院药品及门诊管理

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

《垃圾回收算法手册 自动内存管理的艺术》——内存分配(笔记)

文章目录七、内存分配7.1 顺序分配7.2 空闲链表分配7.2.1 首次适应分配7.2.2 循环首次适应分配7.2.3 最佳适应分配7.2.4空闲链表分配的加速快速适应分配(fast-fit allocation)位图适应分配(bitmapped-fits allocation)7.3 内存碎片化7.4 分区适应分配7.4.1 内存碎片7.4.2 空间大…

LINUX SECCOMP模块介绍

SECCOMP介绍 Seccomp是 "secure computing" 的 缩写。Linux内核2.6.12版本&#xff08;2005年3月8日&#xff09;引入。是linux一个安全模块&#xff0c;用于限制程序系统调用&#xff1b;当时如果使用了SECCOMP只允许4个系统调用&#xff1a; read&#xff0c;wri…

Flutter组件--Padding和AnimatedPadding

示意图: Padding介绍 在应用程序中有许多widget 时&#xff0c;这个时候画面常常会变得很拥挤&#xff0c;这个时候如果想要在widget之间来保留一些间距&#xff0c;那就用 Padding 为什么使用 Padding 而不使用 Container.padding 属性的 Container? Container 是将许多更…

RabbitMQ-08 不公平分发与预取值

不公平分发 我们之前演示的所有示例都遵循轮询分发&#xff0c;也就是多个消费者时交替消费队列消息。可以想一下我们之前的一个例子。Worker02处理消息只需要1s但是Worker03处理一个消息却用30s的情况。那么这个时候我们就要使用到不公平分发。简而言之就是能者多劳。 需要在消…

亚马逊刷单测评的正确方法是什么样的?

做亚马逊刷单测评时想要有效果&#xff0c;测评方法很重要&#xff0c;不能直接通过链接进行下单&#xff0c;这样显的很不真实&#xff0c;如果是要找人帮忙测评&#xff0c;可以通过以下方式进行&#xff1a; 1、通过关键词搜索进入 选择自己想刷的关键词&#xff0c;直接搜…

物联网安全年报小结

小结 不仅仅是 LockerGoga&#xff0c;其他勒索软件也对工业系统造成了重大损失&#xff0c;如全球第二大听力集团 Demant 被勒索造成损失达 9500 万美元 [21]&#xff1b;世界上最大的飞机零部件供给商之一 ASCO&#xff0c;因其位于 比利时扎芬特姆的工厂系统遭勒索病毒传染…

目标检测算法——YOLOv5/YOLOv7改进之结合​RepVGG(速度飙升)

>>>深度学习Tricks&#xff0c;第一时间送达<<< 目录 RepVGG——极简架构&#xff0c;SOTA性能&#xff01;&#xff01;&#xff01; &#xff08;一&#xff09;前沿介绍 1.RepVGGBlock模块 2.相关实验结果 &#xff08;二&#xff09;YOLOv5/YOLOv7改…

Alibaba官方上线,SpringBoot+SpringCloud全彩指南(第五版)

Alibaba作为国内一线互联网大厂&#xff0c;其中springcloudAlibaba更是阿里微服务最具代表性的技术之一&#xff0c;很多人只知道springcloudAlibaba其实面向微服务技术基本上都有的下面就给大家推荐一份Alibaba官网最新版&#xff1a;SpringBootSpringCloud微服务全栈开发小册…

基于STM32G431嵌入式学习笔记——三、KEY按键入门

一、按键在CubeXM里的配置 可以打开先前配置过LED的CubeMX&#xff0c;在其基础上进行按键的配置。 个人建议在这里先将原环境拷贝 更改副本文件夹名为LED_KEY_LCD 打开文件夹中的.ioc文件进行配置 在配置之前&#xff0c;我们先查阅产品手册了解按键的电路图&#xff0c;以…

07-Nginx 日志管理及自动切割

Nginx 日志管理及自动切割 对于程序员、运维来说&#xff0c;日志非常得重要。通过日志可以查看到很多请求访问信息&#xff0c;及异常信息。Nginx 也提供了对日志的强大支持。 日志管理范围 首先&#xff0c;下面要讲的这些日志相关属性可以配置在任意模块。在不同的模块&…

如果我在初用tomcat时,是看到这篇tomcat架构解析,是不是就不会被说菜鸡了!

写在前面 tomcat作为一个中间件&#xff0c;相信绝大多数java程序员&#xff0c;多多少少都应该用到过吧。尤其是在springboot还未流行的时候&#xff0c;本地环境&#xff0c;没少跑tomcat服务吧&#xff1f; 我们一般都是直接使用&#xff0c;将我们的web服务&#xff0c;直…