SpringBoot应用开发指南(01)

news2024/11/23 14:54:57

目录

  • 引言
  • 1. SpringBoot简介
    • 1.1 什么是SpringBoot
      • 1.1.1 背景
      • 1.1.2 优势
      • 1.1.3 核心概念
    • 1.1.3 特点
  • 2. SpringBoot入门
  • 2. SpringBoot集成MyBatis
  • 3. SpringBoot集成PageHelper
    • 3.1 什么是PageHelper
  • 通过切面实现分页
  • 4. SpringBoot集成Druid
  • 总结

在这里插入图片描述

引言

在当今软件开发领域,SpringBoot作为一个高效的Java开发框架,以其简洁、快速的特性受到了广泛关注。本文将深入探讨SpringBoot的一些高级特性,包括与持久层框架MyBatis、分页工具PageHelper以及数据库连接池Druid的集成。通过深入的学习和实践,你将更好地理解如何在实际项目中应用这些技术,提高开发效率和代码质量。

1. SpringBoot简介

众所周知 Spring 应用需要进行大量的配置,各种 XML 配置和注解配置让人眼花缭乱,且极容易出错,因此 Spring 一度被称为“配置地狱”。为了简化 Spring 应用的搭建和开发过程,Pivotal 团队在 Spring 基础上提供了一套全新的开源的框架,它就是Spring Boot。

只是为了提升Spring开发者的工具,特点:敏捷式、快速开发。

1.1 什么是SpringBoot

Spring Boot 是由 Pivotal 团队提供的全新框架,2014 年 4 月发布 Spring Boot 1.0 2018 年 3 月 Spring Boot 2.0发布。它是对spring的进一步封装,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程。怎么简化的呢?就是通过封装、抽象、提供默认配置等方式让我们更容易使用。

SpringBoot 基于 Spring 开发。SpringBoot 本身并不提供 Spring 框架的核心特性以及扩展功能,也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具

关于 SpringBoot 有一句很出名的话就是约定大于配置。采用 Spring Boot 可以大大的简化开发模式,它集成了大量常用的第三方库配置,所有你想集成的常用框架,它都有对应的组件支持,例如 Redis、MongoDB、Jpa、kafka,Hakira 等等。SpringBoot 应用中这些第三方库几乎可以零配置开箱即用,大部分的 SpringBoot 应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。

1.1.1 背景

SpringBoot的出现是为了简化Spring应用的搭建过程,通过默认配置和约定俗成的方式,减少开发人员在配置文件上的投入,从而提高开发效率。

1.1.2 优势

简化配置:通过约定大于配置的原则,SpringBoot极大地简化了应用的配置过程。
内嵌服务器:SpringBoot支持多种内嵌服务器,如Tomcat、Jetty等,使得应用可以独立运行,无需外部Web服务器。
自动化:通过自动配置和自动装配,SpringBoot可以根据项目的依赖自动配置很多功能。

1.1.3 核心概念

起步依赖:通过Maven或Gradle引入特定功能的依赖,简化了项目的依赖管理。
自动配置:SpringBoot根据项目的依赖自动配置应用上下文,简化了配置文件。
注解驱动:采用注解驱动的方式进行开发,减少了样板代码的编写。

1.1.3 特点

  • 独立运行的 Spring 项目

Spring Boot 可以以 jar 包的形式独立运行,Spring Boot 项目只需通过命令“ java–jar xx.jar” 即可运行。

  • 内嵌 Servlet 容器

Spring Boot 使用嵌入式的 Servlet 容器(例如 Tomcat、Jetty 或者 Undertow 等),应用无需打成 WAR 包 。

  • 提供 starter 简化 Maven 配置

Spring Boot 提供了一系列的“starter”项目对象模型(POMS)来简化 Maven 配置。

  • 提供了大量的自动配置

Spring Boot 提供了大量的默认自动配置,来简化项目的开发,开发人员也通过配置文件修改默认配置。

  • 自带应用监控

Spring Boot 可以对正在运行的项目提供监控。

  • 无代码生成和 xml 配置

Spring Boot 不需要任何 xml 配置即可实现 Spring 的所有配置。

2. SpringBoot入门

点击创建文件

在这里插入图片描述

在这里插入图片描述

版本2.7.6,jdk1.8,图片选不到我的解决方法是在生成好之后更改pom文件
在这里插入图片描述

然后把application.properties改为application.yml,先下载插件
在这里插入图片描述
右击绿色的,然后左击第二个箭头,就会更改为yml
在这里插入图片描述
pom.xml
暂时先把MyBatis和MySQL注释掉,因为yml还没配置

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.zking</groupId>
    <artifactId>boot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>boot</name>
    <description>boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.7.6</spring-boot.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>mysql</groupId>-->
