使用MybatisPlus自定义模版中能获取到的信息

目录
  • 使用MybatisPlus的AutoGenerator生成代码
  • 模版中能获取到哪些信息
  • MybatisPlus遇到的坑
    • 1、导入依赖
    • 2、配置分页配置文件和数据源

使用MybatisPlus的AutoGenerator生成代码

这个可自行官网查看,或者搜索引擎查一下一大堆可以参考的,这里就不过多叙述。

模版中能获取到哪些信息

官方没有给出在自定义模版中你能获取到哪些信息来生成你想要的代码,所以本人就看了一下源码,能获取到的信息都在com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine类的getObjectMap方法中,如下:

    /**
     * <p>
     * 渲染对象 MAP 信息
     * </p>
     *
     * @param tableInfo 表信息对象
     * @return
     */
    public Map<String, Object> getObjectMap(TableInfo tableInfo) {
        Map<String, Object> objectMap = new HashMap<>();
        ConfigBuilder config = this.getConfigBuilder();
        if (config.getStrategyConfig().isControllerMappingHyphenStyle()) {
            objectMap.put("controllerMappingHyphenStyle", config.getStrategyConfig().isControllerMappingHyphenStyle());
            objectMap.put("controllerMappingHyphen", StringUtils.camelToHyphen(tableInfo.getEntityPath()));
        }
        objectMap.put("restControllerStyle", config.getStrategyConfig().isRestControllerStyle());
        objectMap.put("package", config.getPackageInfo());
        GlobalConfig globalConfig = config.getGlobalConfig();
        objectMap.put("author", globalConfig.getAuthor());
        objectMap.put("idType", globalConfig.getIdType() == null ? null : globalConfig.getIdType().toString());
        objectMap.put("logicDeleteFieldName", config.getStrategyConfig().getLogicDeleteFieldName());
        objectMap.put("versionFieldName", config.getStrategyConfig().getVersionFieldName());
        objectMap.put("activeRecord", globalConfig.isActiveRecord());
        objectMap.put("kotlin", globalConfig.isKotlin());
        objectMap.put("date", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
        objectMap.put("table", tableInfo);
        objectMap.put("enableCache", globalConfig.isEnableCache());
        objectMap.put("baseResultMap", globalConfig.isBaseResultMap());
        objectMap.put("baseColumnList", globalConfig.isBaseColumnList());
        objectMap.put("entity", tableInfo.getEntityName());
        objectMap.put("entityColumnConstant", config.getStrategyConfig().isEntityColumnConstant());
        objectMap.put("entityBuilderModel", config.getStrategyConfig().isEntityBuilderModel());
        objectMap.put("entityLombokModel", config.getStrategyConfig().isEntityLombokModel());
        objectMap.put("entityBooleanColumnRemoveIsPrefix", config.getStrategyConfig().isEntityBooleanColumnRemoveIsPrefix());
        objectMap.put("superEntityClass", this.getSuperClassName(config.getSuperEntityClass()));
        objectMap.put("superMapperClassPackage", config.getSuperMapperClass());
        objectMap.put("superMapperClass", this.getSuperClassName(config.getSuperMapperClass()));
        objectMap.put("superServiceClassPackage", config.getSuperServiceClass());
        objectMap.put("superServiceClass", this.getSuperClassName(config.getSuperServiceClass()));
        objectMap.put("superServiceImplClassPackage", config.getSuperServiceImplClass());
        objectMap.put("superServiceImplClass", this.getSuperClassName(config.getSuperServiceImplClass()));
        objectMap.put("superControllerClassPackage", config.getSuperControllerClass());
        objectMap.put("superControllerClass", this.getSuperClassName(config.getSuperControllerClass()));
        return objectMap;
    }

下面我就顺便整理一下方便以后查看

属性 类型 描述 示例
controllerMappingHyphenStyle boolean controllerMapping是否为连字符形式 驼峰:@RequestMapping("/managerUserActionHistory")连字符:@RequestMapping("/manager-user-action-history")
controllerMappingHyphen String 实体类的连字符形式 manager-user-action-history
restControllerStyle boolean 是否为RestController模式  
package Map 所有包配置信息  
package.Entity String Entity所在包路径 com.geek.sean.test.model
package.Mapper String Mapper所在包路径 com.geek.sean.test.mapper
package.Xml String Mapper的xml文件所在包路径 com.geek.sean.test.mapper.xml
package.ServiceImpl String Service实现类所在包路径 com.geek.sean.test.service.impl
package.Service String Service所在包路径 com.geek.sean.test.service
package.Controller String Controller所在包路径 com.geek.sean.test.controller
author String GlobalConfig中配置的author  
idType String GlobalConfig中配置的idType  
logicDeleteFieldName String 策略配置项中配置的逻辑删除属性名称  
versionFieldName String 策略配置项中配置的乐观锁属性名称  
activeRecord boolean 是否开启ActiveRecord模式  
kotlin boolean 是否开启 Kotlin 模式  
date String 当前日期(yyyy-MM-dd) 2019-07-09
table TableInfo 表信息,关联到当前字段信息  
table.name String 表名 例:sys_user
table.comment String 表描述 用户信息表
table.entityName String 实体类名称 SysUser
table.mapperName String Mapper类名 SysUserMapper
table.xmlName String Mapper对应的xml名称 SysUserMapper
table.serviceName String Service名称 SysUserService
table.serviceImplName String Service实现类名称 SysUserServiceImpl
table.controllerName String Controller名称 SysUserController
table.fields List<TableField> 字段信息集合  
table.fields[n].name String 字段名称 user_id
table.fields[n].type String 字段类型 int(11)、varchar(64)、timestamp、char(1)
table.fields[n].propertyName String 属性名 userId、userName
table.fields[n].columnType String 属性类型 String、Integer
table.fields[n].comment String 字段描述 用户名
table.importPackages List<String> 引入包集合 [‘com.baomidou.mybatisplus.enums.IdType’,‘java.util.Date’]
table.fieldNames String 表字段名,逗号分隔 user_id, user_name, password
enableCache boolean 是否在xml中添加二级缓存配置  
baseResultMap boolean 是否开启 BaseResultMap  
baseColumnList boolean 是否开启 baseColumnList  
entity String Entity类名  
entityColumnConstant boolean 【实体】是否生成字段常量(默认 false)  
entityBuilderModel boolean 【实体】是否为构建者模型(默认 false)  
entityLombokModel boolean 【实体】是否为lombok模型(默认 false)  
entityBooleanColumnRemoveIsPrefix boolean Boolean类型字段是否移除is前缀(默认 false) 比如 : 数据库字段名称 : ‘is_xxx’,类型为 : tinyint. 在映射实体的时候则会去掉is,在实体类中映射最终结果为 xxx
superEntityClass String Entity父类 BaseEntity
superMapperClassPackage String Mapper父类包路径 com.baomidou.mybatisplus.mapper.BaseMapper
superMapperClass String Mapper父类 BaseMapper
superServiceClassPackage String Service父类包路径 com.baomidou.mybatisplus.service.IService
superServiceClass String Service父类 IService
superServiceImplClassPackage String Service实现类父类包路径 com.baomidou.mybatisplus.service.impl.ServiceImpl
superServiceImplClass String Service实现类父类 ServiceImpl
superControllerClassPackage String Controller类父类包路径  
superControllerClass String Controller父类  

总结了一上午,个别字段没有放上,自己用到时候可以再去源码看看。

MybatisPlus遇到的坑

springBoot项目整合mybatis-plus、lombok时遇到了使用代码生成器生成实体类及mapper后,调用方法时报错找不到mapper,后经过一项项调整pom文件内jar包依赖,才知道mybatis-plus版本号存在很多不兼容。

1、导入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- mybatis的orm插件 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>2.1.9</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatisplus-spring-boot-starter</artifactId>
            <version>1.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <!--阿里数据库链接依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.9</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

因为我用的是阿里云的数据库,所以需要导入阿里云及数据库依赖,lombok为简化实体类生成的插件jar包。

注意:千万注意mybatis-plus版本!!!千万注意mybatis-plus版本!!!千万注意mybatis-plus版本!!!

2、配置分页配置文件和数据源

package com.ds.tech.config;
import javax.sql.DataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.alibaba.druid.pool.DruidDataSource;
/**
 * 数据源配置
 */
@Configuration
public class DataSourceConfig {
 
    @Bean(name="dataSource")
    @ConfigurationProperties(prefix="spring.datasource")
    public DataSource dataSource(){
        return new DruidDataSource();
    }
 
    // 配置事物管理器
    @Bean(name="transactionManager")
    public DataSourceTransactionManager transactionManager(){
        return new DataSourceTransactionManager(dataSource());
    }
}
package com.ds.tech.config;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
@Configuration
//扫描dao或者是Mapper接口
@MapperScan("com.ds.tech.mapper*")
public class MybatisPlusConfig {
  /**
   * mybatis-plus 分页插件
   */
  @Bean
  public PaginationInterceptor paginationInterceptor(){
      PaginationInterceptor page = new PaginationInterceptor();
      page.setDialectType("mysql");
      return page;
  }
}

配置代码生成器,然后就可以生成代码使用了

package com.ds.tech;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
/**
 * <p>
 * 代码生成器演示
 * </p>
 */
public class MpGenerator {
    final static String  dirPath = "D://mybatis";

    /**
     * <p>
     * MySQL 生成演示
     * </p>
     */
    public static void main(String[] args) {
        AutoGenerator mpg = new AutoGenerator();
        // 选择 freemarker 引擎,默认 Veloctiy
        //mpg.setTemplateEngine(new FreemarkerTemplateEngine());

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir(dirPath);
        gc.setAuthor("dashen");
        gc.setFileOverride(true); //是否覆盖
        gc.setActiveRecord(false);// 不需要ActiveRecord特性的请改为false
        gc.setEnableCache(false);// XML 二级缓存
        gc.setBaseResultMap(false);// XML ResultMap
        gc.setBaseColumnList(false);// XML columList

        // 自定义文件命名,注意 %s 会自动填充表实体属性!
        // gc.setMapperName("%sDao");
        // gc.setXmlName("%sMapper");
        // gc.setServiceName("MP%sService");
        // gc.setServiceImplName("%sServiceDiy");
        // gc.setControllerName("%sAction");
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL);
        dsc.setTypeConvert(new MySqlTypeConvert(){
            // 自定义数据库表字段类型转换【可选】
//            @Override
//            public DbColumnType processTypeConvert(String fieldType) {
//                System.out.println("转换类型:" + fieldType);
//                // 注意!!processTypeConvert 存在默认类型转换,如果不是你要的效果请自定义返回、非如下直接返回。
//                return super.processTypeConvert(fieldType);
//            }
        });
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("k");
        dsc.setPassword("mj^");
        dsc.setUrl("jdbc:mysql://rm-2zql.rds.aliyuncs.06/mjmk_dev?useUnicode=true&characterEncoding=utf-8");
        mpg.setDataSource(dsc);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        // strategy.setCapitalMode(true);// 全局大写命名 ORACLE 注意
        strategy.setTablePrefix(new String[] { "tb_", "tsys_" });// 此处可以修改为您的表前缀
        strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
        strategy.setInclude(new String[] { "store" }); // 需要生成的表
        // strategy.setExclude(new String[]{"test"}); // 排除生成的表
        // 自定义实体父类
        // strategy.setSuperEntityClass("com.baomidou.demo.TestEntity");
        // strategy.setSuperEntityClass("java.io.Serializable");
        // 自定义实体,公共字段
        // strategy.setSuperEntityColumns(new String[] { "test_id", "age" });
        // 自定义 mapper 父类
        // strategy.setSuperMapperClass("com.baomidou.demo.TestMapper");
        // 自定义 service 父类
        // strategy.setSuperServiceClass("com.baomidou.demo.TestService");
        // 自定义 service 实现类父类
        // strategy.setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl");
        // 自定义 controller 父类
        // strategy.setSuperControllerClass("com.baomidou.demo.TestController");
        // 【实体】是否生成字段常量(默认 false)
        // public static final String ID = "test_id";
        // strategy.setEntityColumnConstant(true);
        // 【实体】是否为构建者模型(默认 false)
        // public User setName(String name) {this.name = name; return this;}
         strategy.setEntityBuilderModel(true);
         strategy.setEntityLombokModel(true);
        mpg.setStrategy(strategy);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.ds.tech");
//        pc.setModuleName("");
        pc.setController("controller");
        pc.setEntity("entity");
        pc.setMapper("mapper");
        pc.setService("service");
        pc.setServiceImpl("serviceImpl");
        pc.setXml("mapperXml");

        mpg.setPackageInfo(pc);

        // 注入自定义配置,可以在 VM 中使用 cfg.abc 【可无】
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
                this.setMap(map);
            }
        };

        // 自定义 xxList.jsp 生成
        List<FileOutConfig> focList = new ArrayList<FileOutConfig>();
