Apache-DButils以及Druid(德鲁伊) 多表连接查询的解决方案:两种

news2024/11/25 0:24:24

Apache-DButils以及Druid(德鲁伊) 多表连接查询的问题

在这里插入图片描述


每博一文案

张爱玲说,于千万人之中,遇到你所要遇到的人,于千万年之中,时间的无涯的荒野里,没有
早一步,也没有晚一步,刚巧赶上了。
人生海海,相遇别离自有时,自然会有人陪你走到最后,但更多的只能陪你走一段路罢了。
你的一生,我只接一程,再多一分也不能了。王家卫曾说:爱情这东西,时间很关键,认识的太早,或者太晚
都不行,缘分是很奇妙的东西,有的人明明遇见得很早,却不能一起走到最后。有的人出现时,
斜风带雨,乱了四季,却早就不是适合相遇的季节了,只能眼睁睁的错过,他早一步春芽不发。
晚一步错过,正如恰逢其时,这个词,初看温柔又浪漫,再细看还有寻觅和牡丹,要经历
过多少次的生不逢时,才能换来。如今一生恰逢其时的感慨,每一次的遇见,都是来自上苍的礼物。
每一份相遇相知,都是属于命运的馈赠,面对离开,只要不辜负相遇就可以了。
你陪我一程,我念你一生,不管结局如何,至少我们都是真心相待过,这份温度足慰藉余生。
                                       ——————   一禅心灵庙语

文章目录

    • Apache-DButils以及Druid(德鲁伊) 多表连接查询的问题
    • 每博一文案
    • 1. 问题描述
    • 2. 解决方案
      • 2.1 方案一
      • 2.2 方案二
    • 3. 总结
    • 4. 最后


1. 问题描述

对于多表连接查询,存储多表连接查询的结果集,将 select 查询的结果集,存储到对应的JavaBean 中去的话是不行的 。因为你的查询是基于多张数据表得到的结果集,而对应 映射存储 到只有一张数据表的 一个 JavaBean 当中去,是不行的,该 JavaBean当中只有一张数据表的字段属性值,是无法将 select 基于多张数据表查询到的所有字段值内容,存储到的。

在这里插入图片描述

所以我们就可以使用如下两种方式,存储对于 select 多表查询的结果集。

  • 方式一:通过一个JavaBean中附加定义另外一个多表查询的表的 JavaBean 对象
  • 方式二:创建一个新的 JavaBean,该类包含 多表查询的所有字段的属性。

具体实现如下:解决方案。

2. 解决方案

用于方案的讲解,我们需要先创建如下两张数据表 department,employee。执行如下 SQL语句

CREATE TABLE department(
    dept_id INT PRIMARY KEY AUTO_INCREMENT,
    dept_name VARCHAR(30) NOT NULL DEFAULT '',
    emp_id INT NOT NULL
);

INSERT INTO department(dept_name,emp_id)
VALUES('财务部',1),('销售部',2),('研发部',3);

------------------------------------------

CREATE TABLE employee(
    emp_id INT PRIMARY KEY AUTO_INCREMENT,
    emp_name VARCHAR(30) NOT NULL DEFAULT '',
    email VARCHAR(50) NOT NULL DEFAULT '',
    gender VARCHAR(2) NOT NULL DEFAULT ''
)


INSERT INTO employee(emp_name,email,gender)
VALUES('张三','zhangsan@126.com','男'),
      ('李四','lisi@126.com','男'),
      ('王五','wangwu@126.com','男');

在这里插入图片描述

在这里插入图片描述

处理存储如下 SQL语句的 select 多表查询的结果集

SELECT dept_id AS deptId,dept_name AS deptName,employee.emp_id AS empId, 
                     emp_name AS empName,email,gender  
                     FROM department 
                     JOIN employee 
                     ON employee.emp_id = department.emp_id;

在这里插入图片描述


2.1 方案一

通过创建一个JavaBean 附加上另外一张数据表的 JavaBean 类作为 类属性存在如下:

在这里插入图片描述

对于多表连接查询,如果使用BeanListHandler,则会出现其中的一个JavaBean引用类型为 null (如果访问会出现 null引用异常)。也就是这里的 dept 引用类属性的值是 null
例如 DepartmentDeptAndEmp分类封装为 javabean。DeptAndEmp中声明一个Department的对象。如下图所示:

在这里插入图片描述