<!--            <artifactId>mysql-connector-java</artifactId>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>org.mybatis.spring.boot</groupId>-->
<!--            <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--            <version>2.3.0</version>-->
<!--        </dependency>-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.zking.core.BootApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

然后运行启动项目就好了

2. SpringBoot集成MyBatis

配置映射


 #  服务运行的端口
 server:
     port: 8080
spring:
  #数据源配置
    datasource:
        url: jdbc:mysql://localhost:3306/bookshop
        username: root
        password: 123456
        driver-class-name: com.mysql.cj.jdbc.Driver
 #mybatis配置

mybatis:
    #mapper.xml所在的位置
    mapper-locations: classpath*:mapper/*xml

然后添加数据库
在这里插入图片描述

  • 输入完成,进行测试的时候出现时差问题,下面的网址可以解决
    在这里插入图片描述

  • 解决方法网址:
    https://blog.csdn.net/liuqiker/article/details/102455077?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5-102455077-blog-106429131.235%5Ev39%5Epc_relevant_anti_t3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5-102455077-blog-106429131.235%5Ev39%5Epc_relevant_anti_t3&utm_relevant_index=6

  • 然后对表进行代码生成
    在这里插入图片描述

在这里插入图片描述
然后Finish完成
此时代码就生成完成了

mapper所在的包必须在启动类中开启扫描
在这里插入图片描述
这时候运行项目就可以运行成功了
在这里插入图片描述

3. SpringBoot集成PageHelper

3.1 什么是PageHelper

PageHelper是一个用于MyBatis的分页插件,可以帮助我们方便地进行分页查询。在这一小节中,我们将深入了解PageHelper的基本用法和高级特性。

集成:
pom文件配置

<dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.6</version>
        </dependency>

配置yml

pagehelper:
    #使用的方言
    helperDialect: mysql
    #开启分页合理化
    reasonable: true
    #mapper方法上的分页参数
    supportMethodsArguments: true
    #查询数量
    params: count=countSql

再创建好pageben

package page;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class PageBean {

    private Integer page = 1;
    private Integer rows = 5;
    private Long total = 0L;
    private boolean open = true;

    public int start() {
        return (page - 1) * rows;
    }

    public int previous() {
        return Math.max(this.page - 1, 1);
    }

    public int next() {
        return Math.min(this.page + 1, maxPage());
    }

    public int maxPage() {
        return (int) Math.ceil(this.total.intValue() / (this.rows * 1.0));
    }

}

BootController

package com.yuan.springbook20231212.controller;

import com.github.pagehelper.PageHelper;
import com.yuan.springbook20231212.mapper.TBookMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import page.PageBean;

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-12-12 17:09
 */
@RestController
@RequestMapping("/book")
public class BookController {
    @Autowired
    private TBookMapper tBookMapper;

    @RequestMapping("/list")
    public Object list(PageBean pageBean){
        PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        return tBookMapper.selectlist();
    }

}

分页成功
在这里插入图片描述

通过切面实现分页

需要用到两个类PageAspect,PageAnnotation

package page;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PageAnnotation {
}

package page;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class PageAspect {

    @Pointcut("@annotation(PageAnnotation)")
    public void cut() {
    }

    @Around("cut()")
    public Object aroundHandler(ProceedingJoinPoint point) throws Throwable {
        Object[] args = point.getArgs();
        PageBean pageBean = new PageBean().setOpen(false);
        for (Object arg : args) {
            if (arg instanceof PageBean) pageBean = (PageBean) arg;
        }
        PageHelper.startPage(pageBean.getPage(), pageBean.getRows(), pageBean.isOpen());
        Object val = point.proceed();
        if (pageBean.isOpen()) {
            Page<?> page = (Page<?>) val;
            pageBean.setTotal(page.getTotal());
        }
        return val;
    }

}

Service层通过@PageAnnotation切入方法

package com.yuan.springbook20231212.Service.impl;

import com.yuan.springbook20231212.Service.BookService;
import com.yuan.springbook20231212.mapper.TBookMapper;
import com.yuan.springbook20231212.pojo.TBook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import page.PageAnnotation;
import page.PageBean;

import java.util.List;

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-12-12 20:51
 */
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private TBookMapper tBookMapper;
    @Override
    @PageAnnotation
    public List<TBook> selectlist(PageBean pageBean) {
        return tBookMapper.selectlist();
    }
}

Controller层

@RequestMapping("/list")
    public Object list(PageBean pageBean){
        PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        return bookService.selectlist(pageBean);
    }

这样就可以进行一个切面分页了

4. SpringBoot集成Druid

