Spring Cloud + Vue前后端分离-第3章 SpringBoot项目技术整合

Spring Cloud + Vue前后端分离-第3章 SpringBoot项目技术整合

3-1 集成持久层框架Mybatis

ORM:对象关系映射,Hibernate是全自动ORM,Mybatis是半自动ORM,Mybatis可以操作的花样更多,是首选的持久层框架

System模块集成Mybatis框架

utf8是三个字节,支持的字符有限。MySQL在5.5.3之后增加了这个utf8mb4的编码,支持更多字符,例如emoji小表情。

数据库准备工作2: 创建courseimooc数据库专用的用户,用户名可以叫courseimooc或其他

在实际开发中,我们会创建不同权限的用户,比如只能查询数据,或者只能做增删改查  

生成的sql语句

GRANT Alter, Alter Routine, Create, Create Routine, Create Temporary Tables, Create View, Delete, Drop, Event, Execute, Grant Option, Index, Insert, Lock Tables, References, Select, Show View, Trigger, Update ON `courseimooc`.* TO `courseimooc`@`localhost`;

修改一下名称,说明只能本机访问 

双击courseimooc@localhost,这个报错先不理会

进入courseimooc,新建一张表

现在 关闭连接,再打开,就不会报错了!

1.集成mybatis框架,启动成功

Maven父子模块增加jar包依赖: 先在父pom.xml中增加jar包依赖,再在子pom.xml中增加jar包依赖,子pom.xml中不带版本号

 

选中这个单词,Alt + 回车 ,然后点击Save 'courseimooc' to dictionary 

Alt+Enter可以帮助解决大多数的错误报警等

单词就不会出现波浪线

如果启动报错,加上spring.datasource.driver-class-name=com.mysql.jdbc.Driver

Mybatis使用示例

#增加TestMapper.xml,放在 reources/mapper目录下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.course.system.mapper.TestMapper">
    <select id="list" resultType="com.course.system.domain.Test">
        select `id`,`name` from`test`
    </select>
</mapper>

application.properties

spring.application.name=system
server.servlet.context-path=/system
server.port=9001
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

#增加数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/courseimooc?characterEncoding=UTF8&autoReconnect=true
spring.datasource.username=courseimooc
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

