MyBatisPlus概述 需要的基础:把我的MyBatis、Spring、SpringMVC就可以学习这个了! 为什么要学习它呢?MyBatisPlus可以节省我们大量工作时间,所有的CRUD代码它都可以自动化完成! JPA 、 tk-mapper、MyBatisPlus 偷懒的!简介 是什么? MyBatis 本来就是简化 JDBC 操作的! 官网:https://mp.baomidou.com/ MyBatis Plus,简化 MyBatis !特性 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作, BaseMapper 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求, 以后简单的CRUD操作,它不用自己编写 了!支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配 置,完美解决主键问题 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大 的 CRUD 操作支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere ) 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(自动帮你生成代码) —内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同 于普通 List 查询 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、 Postgre、SQLServer 等多种数据库 —内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢 查询 —内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误 操作 快速入门 地址:https://mp.baomidou.com/guide/quick-start.html#初始化工程 使用第三方组件:1、导入对应的依赖 2、研究依赖如何配置 3、代码如何编写 4、提高扩展技术能力!配置日志 (开发的时候看sql是怎么执行的) 我们所有的sql现在是不可见的,我们希望知道它是怎么执行的,所以我们必须要看日志!mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
计算属性 计算属性的重点突出在 属性 两个字上(属性是名词),首先它是个 属性其次这个属性有 计 算 的能力(计算是动词),这里的 计算 就是个函数;简单点说,它就是一个能够将计算结果缓存 起来的属性(内存中运行)(将行为转化成了静态的属性),仅此而已;可以想象为缓存! 代码测试:07-vue-computed.html <body> <div id="app"> <!--注意,一个是方法,一个是属性--> <p>调用当前时间的方法:{{currentTime1()}}</p> <p>当前时间的计算属性:{{currentTime2}}</p> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"> </script> <script> var vue = new Vue({ el: '#app', data: { message: 'Hello Vue' }, methods: { currentTime1: function () { return Date.now(); } }, computed: { //currentTime2 ,这是一个属性!不是方法 currentTime2: function () { this.message; return Date.now(); } } }) </script> </body> 注意:methods 和 computed 里的东西不能重名 说明:methods:定义方法,调用方法使用 currentTime1(),需要带括号;computed:定义计算属性,调用属性使用 currentTime2,不需要带括号;this.message 是为了 能够让 currentTime2 观察到数据变化而变化; 如果在方法中的值发生了变化,则缓存就会刷新!可以在控制台使用 vm.message="qinjiang"改变下数据的值,再次测试观察效果! 结论: 调用方法时,每次都需要进行计算,既然有计算过程则必定产生系统开销,那如果这个结果是不经常变 化的呢?此时就可以考虑将这个结果缓存起来,采用计算属性可以很方便的做到这一点,计算属性的主 要特性就是为了将不经常变化的计算结果进行缓存,以节约我们的系统开销; 插槽 在 Vue 中我们使用 <slot> 元素,作为承载分发内容的出口,作者称其为 插槽,可以应用在组合组 件的场景中; 比如准备制作一个待办事项组件(todo),该组件由待办标题(todo-title)和待办内容(todo-items) 组成,但这三个组件又是相互独立的,该如何操作呢? 08-vue-todo.html 第一步: 定义一个待办事项的组件 <todo></todo> <script type="text/javascript"> // 定义一个待办事项的组件 Vue.component('todo', { template: '<div>\ <div>待办事项</div>\ <ul>\ <li>学习狂神说Java</li>\ </ul>\ </div>' }); </script> 第二步: 我们需要让待办事项的标题和值实现动态绑定,怎么做呢? 我们可以留出一个插槽! 1、将上面的代码留出一个插槽,即 slot Vue.component('todo', { template: '<div>\ <slot name="todo-title"></slot>\ <ul>\ <slot name="todo-items"></slot>\ </ul>\ </div>' });定义一个名为 todo-title 的待办标题组件 和 todo-items 的待办内容组件 Vue.component('todo-title', { props: ['title'], template: '<div>{{title}}</div>' }); //这里的index,就是数组的下标,使用for循环遍历的时候,可以循环出来! Vue.component('todo-items', { props: ['item', 'index'], template: '<li>{{index + 1}}. {{item}}</li>' });实例化Vue并初始化数据 new Vue({ el: '#app', data: { todoItems: ['狂神说Java', '狂神说运维', '狂神说前端'] } }) 将这些值,通过插槽插入 <div id="app"> <todo> <todo-title slot="todo-title" title="秦老师系列课程"></todo-title> <todo-items slot="todo-items" v-for="(item, index) in todoItems" v-bind:item="item" v-bind:index="index"></todo-items> </todo> </div>说明:我们的 todo-title 和 todo-items 组件分别被分发到了 todo 组件的 todo-title 和 todo-items 插槽 中 进阶:自定义事件 通过以上代码不难发现,数据项在 Vue 的实例中,但删除操作要在组件中完成,那么组件如何才能删除 Vue 实例中的数据呢?此时就涉及到参数传递与事件分发了,Vue 为我们提供了自定义事件的功能很好 的帮助我们解决了这个问题;使用 this.$emit('自定义事件名', 参数),操作过程如下: 1、在vue的实例中,增加了 methods 对象并定义了一个名为 removeTodoItems 的方法 new Vue({ el: '#app', data: { todoItems: ['狂神说Java', '狂神说运维', '狂神说前端'] }, methods: { // 该方法可以被模板中自定义事件触发 removeTodoItems: function (index) { console.log("删除 " + this.todoItems[index] + " 成功"); // splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目 // 其中 index 为添加/删除项目的位置,1 表示删除的数量 this.todoItems.splice(index, 1); } } }) 修改 todo-items 待办内容组件的代码,增加一个删除按钮,并且绑定事件! Vue.component('todo-items', { props: ['item', 'index'], template: '<li>{{index + 1}}. {{item}} <button @click="remove_component">删除</button></li>', methods: { remove_component: function (index) { // 这里的 remove 是自定义事件的名称,需要在 HTML 中使用 v-on:remove 的方式指派 this.$emit('remove', index); } } });3、修改 todo-items 待办内容组件的 HTML 代码,增加一个自定义事件,比如叫 remove,可以和组件的方 法绑定,然后绑定到vue的方法中! <!--增加了 v-on:remove="removeTodoItems(index)" 自定义事件,该事件会调用 Vue 实例中 定义的名为 removeTodoItems 的方法--> <todo-items slot="todo-items" v-for="(item, index) in todoItems" v-bind:item="item" v-bind:index="index" v-on:remove="removeTodoItems(index)"></todo-items>逻辑理解
MVVM模式 什么是MVVM模式? MVVM(Model-View-ViewModel)是一种软件架构设计模式,由微软 WPF(用于替代 WinForm,以 前就是用这个技术开发桌面应用程序的)和 Silverlight(类似于 Java Applet,简单点说就是在浏览器上 运行的 WPF) 的架构师 Ken Cooper 和 Ted Peters 开发,是一种简化用户界面的事件驱动编程方式。 由 John Gossman(同样也是 WPF 和 Silverlight 的架构师)于 2005 年在他的博客上发表。 MVVM 源自于经典的 MVC(Model-View-Controller)模式。MVVM 的核心是 ViewModel 层,负责转 换 Model 中的数据对象来让数据变得更容易管理和使用,其作用如下: 该层向上与视图层进行双向数据绑定 向下与 Model 层通过接口请求进行数据交互MVVM 已经相当成熟了,当下流行的 MVVM 框架有 Vue.js , AngularJS 等。 为什么要使用 MVVM MVVM 模式和 MVC 模式一样,主要目的是分离视图(View)和模型(Model),有几大好处:低耦合: 视图(View)可以独立于 Model 变化和修改,一个 ViewModel 可以绑定到不同的 View 上,当 View 变化的时候 Model 可以不变,当 Model 变化的时候 View 也可以不变。 可复用: 你可以把一些视图逻辑放在一个 ViewModel 里面,让很多 View 重用这段视图逻辑。独立开发: 开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页 面设计。 可测试: 界面素来是比较难于测试的,而现在测试可以针对 ViewModel 来写。 MVVM 的组成部分Runtime Compiler及时运行及时编译View: View 是视图层,也就是用户界面。前端主要由 HTML 和 CSS 来构建,为了更方便地展现 ViewModel 或者 Model层的数据,已经产生了各种各样的前后端模板语言,比如 FreeMarker、 Thymeleaf 等等,各大 MVVM 框架如 Vue.js,AngularJS,EJS 等也都有自己用来构建用户界面的内置 模板语言。 Model: Model 是指数据模型,泛指后端进行的各种业务逻辑处理和数据操控,主要围绕数据库系统展开。这里 的难点主要在于需要和前端约定统一的 接口规则 ViewModel: ViewModel 是由前端开发人员组织生成和维护的视图数据层。在这一层,前端开发者对从后端获取的 Model 数据进行转换处理,做二次封装,以生成符合 View 层使用预期的视图数据模型需要注意的是 ViewModel 所封装出来的数据模型包括视图的状态和行为两部分,而 Model 层的数据模 型是只包含状态的。比如页面的这一块展示什么,那一块展示什么这些都属于视图状态(展示) 页面加载进来时发生什么,点击这一块发生什么,这一块滚动时发生什么这些都属于视图行为(交 互) 视图状态和行为都封装在了 ViewModel 里。这样的封装使得 ViewModel 可以完整地去描述 View 层。 由于实现了双向绑定,ViewModel 的内容会实时展现在 View 层,这是激动人心的,因为前端开发者再 也不必低效又麻烦地通过操纵 DOM 去更新视图。 MVVM 框架已经把最脏最累的一块做好了,我们开发者只需要处理和维护 ViewModel,更新数据视图就 会自动得到相应更新,真正实现 事件驱动编程 。 View 层展现的不是 Model 层的数据,而是 ViewModel 的数据,由 ViewModel 负责与 Model 层交互,这就完全解耦了 View 层和 Model 层,这个解耦是至关重要的,它是前后端分离方 案实施的重要一环。
C3P0C3p0是一个开源的JDBC连接池,目前使用它的开源项目是Hibernate、SpringC3P0和dbcp区别:dbcp没有自动回收空闲连接的功能C3P0有自动回收空闲连接的功能需要用到的jar包c3p0-0.9.5.5、mchange-commons-java-0.2.191、导包2、在类目录下加入C3P0的配置文件:c3p0-config.xml <?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <!-- C3P0的缺省(默认)配置, 如果在代码中“ComboPooledDataSource ds = new ComboPooledDataSource();”这样写 就表示使用的是C3P0的缺省(默认)配置信息来创建数据源 --> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcStudy? useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=true</property> <property name="user">root</property> <property name="password">123456</property> <property name="acquireIncrement">5</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">5</property> <property name="maxPoolSize">20</property> </default-config> <!-- C3P0的命名配置, 如果在代码中“ComboPooledDataSource ds = new ComboPooledDataSource("MySQL");”这样写就表示使用的是name是MySQL的配置信息来创建数据 源 --> <named-config name="MySQL"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcStudy? useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=true</property> <property name="user">root</property> <property name="password">123456</property> <property name="acquireIncrement">5</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">5</property> <property name="maxPoolSize">20</property> </named-config> </c3p0-config> 3、创建工具类 package com.kuang.datasource.utils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.mchange.v2.c3p0.ComboPooledDataSource; //数据库连接工具类 public class JdbcUtils_C3P0 { private static ComboPooledDataSource ds = null; //在静态代码块中创建数据库连接池 static{ try{ //通过代码创建C3P0数据库连接池 /*ds = new ComboPooledDataSource(); ds.setDriverClass("com.mysql.jdbc.Driver"); ds.setJdbcUrl("jdbc:mysql://localhost:3306/jdbcstudy"); ds.setUser("root"); ds.setPassword("123456"); ds.setInitialPoolSize(10); ds.setMinPoolSize(5); ds.setMaxPoolSize(20);*/ //通过读取C3P0的xml配置文件创建数据源,C3P0的xml配置文件c3p0-config.xml必须放在src目录下 //ds = new ComboPooledDataSource();//使用C3P0的默认配置来创建数据源 ds = new ComboPooledDataSource("MySQL");//使用C3P0的命名配置来创建数据源 //////////////////////////////////////////// }catch (Exception e) { throw new ExceptionInInitializerError(e); } } //从数据源中获取数据库连接 public static Connection getConnection() throws SQLException{ //从数据源中获取数据库连接 return ds.getConnection(); ///////////////////////////////// } //释放资源 public static void release(Connection conn,Statement st,ResultSet rs){ if(rs!=null){ try{ //关闭存储查询结果的ResultSet对象 rs.close(); }catch (Exception e) { e.printStackTrace(); } rs = null; } if(st!=null){ try{ //关闭负责执行SQL命令的Statement对象 st.close(); }catch (Exception e) { e.printStackTrace(); } } if(conn!=null){ try{ //将Connection连接对象还给数据库连接池 conn.close(); }catch (Exception e) { e.printStackTrace(); } } } } 测试 package com.kuang.datasource; import com.kuang.datasource.utils.JdbcUtils_C3P0; import com.kuang.datasource.utils.JdbcUtils_DBCP; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Date; public class C3P0Test { public static void main(String[] args) { Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try{ //获取数据库连接 conn = JdbcUtils_C3P0.getConnection(); /////////////////////////////// String sql = "insert into users(id,name,password,email,birthday) values(?,?,?,?,?)"; st = conn.prepareStatement(sql); st.setInt(1, 6);//id是int类型的 st.setString(2, "kuangshen");//name是varchar(字符串类型) st.setString(3, "123");//password是varchar(字符串类型) st.setString(4, "24736743@qq.com");//email是varchar(字符串类型) st.setDate(5, new java.sql.Date(new Date().getTime()));//birthday是date类型 int i = st.executeUpdate(); if (i>0){ System.out.println("插入成功"); } }catch (Exception e) { e.printStackTrace(); }finally{ //释放资源 JdbcUtils_C3P0.release(conn, st, rs); //////////////////////// } } }
规范数据库设计为什么需要设计当数据库比较复杂的时候就需要设计糟糕的数据库设计:数据冗余、浪费空间数据库插入和删除都会麻烦、异常 【屏蔽使用物理外键】程序的性能差良好的数据库设计:节省内存空间保证数据库的完整性方便开发系统软件开发中,关于数据库的设计:分析需求:分析业务和需要处理的数据库需求概要设计:设计关系图E-R图设计数据库的步骤(个人博客):收集信息,分析需求用户表 (用户登录注销,用户的个人信息,写博客,创建分类)分类表 (文章分类,谁创建的)文章表 (文章的信息)评论表友链表 (友链信息)自定义表 (系统信息,某个关键字或者一些主字段)key:value说说表 (发表心情,id...content...createtime)标识实体类 (把需求落地到实处)标识实体之间的关系写博客user -> blog分类user -> category关注user -> user友联links评论user->user->blog
物理外键 foreign key以下外键都是物理外键(数据库级别的外键),我们不建议使用(避免数据库过多造成困扰)最佳实践数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)想使用多张表的数据时,想使用外键(程序去实现)概念公共关键字:一个表(从表)中的主关键字在另外一个表(主表)中作为外键用于约束,使两个表之间形成关联创建方式一 -- 年级表 (从表) create table `grade` ( `gradeid` int(10) not null auto_increment comment `年纪ID`, `gradename` varchar(50) not null commnet `年级名称`, primary key (`gradeid`) ) ENGINE = INNODB default charset = utf8 -- 学生信息表 (学号,姓名,性别,年级,手机,地址,出生日期,邮箱,身份证号) create table `student` ( `studentno` int(4) not null comment '学号', `studentname` varchar(20) not null default '匿名' comment '姓名', `sex` tinyint(1) default '1' commnet '性别', `gradeid` int(10) default null comment '年级', `phoneNum` varchar(50) not null comment '手机', `address` varchar(255) default null comment '地址', `borndate` datetime default null comment '生日', `email` varchar(50) default null comment '邮箱', `idCard` varchar(18) default null comment '身份证号', primary key (`studentno`), key `FK_gradeid` (`gradeid`), -- 定义外键key(可省略) constraint `FK_gradeid` foreign key (`gradeid`) references `grade` (`gradeid`) -- 给外键Key增加约束 ) ENGINE = innodb default charset=utf8 方式二 alter table `student` add constraint `FK_gradeid` foreign key (`gradeid`) references `grade`(`gradeid`);
static关键字可以用来修饰:属性、方法、代码块、内部类静态变量public static int num会被类中的所有实例共享,随着类的加载而加载,静态变量的加载早于对象的创建!!!由于类只会加载一次,则静态变量在内存中也只会存在一份,存在方法区的静态域中实例变量:每个对象都独立的拥有一套类中的非静态属性,修改其中的一个时不会对其他对象中同样的属性进行修改(在类的加载之后,随着对象的加载而加载)Student stu = new Student();推荐使用Student.num调用(类名.属性名),对象名.属性名也可以 直接使用变量名也可以静态方法通过类.方法()调用 或直接用 方法()静态方法中只能调用静态方法或属性非静态方法中,既可以调用静态方法也可以调用非静态方法或属性在静态方法中,不能使用this、super关键字何时声明静态方法和静态变量静态变量:属性可以被多个对象所共享,不会随着对象的不同而不同类中的常量也通常声明为static静态方法:操作静态属性的方法,通常设置为static工具类中的方法,习惯上声明为static。比如Math、Arrays、Collectionsstatic final用来修饰属性:全局常量静态代码块 class Person{ { 匿名代码块 // 一般用来赋初值 } { 静态代码块 // 对象创建的时候只执行一次 } }导入包里面的静态方法 正常应该是 import java.lang.Math; Sysytem.out.println(Math.random());
冬季实战营第五期学习报告第一天 基于EMR离线数据分析本实验免费提供EMR集群,基于EMR集群进行离线数据分析。体验收获登录EMR集群。上传数据到HDFS。使用hive创建表,并从hadoop文件系统加载数据。背景知识E-MapReduce(简称“EMR”)是云原生开源大数据平台,向客户提供简单易集成的Hadoop、Hive、Spark、Flink、Presto、Clickhouse、Delta、Hudi等开源大数据计算和存储引擎。EMR计算资源可以根据业务的需要调整。EMR可以部署在阿里云公有云的ECS和ACK、专有云平台。产品文档地址:https://www.aliyun.com/product/emapreduce产品优势开源生态:提供高性能、稳定版本Hadoop、Spark、Hive、Flink、Kafka、HBase、Presto、Impala、Hudi等开源大数据组件,客户可根据场景灵活搭配使用引擎优化:多引擎性能优化,如Spark SQL较开源版本提升6倍。采用JindoFS+OSS,保证数据可靠性基础上,性能大幅提升便捷运维:在阿里云控制台和OpenAPI方便地对集群、节点和服务进行监控和运维操作。助您大幅提升运维工作效率,让数据工程师更专注于业务开发节约成本:集群资源可自动按需匹配,您只需要按实际使用量付费,减少资源浪费成本。支持阿里云抢占式实例、预留实例券(RI),进一步降低成本弹性资源:可以灵活调整集群资源,在数分钟内创建出基于云服务器 ECS、容器 ACK的集群,快速响应业务需求安全可靠:通过 VPC 和安全组设置集群网络安全策略,支持Kerberos身份认证和数据加密,使用Ranger数据访问控制。支持数据加密,保证数据安全第二天 使用阿里云Elasticsearch快速搭建智能运维系体验目标 本场景通过创建登录阿里云Elasticsearch集群,使用Beats采集器收集ECS上的系统数据和Nginx服务数据,配置基础的指标分析看板,简单展示数据采集、分析的过程和操作方式。背景介绍阿里云Elasticsearch兼容开源ELK功能,提供免运维全托管服务的弹性云搜索与分析引擎,致力于数据库加速、数据分析、信息检索、智能运维监控等场景服务;独有的云原生高性能内核、达摩院NLP分词、向量检索、智能运维、免费X-Pack高级商业特性等能力,全面提升企业应用效率,降低成本。产品详情:https://www.aliyun.com/product/bigdata/elasticsearch产品文档:https://help.aliyun.com/document_detail/196921.html第三天 推荐系统入门之使用协同过滤实现商品推荐本场景将使用机器学习PAI平台,指导您搭建一个基于协同过滤算法的商品推荐系统。背景知识数据挖掘的一个经典案例就是尿布与啤酒的例子。尿布与啤酒看似毫不相关的两种产品,但是当超市将两种产品放到相邻货架销售的时候,会大大提高两者销量。很多时候看似不相关的两种产品,却会存在这某种神秘的隐含关系,获取这种关系将会对提高销售额起到推动作用,然而有时这种关联是很难通过经验分析得到的。这时候我们需要借助数据挖掘中的常见算法-协同过滤来实现。这种算法可以帮助我们挖掘人与人以及商品与商品的关联关系。协同过滤算法是一种基于关联规则的算法。以购物行为为例,如果用户甲和用户乙都购买了商品A和商品B,则可以假定用户甲和用户乙的购物品味相似。当用户甲购买了商品C,而用户乙未购买时,可以将商品C推荐给用户乙,这就是经典的User-Based,即以User的特性为关联。第四天 直播实战利用湖仓一体架构快速搭建企业数据中台第五天 直播实战基于Elasticsearch+Fink的日志全观测最佳实践
冬季实战营第四期学习报告第一天 动手实战-基础学习之阿里云容器服务Kubernetes版快速入门学习了Kubernets版本的阿里云容器服务,用的是Github上的魔方案例收获Kubernetes版真实的使用场景体验容器化Demo应用第二天 动手实战-基础学习之Docker镜像管理快速入门技术简介容器技术:一个允许我们在资源隔离的过程中,运行应用程序和其依赖项的 、轻量的 、操作系统级别的虚拟化技术, 运行应用程序所需的所有必要组件都打包为单个镜像,这个镜像是可以重复使用的。当镜像运行时,它是运行在独立的环境中,并不会和其他的应用共享主机操作系统的内存、CPU或磁盘。这保证了容器内的进程不会影响到容器外的任何进程。镜像仓库:Docker的镜像存储中心通常被称为Registry。当您需要获取自己私有镜像时,首先需要登录Registry,然后拉取镜像。修改过镜像之后,您可以再次将镜像推送回Registry中去。或者在本地通过Docker镜像构建的功能生成镜像,再推送到Registry中。容器镜像服务ACR(Alibaba Cloud Container Registry)阿里云容器镜像服务ACR默认实例版提供基础的容器镜像服务,包括安全的应用镜像托管能力、精确的镜像安全扫描功能、稳定的国内外镜像构建服务以及便捷的镜像授权功能,从而方便用户进行镜像全生命周期管理。第三天 动手实战-进阶实战之Chaos带你快速上手混沌工程主要学习了混沌工程的主要思想及原理,体验故障演练。收获通过架构感知直观地观察系统结构通过故障演练给系统快速注入故障通过Chaos一站式实现微服务强弱依赖治理介绍容器服务ACK:容器服务Kubernetes版(简称ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理;是国内唯一入选2020年Gartner公共云容器报告的产品,并在2019年Forrester容器报告中获国内排名第一;整合了阿里云虚拟化、存储、网络和安全能力,助力企业高效运行云端Kubernetes容器化应用。故障演练Chaos:故障演练(Chaos)是云原生混沌工程平台,提供了大规模、低成本、影响可控、形式多样化的故障演练服务。Chaos提供一站式架构分析、故障巡检、故障注入、系统稳态度量等功能,帮助用户增强分布式系统的容错性和可恢复性,帮助系统平稳上云。第四天 直播带练使用阿里云容器服务和容器网络文件系统搭建WordPress网站第五天 直播带练如何保证线上应用的最佳状态,保证业务连续性
MySQL实验简介MySQL日常运维管理基本SQL语句的使用体验步骤阿里云提供一个Linux系统。安装mysql执行mysql的操作学习基本的SQL语句体验收获: \1. MySQL安装\2. MySQL日常运维管理\3. 基本SQL语句的使用业务背景MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于Oracle旗下产品。MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。优势MySQL是免费的运行速度快使用范围广实习体验 本次实习训练营是在阿里云免费提供的云服务器上安装部署mysql,然后学习mysql的常规命令的使用。其中包括基本sql语句的使用、查看源数据库、使用数据传输服务。 其中我最期待的就是第四天的小项目,利用ECS+RDS(Relational Database Service)数据库实例,安装Apache+PHP+WordPress,成功部署一个WordPress的云博客(管理系统)!
Linux文本处理命令模式就是控制光标移动和输入命令,可对文本进行复制、粘贴、删除和查找等工作。这也是Vim进入编辑器中的默认模式输入模式按下i或a键进入,可以编辑文本底线命令模式在命令模式下按:键就进入了底线命令模式,在底线命令模式中可以输入单个或多个字符的命令Linux系统管理echo命令用于在终端中输出字符串或变量提取后的值Linux磁盘管理Linux文件与权限ls命令用于显示指定工作目录下的内容。`ls 参数 目录名`Linux文件管理cat命令用于连接文件并打印到标准输出设备上cat [参数] [文件名]cmp命令用于比较两个文件是否有差异。一样时,不显示任何信息。否则会标示出第一个不同之处的字符和列数编号。当不指定任何文件名称,或文件名为"-",则cmp指令会从标准输入设备读取数据。总结虽然在这五天中学到了很多Linux的命令,但如果不去巩固练习、反复使用还是无法避免遗忘
HashSet 集合(去重)public String to_String(){return “”+i;}加上这个函数后可以直接输出对象HashMap<键,值> Hash表容器中的所有类型必须是对象,不能是数据类型HashMap <Integer,String> 容器名 HashMap <Integer,String>HashMap会去重(相同的键值会替换掉)继承向上转型和数据类型转换的区别向上转型只是把转化的对象看成父类,实际上并没有改变数据类型是真正意义上转化了数据的类型 int i = (int)10.2;super()用于子类向父类传递构造函数的参数如果使用继承的子类中不加super()则默认使用父类中无参数的super();父类的成员变量(属性)可以在子类中被覆盖protected的含义:只有包内的其他类、自己和子类可以访问
开源应用中心聚合最热门的开源应用,前端应用一键托管启用、快速部署操作指南1、开源应用提供了许多丰富的应用,如hexo、VuePress等,可以选择一个喜欢的作为模板2、创建我的应用如果是新用户需要登录云开发平台签署协议,开通OSS同时还需要准备一个Github账号关联3、部署上线配置好应用之后,在云开发平台->应用部署中先部署日常环境上线成功后,再根据自己买的域名,自定义域名后,复制CNAME解析到域名控制台对应的记录中用于线上环境的发布最后点击部署线上环境4、上线访问根据你的域名打开即可最后别忘了去活动界面领取阿里云的保温杯哦~
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1