4.1 什么是Druid
Druid是一个高性能的数据库连接池,支持监控和扩展
pom配置

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.16</version>
        </dependency>

yml配置

druid:
      # 初始化时建立物理连接的个数
      initial-size: 5
      # 最小连接池数量
      min-idle: 5
      # 最大连接池数量
      max-active: 20
      #配置获取连接等待超时的时间
      max-wait: 60000
      #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      time-between-eviction-runs-millis: 60000
      # 一个连接在池中最小生存的时间,单位是毫秒
      min-evictable-idle-time-millis: 30000
      # 用来检测连接是否有效的 sql,要求是一个查询语句
      validation-query: SELECT 1 FROM DUAL
      # 建议配置为 true,不影响性能,并且保证安全性
      test-while-idle: true
      # 申请连接时执行 validationQuery 检测连接是否有效
      test-on-borrow: true
      # 归还连接时执行 validationQuery 检测连接是否有效
      test-on-return: false
      # 是否缓存 preparedStatement,PsCache
      # PSCache 对支持游标的数据库性能提升巨大,比如说 oracle,而 mysql 则建议关闭
      pool-prepared-statements: true
      # 要启用 PSCache,必须配置大于0
      max-pool-prepared-statement-per-connection-size: 20
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计
      filter:
        stat:
          merge-sql: true
          slow-sql-millis: 5000
      # 基础监控配置
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
        session-stat-enable: true
        session-stat-max-count: 100
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        reset-enable: true
        login-username: admin #设置监控页面的登录名和密码
        login-password: admin
        allow: 127.0.0.1 #deny: 192.168.1.100

数据库配置那里再加一个
type: com.alibaba.druid.pool.DruidDataSource
在这里插入图片描述
然后启动项目,输入下面网址
http://127.0.0.1:8080/druid/login.html,admin-admin
在这里插入图片描述

集成日志
yml

logging:
    level:
      com.yuan.springbook20231212.mapper: dubug

总结

通过本文的深入学习,无论是简化配置的SpringBoot,还是强大的MyBatis、PageHelper和Druid,它们的集成和使用都是提高开发效率、优化数据库操作和保障系统稳定性的关键。

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

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

相关文章

综合布线管理工具价值分析

一、网络运维中存在的问题与现状分析 由于运维人员技术水平、知识储备、工作经验等参差不齐&#xff0c;对运维管理方面的各种标准不熟悉&#xff0c;造成在实际实施过程中线缆使用的长度不合理甚至是规格不符&#xff0c;最终导致机柜线缆混乱&#xff0c;各种飞线&#xff0…

【八】python装饰器模式

文章目录 8.1 装饰器模式简介8.2 装饰器模式作用8.3 装饰器模式构成8.3.1 装饰器模式包含以下几个核心角色&#xff1a;8.3.2 UML类图 8.4 装饰器模式python代码实现8.4.1 基本装饰器的使用8.4.2 多个装饰器的执行顺序8.4.3 带返回值的装饰器的使用8.4.4 装饰器模式-关联类模式…

(第67天)RMAN Duplicate 克隆 PDB

介绍 在之前 NONCDB 版本我们经常使用 RMAN Duplicate 方式来在线搭建 DataGuard,非常方便快捷。从 12C 开始 Oracle 推出了 CDB 架构后,自然也就支持使用 Duplicate 的方式来复制 CDB,但是 12C 时还没有那么智能。 从 18C 开始进行了升级,可以支持使用 RMAN Duplicate 方…

Axure的元件库的使用以及详细案例

目录 元件库的使用 元件介绍 元件的基本使用 矩形、按钮、标题的使用​编辑 图片的使用 图片以及热区的使用 表单元件的使用 表格元件的使用 登录界面 个人简介界面 元件库的使用 元件介绍 Axure提供了一套丰富的元件库&#xff0c;用于快速创建原型中常见的UI界面元素…

geemap学习笔记025:为地图中的底图数据添加颜色条(colorbar)

前言 为地图中的数据添加颜色条&#xff0c;有利于辅助地图的使用&#xff0c;本节就介绍一下如何在底图数据中添加颜色条。 1 导入库并显示地图 import ee import geemapee.Initialize() Map geemap.Map() Map2 添加普通颜色条以及分类颜色条 Map geemap.Map()dem ee.I…

深度学习中的各类评价指标

深度学习中的各类评价指标 1 Dice Loss2 Precision&#xff08;精度&#xff09;3 Recall&#xff08;召回率&#xff09;4 F-Score5 mAP 1 Dice Loss Dice Loss&#xff0c;也叫Soft Dice Coefficient&#xff0c;是一种用于图像分割任务的损失函数。它基于目标分割图像与模型…

希亦|鲸立|小吉内衣洗衣机好用吗?强势PK“洗护一体”王者!