package Blogs.blogs6;

public class Department {
    private int deptId;
    private String deptName;
    private int empId;



    public Department() {
        // 无参构造器必须,创建用于 apache-dbutls 底层调用使用
    }



    // set/get必须创意用于 apache-dbutls底层反射赋值,取值
   public int getDeptId() {
        return deptId;
    }

    public void setDeptId(int deptId) {
        this.deptId = deptId;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public int getEmpId() {
        return empId;
    }

    public void setEmpId(int empId) {
        this.empId = empId;
    }


    @Override
    public String toString() {
        return "Department{" +
                "deptId=" + deptId +
                ", deptName='" + deptName + '\'' +
                ", empId=" + empId +
                '}';
    }
}

package Blogs.blogs6;

public class DeptAndEmp {
    private int empId;
    private String empName;
    private String email;
    private String gender;

    private Department dept;



    public DeptAndEmp() {
        // 无参构造器必须,创建用于 apache-dbutls 底层调用使用
    }


    // set/get必须创意用于 apache-dbutls底层反射赋值,取值
    public int getEmpId() {
        return empId;
    }

    public void setEmpId(int empId) {
        this.empId = empId;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Department getDept() {
        return dept;
    }

    public void setDept(Department dept) {
        this.dept = dept;
    }

    @Override
    public String toString() {
        return "DeptAndEmp{" +
                "empId=" + empId +
                ", empName='" + empName + '\'' +
                ", email='" + email + '\'' +
                ", gender='" + gender + '\'' +
                ", dept=" + dept +
                '}';
    }
}

演示BeanListHandler 存储多表查询中出现的 null空指针

import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import javax.sql.DataSource;
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.List;
import java.util.Properties;

public class MultiListSelect {
    public static void main(String[] args) {
        try {
            FileInputStream is = new FileInputStream(new File("src/druid.properties"));
            Properties properties = new Properties();
            properties.load(is);

            // 创建 druid 数据库连接池
            DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

            // 获取到数据库当中的连接
            Connection connection = dataSource.getConnection();


            QueryRunner queryRunner = new QueryRunner();
            // 存储方式: BeanListHandler 将查询的结果集存储到javaBean当中,再将所有的javaBean对象存储到list链表当中
            BeanListHandler<DeptAndEmp> beanListHandler = new BeanListHandler<DeptAndEmp>(DeptAndEmp.class);

            // 多表连接查询SQL语句
        String sql = "select dept_id as deptId,dept_name as deptName,employee.emp_id as empId, " +
                     "emp_name as empName,email,gender  " +
                     "from department " +
                     "join employee " +
                     "on employee.emp_id = department.emp_id";

            List<DeptAndEmp> deptAndEmpList = queryRunner.query(connection, sql, beanListHandler);

            for(DeptAndEmp deptAndEmp : deptAndEmpList) {
                System.out.println(deptAndEmp);
            }


        } catch (Exception e) {
            throw new RuntimeException(e);  // 将编译异常转换为运行异常抛出
        }


    }

在这里插入图片描述

从运行结果上看,我们可以发现,其中 select 语句多表查询的结果集并没有赋值到 Department 类对象当中,其中的属性倒是赋值了。

我们可以使用 MapListHandle存储形式,解决这个使用BeanListHandler出现空指针异常的现象。

MapListHandler的使用(具体使用方式查看官方文档https://commons.apache.org/proper/commons-dbutils/apidocs/index.html
在这里插入图片描述

key——SQL语句查询的字段
value——数据库中查询得到的结果

使用 MapListHandle最终返回 List<map<String,Object>>,使用 迭代循环foreach 的方式通过查询字段(注意这里的查询字段指的是 数据表结构中的字段名,使用别名是无效的)取出 value,首先根据 Department 类中的 keymap 中取出对应的 value ,并将其封装为 Department 对象中。最后再封装 DeptAndEmp对象到链表当中,这样就解决了 使用 BeanListHandler出现空指针异常的现象。

具体代码实现如下:

package Blogs.blogs6;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapListHandler;

import javax.sql.DataSource;
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;

public class MultiListSelect {
    public static void main(String[] args) {
        try {
            FileInputStream is = new FileInputStream(new File("src/druid.properties"));
            Properties properties = new Properties();
            properties.load(is);

            // 创建 druid 数据库连接池
            DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

            // 获取到数据库当中的连接
            Connection connection = dataSource.getConnection();


            QueryRunner queryRunner = new QueryRunner();
            // 存储方式: BeanListHandler 将查询的结果集存储到javaBean当中,再将所有的javaBean对象存储到list链表当中
            BeanListHandler<DeptAndEmp> beanListHandler = new BeanListHandler<DeptAndEmp>(DeptAndEmp.class);

            // 多表连接查询SQL语句
            String sql = "select dept_id as deptId,dept_name as deptName,employee.emp_id as empId, " +
                    "emp_name as empName,email,gender  " +  // 注意最后的空格,分隔
                    "from department " +
                    "join employee " +
                    "on employee.emp_id = department.emp_id";

            // 存储形式为 :  MapListHandler
            MapListHandler mapListHandler = new MapListHandler();
            List<Map<String, Object>> query = queryRunner.query(connection, sql, mapListHandler);  // 执行sql语句
            List<DeptAndEmp> list = new ArrayList<DeptAndEmp>();  // 定义集合链表存储 DeptAndEmp 多对象值

            for(Map<String,Object> map : query) {

                Department department = new Department();  // 定义存储对象
                DeptAndEmp deptAndEmp = new DeptAndEmp();

                // Department: 调用 set方法赋值
                department.setDeptId((int)map.get("dept_id"));
                department.setDeptName((String)map.get("dept_name"));

                // DeptAndEmp: 调用 set方法赋值
                deptAndEmp.setDept(department);
                deptAndEmp.setEmpId((int)map.get("emp_id"));   // 注意是查询中的字段名,使用别名没有用
                deptAndEmp.setEmail((String)map.get("email"));
                deptAndEmp.setEmpName((String) map.get("emp_name"));
                deptAndEmp.setGender((String) map.get("gender"));

                // 最后封装到链表当中
                list.add(deptAndEmp);
            }

            for(DeptAndEmp deptAndEmp : list) {
                System.out.println(deptAndEmp);

            }

        } catch (Exception e) {
            throw new RuntimeException(e);  // 将编译异常转换为运行异常抛出
        }


    }

}

在这里插入图片描述

在这里插入图片描述


2.2 方案二

创建一个新的 JavaBean,该类包含多表查询的所有字段的属性。 这种方式使用 BeanListHandler 存储形式。没有 null 空指针的存在。

如下创建的 JavaBean 包含 该SQL 多表查询的中所有的字段值,如下 EmpAndDept 类。

在这里插入图片描述

package Blogs.blogs6;

public class EmpAndDept {
    private int deptId;
    private String deptName;
    private int empId;
    private String empName;
    private String email;
    private String gender;

    public EmpAndDept() {
        // 无参构造器,必须定义,用于 apache-dbtlis底层的调用
    }

    // 同样set/get 也是必须定义的用于 apache-dbtils底层反射赋值,取值


    public int getDeptId() {
        return deptId;
    }

    public void setDeptId(int deptId) {
        this.deptId = deptId;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public int getEmpId() {
        return empId;
    }

    public void setEmpId(int empId) {
        this.empId = empId;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "EmpAndDept{" +
                "deptId=" + deptId +
                ", deptName='" + deptName + '\'' +
                ", empId=" + empId +
                ", empName='" + empName + '\'' +
                ", email='" + email + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}

具体代码如下:

import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;

import javax.sql.DataSource;
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;

public class MultiListSelect {
    public static void main(String[] args) {
        try {
            FileInputStream is = new FileInputStream(new File("src/druid.properties"));
            Properties properties = new Properties();
            properties.load(is);

            // 创建 druid 数据库连接池
            DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

            // 获取到数据库当中的连接
            Connection connection = dataSource.getConnection();


            QueryRunner queryRunner = new QueryRunner();
            // 存储方式: BeanListHandler 将查询的结果集存储到javaBean当中,再将所有的javaBean对象存储到list链表当中
            BeanListHandler<EmpAndDept> beanListHandler = new BeanListHandler<>(EmpAndDept.class);

            // 多表连接查询SQL语句
            String sql = "select dept_id as deptId,dept_name as deptName,employee.emp_id as empId, " +
                    "emp_name as empName,email,gender  " +
                    "from department " +
                    "join employee " +
                    "on employee.emp_id = department.emp_id";

            List<EmpAndDept> query = queryRunner.query(connection, sql, beanListHandler);

            for(EmpAndDept empAndDept : query) {
                System.out.println(empAndDept);
            }

        } catch (Exception e) {
            throw new RuntimeException(e);  // 将编译异常转换为运行异常抛出
        }
        
    }
}

在这里插入图片描述

在这里插入图片描述


3. 总结

  1. select 多表查询存储其结果集的数据信息。两种方案:
    1. 第一种方案:创建一个JavaBean 附加上另外一张数据表的 JavaBean 类作为 类属性存在
    2. 该方案不可以使用 BeanListHandler 存储形式,存在 null 空指针异常的问题,而是替换使用 MapListHandle 的方式,通过 循环迭代foreach() 通过 key(注意是数据表结构的字段名,别名没有用),获取到对应的 value 值,再通过 set 方法赋值到对应的类属性中去。从而解决了 使用 BeanListHandler出现空指针异常的现象。
    3. 第二种方案:创建一个新的 JavaBean,该类包含多表查询的所有字段的属性。 这种方式使用 BeanListHandler 存储形式。没有 null 空指针的存在。
  2. 处理多表查询的结果集,这两种方案都可以,各有千秋。
    1. 第一种方案,创建的 JavaBean类少,但是实现起来比较复杂一点,
    2. 第二种方案,创建的 JavaBean 类多,定义的属性多,但是实现起来比较简单。
  3. 具体使用其中的哪一种方案处理都可以,大家可以根据需要自行选择。

4. 最后

限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后会有期,江湖再见 !!!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U3j6sAVK-1669713513978)(E:\博客\JDBC博客库\image-20221129084353242.png)]

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

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

相关文章

iPhone开机密码什么时候会用到?忘记了怎么办?

iPhone的开机密码也是屏幕解锁密码&#xff0c;它的作用还是很重要的。一般用在&#xff1a; 解锁手机手机重启后解锁手机系统更新后第一次解锁手机手机连接电脑需要信任设备Face ID或指纹解锁失败三次后连接Apple Watch后第一次解锁手机 虽然我们现在经常使用其他的解锁方式&…

马斯克特斯拉内部邮件火了:痛恨开会,少说黑话

金磊 羿阁 发自 凹非寺量子位 | 公众号 QbitAI马斯克给员工的一封内部邮件火了。鼓励员工拒绝开会、公司规定不合理可以不遵守……俨然一个为员工着想的好老板。一开始人们还奇怪马斯克的画风怎么变这么快&#xff0c;后来才发现原来这是他6年前写的。对象也不是推特员工&#…

BCN点击试剂:1516551-46-4,BCN-succinimidylester,BCN NHS

●中文名&#xff1a;丙烷环辛炔-活性酯&#xff0c;BCN-琥珀酰亚胺酯 ●英文名&#xff1a;BCN-NHS&#xff0c; BCN-NHS 酯&#xff0c;BCN-活性酯&#xff0c;BCN-succinimidylester 【产品理化指标】&#xff1a; CAS号&#xff1a; 1516551-46-4 分子式&#xff1a;C15H17…

58 - 类模板的概念和意义

---- 整理自狄泰软件唐佐林老师课程 1. 思考 在C中是否能够将泛型的思想应用于类&#xff1f; 1.1 类模板 一些类主要用于存储和组织数据元素类中数据组织的方式和数据元素的具体类型无关 如&#xff1a;数组类、链表类、Stack类、Queue类&#xff0c;等 C中模板的思想应用于…

【LeetCode】No.103. Binary Tree Zigzag Level Order Traversal -- Java Version

题目链接&#xff1a;https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/ 1. 题目介绍&#xff08;Binary Tree Zigzag Level Order Traversal&#xff09; Given the root of a binary tree, return the zigzag level order traversal of its nodes’…

【网络编程】第二章 网络套接字(socket+UDP协议程序)

&#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

html实训大作业《基于HTML+CSS+JavaScript红色文化传媒网站(20页)》

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

群晖修改默认端口为80、443

写之前哔哔两句 我这个人是个有强迫症的人&#xff0c;本来群晖用的好好的&#xff0c;然后觉得为什么还要输入5000、5001端口呢&#xff1f; 然后我就尝试着去修改端口&#xff0c;想修改为40、443的时候&#xff0c;结果提示端口被保留&#xff0c;这我哪能忍&#xff0c;ss…

springboot整合canal

该篇博客是基于前两篇的基础上来实现的&#xff0c;如果没有看过可以看一下前面的步骤 使用docker搭建 MYSQL主从_极速小乌龟的博客-CSDN博客docker 上面搭建mysql主从服务器https://blog.csdn.net/qq_35771266/article/details/128101019?spm1001.2014.3001.5501 ShardingS…

Matlab optimtool优化阵列天线的幅相激励

摘要&#xff1a; 阵列天线的激励幅度和相位控制着其方向图形状。例如锥削分布的幅度可实现低副瓣、递变相位激励可改变波束指向&#xff0c;采用幅相综合控制则可实现平顶波束、余割平方等波束赋形。下面介绍利用Matlab optimtool优化阵列天线的幅相激励实现上述需求。 推文…

超市结算系统|Springboot+Vue通用超市结算收银系统

作者主页&#xff1a;编程千纸鹤 作者简介&#xff1a;Java、前端、Pythone开发多年&#xff0c;做过高程&#xff0c;项目经理&#xff0c;架构师 主要内容&#xff1a;Java项目开发、毕业设计开发、面试技术整理、最新技术分享 收藏点赞不迷路 关注作者有好处 项目编号&…

JavaScript基础语法(变量)

JavaScript基础语法&#xff08;变量&#xff09; 学习路线&#xff1a;JavaScript基础语法&#xff08;输出语句&#xff09;->JavaScript基础语法&#xff08;变量&#xff09;->JavaScript基础语法&#xff08;数据类型&#xff09;->JavaScript基础语法&#xff…

(一)DepthAI-python相关接口:OAK Device

消息快播&#xff1a;OpenCV众筹了一款ROS2机器人rae&#xff0c;开源、功能强、上手简单。来瞅瞅~ 编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查…

SuperMap iPortal 与独立代理服务的 session 共享通过redis配置实现

作者&#xff1a;yx 文章目录前言一、支持的Tomcat系列二、使用步骤1.将 /lib 中所有的 jar 拷贝到 tomcat/lib 目录2.给 tomcat 添加一个系统环境变量 "catalina.base"&#xff0c;变量取值为 tomcat 的根目录3、修改 redis 的相关配置4、在 【SuperMap iPortal / i…

Dreamweaver简单网页——HTML+CSS小米官网首页的设计与实现

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

数字化时代,中小企业如何落地数字化转型

大数据时代&#xff0c;各行各业的行业龙头和大型集团都已经开始了数据管理&#xff0c;让数据成为数据资产。但是在我国&#xff0c;中小企业的数量巨大&#xff0c;很多管理者忽视了这一点&#xff0c;今天我们就来聊一聊中小企业的数字化转型。 中小企业需要数字化转型 首…

博客系统【前后端分离版本】

笔记【博客系统】 测试网站&#xff1a;小孙的博客系统 测试&#xff1a;admin 测试&#xff1a;123456 实现一个网站&#xff0c;有两种典型的风格&#xff1a; 服务器渲染客户端渲染&#xff08;前后端分离&#xff09; 所谓渲染&#xff0c;就是把一个动态页面给构造出来 页…

性能测试fangan

XX 5.0系统 性能测试方案 修订历史记录 1 项目概述 1.1 背景说明 1.2 测试目的 为保证在日常运行及大型活动期间&#xff0c;稳定运行、应用快速&#xff0c;对进行性能测试&#xff0c;验证系统是否能够达到业务所需的性能指标&#xff0c;同时发现系统中存在的性能瓶颈&a…

对辊柱塞式成型机总体设计

目 录 摘 要 I Abstract II 第一章 绪论 1 1.1选题背景及意义 1 1.2国内外型秸秆谷物发展概况 2 1.2.1国外发展现状 2 1.2.2国内发展现状 2 1.3对辊柱塞式成型机的发展概况 6 1.3.1对辊柱塞式成型机的发展展状况 6 1.3.2对辊柱塞式成型机的成型机理 7 1.3研究主要内容 9 第二章…

UGUI性能优化学习笔记(一)网格重建

一、基本概念 在正式学习UGUI性能优化之前&#xff0c;需要先了解一些基本的概念 网格 无论是3D物体还是2D物体&#xff0c;都是由网格绘制而成。需要绘制的网格越多&#xff0c;性能消耗越大。 将Unity编译器调整到Wireframe模式&#xff0c;可以查看当前场景元素的网格组成…