mybatis.mapper-locations=classpath:/mapper/*.xml

TestController.java

package com.course.system.controller;

import com.course.system.domain.Test;
import com.course.system.service.TestService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

@RestController
public class TestController {
    @Resource
    private TestService testService;
    @RequestMapping("/test")
    public List<Test> test(){
        return testService.list();
    }
}

Test.java

 TestMapper.java

package com.course.system.mapper;

import com.course.system.domain.Test;

import java.util.List;

public interface TestMapper {
    public List<Test> list();
}

TestService.java

package com.course.system.service;

import com.course.system.domain.Test;
import com.course.system.mapper.TestMapper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
@Service
public class TestService {
    @Resource
    private TestMapper testMapper;
    public List<Test> list(){
        return testMapper.list();
    }
}

SystemApplication.java

package com.course.system;

import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.core.env.Environment;


@SpringBootApplication
@EnableEurekaClient
@MapperScan("com.course.system.mapper")
public class SystemApplication {

    private static final Logger logger = LoggerFactory.getLogger(SystemApplication.class);

    public static void main(String[] args) {

        SpringApplication app = new SpringApplication(SystemApplication.class);
        Environment env = app.run(args).getEnvironment();
        logger.info("启动成功!!");
        logger.info("System地址: \thttp://127.0.0.1:{}", env.getProperty("server.port"));
    }

}

1.mybatis使用示例: http://127.0.0.1:9001/system/test

2.增加了三层结构

3-2 项目优化

idea数据库插件的使用

1.使用database关联数据库

 如果不成功,可能是时区的问题,在Advanced中找到serverTimezone设置为UTC

UTC代表的是全球标准时间,如果要用北京时间,可以填Asia/Shanghai

这样就说明创建好了

 

2.新增数据库脚本 

设置了idea关联数据库后,所有的脚本都可以在idea直接执行,相当于把开发和运维关联起来了。

集成热部署DevTools

idea+DevTools热部署

第1步:增加devtools依赖

第2步:Ctrl+Alt+S 打开设置窗口,编写代码时,自动编译勾选上

勾选Advanced Settings中的Allow auto-make to start even if developed application is currently running 

 然后自己进行测试一下,应该是已经可以了

热部署的时间会比正常启动更快,随着业务的增加,启动时间会变长,这个差距会越明显

优化mybatis日志

3-3 搭建服务模块-server

业务扩展后,需要对表加一个字段,这时,如果要保持实体类和表结构一致,则所有模块的实体都要改,费时费力

如果采取的策略是,哪个模块用到新的字段,就改哪实体类,时间长了,所有的实体类和表都对应不上,并且这种策略不能用mybatis代码生成器

新建公共模块-server

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.course</groupId>
        <artifactId>course</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.course</groupId>

    <artifactId>server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <dependencies>
        <!-- 热部署DevTools -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>

        <!-- 集成mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>


    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    </dependencies>
</project>

system集成server模块

总的pom.xml包下加入server依赖

 

重新启动

集中配置

server作为jar包被依赖,它的resources下的配置文件会和system下的配置文件冲突

spring默认也会读resources/config下的配置文件

1.将用的配置移动到server

注:server配置文件的路径要放在resources/config/application.properties,不能和上层的路径一样放在resoures根目录下

3-4 集成mybatis generator

idea集成mybatis generator生成mybatis代码

步骤1:父pom.xml里增加mybatis-generator插件

这个插件需要连接数据库获得表结构,所以需要加驱动包依赖

步骤2:添加配置文件generatorConfig.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>
    <context id="Mysql" targetRuntime="MyBatis3" defaultModelType="flat">

        <!--反引号``:如果表名或者字段名是mysql的关键学比如table,from等,这时可以加上反引号,比如:select `date` from `from`-->
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <!-- 生成的实体类添加toString()方法 -->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin" />

        <!-- 不生成注释 -->
        <!-- 默认自动生成的代码会有一堆英文注释,大家可以把这段删除试试-->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/courseimooc?serverTimezone=Asia/Shanghai"
                        userId="courseimooc"
                        password="courseimooc">
        </jdbcConnection>

        <!-- domain类的位置 -->
        <javaModelGenerator targetProject="src\main\java"
                            targetPackage="com.course.server.domain"/>

        <!-- mapper xml的位置 -->
        <sqlMapGenerator targetProject="src\main\resources"
                         targetPackage="mapper"/>

        <!-- mapper类的位置 -->
        <javaClientGenerator targetProject="src\main\java"
                             targetPackage="com.course.server.mapper"
                             type="XMLMAPPER" />
        <!-- type="XMLMAPPER" 有三种生成方式:
        ANNOTATEDMAPPER(生成的SQL全部在Java中),
        MIXEDMAPPER (SQL部分在Java中,部分在XML中),
        XMLMAPPER (生成的SQL全部在XML中)
        推荐使用: XMLMAPPER,将Java代码与SQL代码分离-->

        <table tableName="test" domainObjectName="Test"/>
    </context>
</generatorConfiguration>

步骤3:创建maven启动命令mybatis-generator:generate -e

generatorConfig.xml是放在server模块下,所以这里选择server目录 

红色:新文件未交给git管理(未add,未commit);

绿色:已交给git管理未提交(已add,未commit);

蓝色:有修改未提交;灰色:已删除未提交

这些是新生成的

解决mapper.xml重复生成代码的问题

1.解决mapper.xml重复生成代码的间题<plugin type="org.mybatis.generator.plugins.UnmergeableXmMappersPlugin”/>

业务扩展,表结构发生变动时,需要重新生成持久层代码。这对编码有一个要求:生成器生成的四个文件绝对不可以手动修改。后续会再做说明

低端的解决方法:每次手动删除xml,再执行生成命令。

更好的方法:

<!--覆盖生成XML文件-->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />

旧版本解决方案:自己写Java类,用来启动生成器,而不是用Maven命令启动。在java类里删除表xmI文件,再执行生成代码

原来的xml会被覆盖,所以绝对不要在生成的xml手动修改代码,因为下次再生成时,手动修改的代码会被覆盖掉

example使用示例

通过Example,可以帮我们写入where,order by,distinct等,需要熟练掌握,可以极大提高单表的开发效率

启动EurekaApplication、SystemApplication

小技巧:Ctrl+Alt+V,快速生成个变量

根据id升序asc

根据id降序desc

要按多个条件查询的话,在表达式的后面继续.andXXX,后续会再作介绍

 ?是jdbc占位符,可用于防注入攻击。mybatis底层也是idbc实现的

使用Example可以快速完成单表的增删改查,熟练掌握后对代码开发效率将有一个质的飞跃 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于yolov8-道路裂缝检测

1 介绍 本文主要是搜集数据&#xff0c;从网上kaggle等网站找了2000多张图片&#xff0c;然后使用yolov8模型进行训练&#xff0c;最后只展示训练过程中的图片&#xff0c;如果有需要&#xff0c;可以联系&#xff1a;https://docs.qq.com/doc/DWEtRempVZ1NSZHdQ。

11-30 SpringBoot2

热部署 开发过程中,修改代码,不需要重启,自动更新 项目上线,一定要关闭 SpringBoot热部署的实现&#xff1f;&#xff1f; ideal默认阻止class类更新 2&#xff0e;需要手动构建项目&#xff0c;可以使用快捷键激活此功能ctrl F9 / build project 自动构建项目 允许程序运行…

02、pytest环境准备

工具准备 python官网下载&#xff1a;https://www.python.org/pycharm官网下载&#xff1a;https://www.jetbrains.com.cn/en-us/pycharm/pytest官方文档&#xff1a;https://docs.pytest.org/en/7.4.x/python-office官网文档&#xff1a;http://www.python-office.com/ 参考…

数学建模-二氧化碳排放及时空分布测度

二氧化碳排放及时空分布测度 整体求解过程概述(摘要) 面临全球气候变化的巨大挑战&#xff0c;我国积极响应《巴黎协定》的号召&#xff0c;提出“2030年前碳达峰&#xff0c;2060 年前实现碳中和”的碳排放发展目标&#xff0c;并将碳中和相关工作作为 2021 年的重点任务之一…

使用腾讯云轻量应用服务器安装宝塔面板建站全流程

腾讯云轻量应用服务器宝塔面板怎么用&#xff1f;轻量应用服务器如何安装宝塔面板&#xff1f;在镜像中选择宝塔Linux面板腾讯云专享版&#xff0c;在轻量服务器防火墙中开启8888端口号&#xff0c;然后远程连接到轻量服务器执行宝塔面板账号密码查询命令&#xff0c;最后登录和…

ElasticSearch篇---第一篇

系列文章目录 文章目录 系列文章目录前言一、谈谈分词与倒排索引的原理二、说说分段存储的思想三、谈谈你对段合并的策略思想的认识前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分…

上海亚商投顾:沪指震荡调整跌 CRO概念股集体大跌

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日窄幅震荡&#xff0c;创业板指尾盘跌近1%&#xff0c;板块分化较为明显。 CRO概念股集体下挫&#x…

AIGC在天猫商品海报生成上的探索

灵感艺术家项目&#xff0c;旨在通过AIGC绘图能力&#xff0c;联合商家打造低门槛高趣味性的宣传海报设计大赛&#xff0c;本文分享我们的方案和优化方向。建议对AIGC感兴趣的工程、算法方向的同学阅读。 项目背景 灵感艺术家项目&#xff0c;旨在通过AIGC绘图能力&#xff0c;…

Elasticsearch:评估 RAG - 指标之旅

作者&#xff1a;Quentin Herreros&#xff0c;Thomas Veasey&#xff0c;Thanos Papaoikonomou 2020年&#xff0c;Meta发表了一篇题为 “知识密集型NLP任务的检索增强生成” 的论文。 本文介绍了一种通过利用外部数据库将语言模型 (LLM) 知识扩展到初始训练数据之外的方法。 …

07、pytest指定要运行哪些用例

官方用例 # 目录结构 | |----test_mod.py | |----testing||----test_dir.py# content of test_mod.py import pytestdef func(x):return x 1def test_mod():print("test_mod function was invoked")assert func(3) 5def test_func():print("test_func was in…

力扣每日一题:2477. 到达首都的最少油耗(2023-12-05)

力扣每日一题 题目&#xff1a;2477. 到达首都的最少油耗 日期&#xff1a;2023-12-05 用时&#xff1a;34 m 15 s 时间&#xff1a;37ms 内存&#xff1a;84.8MB 思路&#xff1a;分别计算每条路上通过的城市数量&#xff08;数量/座位数&#xff0c;向上取整&#xff09;&…

1.qml-3D入门讲解介绍

本章我们来学习QML 3D教程&#xff0c;QML 3D能够支持windows linux等多平台跨平台并且显示效果大部分一致&#xff0c;非常方便&#xff0c;学习的qt版本最低为qt6.5。 要使用qml 3D类&#xff0c;需要导入QtQuick3D模块。 这是使用空间渲染器和场景图的 QML 前端。目前&…

【C/PTA —— 14.结构体1(课外实践)】

C/PTA —— 14.结构体1&#xff08;课外实践&#xff09; 一.函数题6-1 选队长6-2 按等级统计学生成绩6-3 学生成绩比高低6-4 综合成绩6-5 利用“选择排序算法“对结构体数组进行排序6-6 结构体的最值6-7 复数相乘运算 二.编程题7-5 一帮一7-6 考试座位号 一.函数题 6-1 选队长…

【React + Typescript】使用WebPack包管理、各种扩展插件组成的初始模板,开源协议:CC-BY-4.0

React Typescript Webpack 模板 模板展示项目结构使用的部分扩展包页面配置代码Layout 公共容器组件路由Jspackage.json 开源模板下载TIP 模板展示 项目结构 使用的部分扩展包 &#x1f4c2; System ├── &#x1f4c2; Plugin │ ├── &#x1f4c4; file-loader | 在处…

Java---异常

文章目录 1. 异常概述2. try...catch3. Throwable成员方法4. 编译时异常和运行时异常区别5. 异常处理之throws6. 自定义异常7. throws和throw的区别 1. 异常概述 1. 异常&#xff1a;就是程序中出现了不正常的情况。 2. Error&#xff1a;严重问题&#xff0c;不需要处理。Exce…

基于Java SSM框架实现美食推荐管理系统项目【项目源码+论文说明】

基于java的SSM框架实现美食推荐管理系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&a…

数智化招采平台档案管理的功能、价值与亮点

2005年4月&#xff0c;《中华人民共和国电子签名法》正式实施&#xff0c;明确电子签名与手写签名具有同等的法律效力。 2013年5月&#xff0c;《电子招标投标办法》正式实施&#xff0c;明确电子招标投标交易平台应当具备电子归档功能。 2021年1月&#xff0c;《中华人民共和…

web前端开发HTML/css用户登录界面

代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta http-equi…

基于Java SSM框架实现农产品供销服务系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现农产品供销服务系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识…

使用cmake构建的工程的编译方案

1、克隆项目工程 2、进入到工程目录 3、执行 mkdir build && cd build 4、执行 cmake .. 5、执行 make 执行以上步骤即可完成对cmake编写的工程进行编译 &#xff0c;后面只需执行你的编译结果即可 $ git clone 你想要克隆的代码路径 $ cd 代码文件夹 $ mkdir bu…