随着人们的生活水平的提升&#xff0c;越来越多小伙伴来开始追求更高的生活水平&#xff0c;一些智能化的小家电就被发明出来&#xff0c;而且内衣洗衣机是其中一个。我们对内衣裤的清洗频次会高于普通衣服&#xff0c;大多数人会选择手洗内衣裤&#xff0c;都在手洗过程不仅会…

用户管理第2节课 -- idea 2023.2 创建表

一、懂得 1.1编码格式是防止乱码的&#xff0c;utf-8是完全够的&#xff0c;那几个基本没差别 网址&#xff1a; 【IDEA——连接MySQL数据库&#xff0c;创建库和表】_idea中数据库-CSDN博客 这些是MySQL数据库中的一些术语&#xff0c;可以简单解释如下&#xff1a; 1、col…

DICOM 文件中,VR,VL,SQ,图像二进制的几个注意点

DICOM 文件的结构&#xff0c;在网上有很多的学习资料&#xff0c;这里只介绍些容易混淆的概念&#xff0c;作为回看笔记。 1. 传输语法 每个传输语法&#xff0c;起都是表达的三个概念&#xff1a;大小端、显隐式、压缩算法 DICOM Implicit VR Little Endian: 1.2.840.1000…

现代岩土工程监测的利器:振弦采集仪

现代岩土工程监测的利器&#xff1a;振弦采集仪 振弦采集仪是一种用于工程监测的先进仪器&#xff0c;主要用于测量结构体的振动和应力变形情况。它采用振动传感器和数据采集系统相结合的方式&#xff0c;可以实时监测和记录结构体的振动频率、振幅、振动模态等参数&#xff0…

Linux----内核及发行版

1. Linux内核 Linux内核是操作系统内部操作和控制硬件设备的核心程序&#xff0c;它是由芬兰人林纳斯开发的。 内核效果图: 说明: 真正操作和控制硬件是由内核来完成的&#xff0c;操作系统是基于内核开发出来的。 2. Linux发行版 是Linux内核与各种常用软件的组合产品&am…

智能优化算法应用:基于水循环算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于水循环算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于水循环算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.水循环算法4.实验参数设定5.算法结果6.参考文…

【Proteus仿真】【51单片机】定时智能插座开关

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使LCD1602液晶&#xff0c;DS18B20温度传感器、按键、蜂鸣器、继电器开关、HC05蓝牙模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示…

内网服务器部署maven私服简记

前言 很多企业希望创建自己的maven私服&#xff0c;但服务器无法和外网连通&#xff0c;所以这里介绍一套完整的内网部署nexus的解决方案。实现的方式也很简单&#xff0c;将下载好的nexus安装和项目所需的依赖仓库都上传到服务i去上去&#xff0c;通过脚本的方式实现批量导入…

【Spark精讲】Spark任务运行流程

Spark任务执行流程 部署模式是根据Drvier和Executor的运行位置的不同划分的。client模式提交任务与Driver进程在同一个节点上&#xff0c;而cluster模式提交任务与Driver进程不在同一个节点。 Client模式 Clinet模式是在spark-submit提交任务的节点上运行Driver进程。 …

Dockerfile部署Java项目挂载使用外部配置文件

Dockerfile部署Java项目挂载使用外部配置文件 技术博客 http://idea.coderyj.com/ 需求是由于java项目使用的是nacos 而且每次部署nacos服务器ip不一样导致要重新打包,想引入外部配置文件进行打包 1.需求是由于java项目使用的是nacos 而且每次部署nacos服务器ip不一样导致要重新…

16ASM 汇编基础与Debug使用

目录 硬件运行机制 微机系统硬件组成 计算机系统组成 8086CPU组织结构 DoxBox安装 Debug使用 R命令 D命令 E命令 U命令 T命令 A命令 标志寄存器 常用机器指令 硬件运行机制 下面是一个电子器件二极管&#xff0c;正向加电则通&#xff0c;反向加电则不通 利用二…

Android : 序列化 Serializable 简单应用

1.Serializable 介绍: Serializable 是 Java 中的一个接口&#xff0c;它用于标记一个类或对象可以被序列化&#xff08;即可以转换为字节流以便在网络上传输或在磁盘上持久化&#xff09;。 当一个类实现 Serializable 接口时&#xff0c;它的对象可以被序列化&#xff0c;这…

AI创新之美:AIGC探讨2024年春晚吉祥物龙辰辰的AI绘画之独特观点

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《粉丝福利》 《linux深造日志》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、龙辰辰事件概述二、为什么龙辰辰会被质疑AI创作&#xff1f;1.1 AI 作画的特点2.2 关于建行的合作宣传图…