/*        focList.add(new FileOutConfig("/template/list.jsp.vm") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输入文件名称
                return "D://my_" + tableInfo.getEntityName() + ".jsp";
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);*/

        // 调整 xml 生成目录演示
/*        focList.add(new FileOutConfig("/templates/mapper.xml.vm") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return dirPath + tableInfo.getEntityName() + "Mapper.xml";
            }
        });
        cfg.setFileOutConfigList(focList);
        */
        mpg.setCfg(cfg);

        // 关闭默认 xml 生成,调整生成 至 根目录
/*        TemplateConfig tc = new TemplateConfig();
        tc.setXml(null);
        mpg.setTemplate(tc);*/

        // 自定义模板配置,可以 copy 源码 mybatis-plus/src/main/resources/templates 下面内容修改,
        // 放置自己项目的 src/main/resources/templates 目录下, 默认名称一下可以不配置,也可以自定义模板名称
        // TemplateConfig tc = new TemplateConfig();
        // tc.setController("...");
        // tc.setEntity("...");
        // tc.setMapper("...");
        // tc.setXml("...");
        // tc.setService("...");
        // tc.setServiceImpl("...");
        // 如上任何一个模块如果设置 空 OR Null 将不生成该模块。
        // mpg.setTemplate(tc);

        // 执行生成
        mpg.execute();

        // 打印注入设置【可无】
        System.err.println(mpg.getCfg().getMap().get("abc"));
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解使用Mybatis-plus + velocity模板生成自定义的代码

    pom.xml文件的配置 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>com.baomidou</groupId&

  • 基于mybatis plus实现数据源动态添加、删除、切换,自定义数据源的示例代码

    目录 简介 代码示例 mavne依赖 数据源增加.移除 数据源切换 基于AOP切换 基于重写处理器 自定义数据源 简介 基于springboot,mybatis plus集成了一套多数据源的解决方案,在使用时引入相应的插件dynamic-datasource-spring-boot-starter,可以实现数据源的动态添加.删除等功能,对于多租户或者分库等操作可以根据AOP切面代理到不同的数据源.实现单一系统数据隔离的目的. 代码示例 mavne依赖 <!--mybatis-plus--> &

  • Mybatis-Plus自定义集合类型的类型处理器详解

    目录 1.配合xml文件 2.手动注册 两种方法,第一种很麻烦,对mp自带的插入操作有限制,后来改为更简洁的第二种方法 1.配合xml文件 TypeHandler /**  * 描述:fastjson的集合对象类型处理器,将mysql表中的json字段映射到实体类中的{@code List<?>}属性  * 对照MP自带的FastjsonTypeHandler,自带的类型处理器会把所有的{@code List<?>}都会解析为{@code List<JsonObject>

  • 使用MybatisPlus自定义模版中能获取到的信息

    目录 使用MybatisPlus的AutoGenerator生成代码 模版中能获取到哪些信息 MybatisPlus遇到的坑 1.导入依赖 2.配置分页配置文件和数据源 使用MybatisPlus的AutoGenerator生成代码 这个可自行官网查看,或者搜索引擎查一下一大堆可以参考的,这里就不过多叙述. 模版中能获取到哪些信息 官方没有给出在自定义模版中你能获取到哪些信息来生成你想要的代码,所以本人就看了一下源码,能获取到的信息都在com.baomidou.mybatisplus.gener

  • Vue自定义指令中无法获取this的问题及解决

    目录 自定义指令中无法获取this 解决方法 Vue使用this的这几个坑你都知道吗 一.普通函数 二.Vue中的this 自定义指令中无法获取this 问题 最近在使用自定义指令时遇到一个问题,我想在指令里通过this直接去访问vue实例数据,但是显示未定义,经大佬提醒,里面的this很可能不是指向vue实例 解决方法 在函数里增加第三个参数vnode,vnode.context就是指向当前的vue实例 总结 指令里的this不是指向vue实例,可以使用vnode.context获取this

  • Android开发之在程序中时时获取logcat日志信息的方法(附demo源码下载)

    本文实例讲述了Android开发之在程序中时时获取logcat日志信息的方法.分享给大家供大家参考,具体如下: 今天分享一个在软件开发中很实用的例子,也是这几天在通宵加班中我使用的一个小例子, 在程序中监听Log信息. 为什么说它实用?原因是Android的开发厂商各种修改之后手机和手机之间以后存在很多差异.比如说魅族M9手机 开发中如果项目中涉及到访问手机系统的地方,例如访问系统短信库,M9手机它会提示一个dialog框 让用户自己去选择 访问还是不访问.这样就给开发适配带来了巨大的麻烦.本来

  • Python运维之获取系统CPU信息的实现方法

    使用Python进行运维工作的时候有时候需要获取CPU的信息,这在psutil模块库的帮助下非常容易实现. 常见的CPU信息有以下几种: 1,用户时间以及百分比: 2,系统时间以及百分比: 3,空闲时间以及百分比: 4,CPU的硬件信息: 前3个中的时间可以采用cpu_times方法获取,百分比可以使用cpu_times_pcercent获得. 简单的示范如下: In [9]: importpsutil In [10]:psutil.cpu_times() Out[10]: scputimes(

  • Android编程实现在自定义对话框中获取EditText中数据的方法

    本文实例讲述了Android编程实现在自定义对话框中获取EditText中数据的方法.分享给大家供大家参考,具体如下: 在项目中忽然遇到这样的问题,需要自定义对话框,对话框需要有一个输入框,以便修改所选中的价格,然后点击确定之后,修改所显示的价格.遇到的最大的问题就是如何能够获取到自定义对话框当中edittext输入的数值,百度了很久,看到的答案都是如下: //得到自定义对话框 final View DialogView = a .inflate ( R.layout.loand, null);

  • Mybatis-plus在项目中的简单应用

    目录 分页插件 逻辑删除 自动填充 乐观锁 多数据源 通用枚举 id生成及主键 查询 LambdaQueryWrapper 本文是一篇随笔,记录项目中应用的一些情景. Mybatis-plus是Spring框架中OOM的一大利器,其简单易用参考官网文档即可很快上手.mp.baomidou.com/guide/ p6spy 执行 SQL 分析打印,只需加入依赖,加入配置文件即可有完美的sql打印.有性能损耗线上不能使用 分页插件 只需注入插件即可,实在太方便了有没有. // 最新版 @Bean p

  • MyBatis-Plus自定义SQL的详细过程记录

    目录 前言 一.在src/main/resource目录下编写XML 1.1  目录结构 1.2   编写实体类对应的Mapper接口 1.3  编写UserMapper.xml 1.4  在配置文件中扫描我们的xml配置的位置. 1.5  测试 二.在src/main/java目录下编写XML 2.1  目录结构 2.2   编写实体类对应的Mapper接口 2.3   编写UserMapper.xml 2.4   编写配置文件 2.5   配置pom.xml(重要) 2.6  测试 三.cl

  • 详解Angularjs 自定义指令中的数据绑定

    有关自定义指令的scope参数,网上很多文章都在讲这3种绑定方式实现的效果是什么,但几乎没有人讲到底怎么使用,本篇希望聊聊 到底怎么用 这个话题. 一. 自定义指令 自定义指令,是 Angularjs 用来实现组件化的方式,相比于 React 和 Vue 的组件化方式,它真的很复杂,自定义指令太重了,它暴露了太多可供定制的参数,以至于普通的开发者完全不知道要用它来做什么而将其束之高阁,毕竟一般的业务逻辑通过controller和service就已经可以完成了. 自定义指令在 Angularjs

  • Laravel 实现在Blade模版中使用全局变量代替路径的例子

    在使用tp框架时,我们可以用常量来代替文件路径,如: <img class="style" src="__TMPL__/uploads/ad/{$item.config.shop_image}"> 我们只需要在配置文件中设置即可, TMPL_PARSE_STRING' => array( '__TMPL__' => __ROOT__.'/tpl', '__UPLOAD__' => __ROOT__."/Data/upload&

  • 基于自定义BufferedReader中的read和readLine方法

    实例如下所示: package day0208; import java.io.FileReader; import java.io.IOException; /* * 自定义读取缓冲区,实现BufferedReader功能 * 分析: * 缓冲区就是封装了一个数组,并对外提供了更多的方法对数组进行访问 * 其实这些方法最终操作的都是数组的角标 * 缓冲的原理: * 其实就是从源中获取一批数据装进缓冲区,再从缓冲区取出数据 * 当此次取完后,继续从源中取出一批数据到缓冲区 * 当源中的数据取光时

随机推荐