JPA2|学习笔记

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 快速学习JPA2

开发者学堂课程【高校精品课-上海交通大学 -互联网应用开发技术JPA2】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/76/detail/15755


JPA2


内容介绍:

一、Hibernate的一级

二、Hibernate-布局

三、助手类

四、事件Servelt

五、Hibernate


一、Hibernate的一级

接下来讲解出现的问题Database Schema的图里面,纯粹就是拿手画的,不含建模工具做的,如果用一些建模工具的话,前面带星号表示表的主,idinnotation是在说底下修饰的get方法,@id @GeneratedValue(generator =increment),@GenericGenerator(name=increment,strategy=increment)是定义在get方法前面,会把get去掉,去掉第一字母,因为Java是一种驼峰的理解方式。会把后面每单词首字母大写,把后面每一字母变成小写,然后就知道对id属性进行get,加了id的innotation便会知道Generator表示是在数据库中对应的主键,看到例子之后,如果仔细想就会发现已经说清楚了映射了哪一表,映射了些字段,字段可以和属性名字不一样,但是还缺一在映射库,库实际上是要靠主机名加端口,然后是DB的名字来标识,这些信息不在类里面

图片120.png


二、Hibernate-布局

在整hibernate有一配置文件cfg,配置文件里面在配一种叫做session-factory的东西,针对session-factory来配,session-factory解释一下,之前在JDBC访问的时候说过,在JDBC里要访问数据库,一定要建立接,所有的操作全在接上,hibernate或者是Spring的JPA在托管数据库访问的操作之后,也有一类似于接的东西,实际上仍然是靠数据库接来操作的,只是进行了封装,告诉所有的操作要基于Session的对象进行操作,但是Session就是和数据库,可以理解为和数据库之间进行交互的时候通过Session进行交互,Session的底成会在Cormection上去执行动作,这一点不管,现在要知道数据库交互必须要创建Session,在Session里面去交互,Session不是new出来的,所以不是想创建就能创建的,是靠hibernate里面session-factory session的工厂帮创建,session-factory看起来像是在产生接,然后帮产生session提供数据库方面的操作,所以session-factory需要知道到哪里去连数据库,所以第一要指定数据库的驱动类用哪一,下载驱动类放到lib里就可以,一再强调因为后台里有Mawen,在Mawen里写就会自动去下载,接下来看工程的时候再解释,首先要告用哪驱动类,之前讲过同样是MySQL,可能驱动就会有ABCD等一大堆。原因可能是MySQL自己提供的一个,可能觉得MySQL的驱动的效率提供的专用的效率不高,自己又提供了一个等等,所以都是MySQL数据库,要指定用的Driver类到底是哪一个。第二是要创建连接,接的数据库在哪里,前面jdbc:mysql叫协议名,就像http一样是协议名,jdbc:mysql会被Driver唯一的识别,用不同的Driver,前面jdbc:mysql的写法会有点差异,因此用的Driver的前面必须写jdbc:mysql,Driver就能识别,后面看到是本地3306窗口,就是MySQL的窗口,里面有一种叫ormsample的数据库,就要连到ormsample,在安装MySQL的时候上面会要求创建用户名或密码,要注意如果工程去下载,尽量改掉username和password,改成自己机器上的东西。后面的东西不再详细,刚入门太多会非常复杂,实际上都是根据简单的说是根据hibernate帮托管,所以如何与数据库创建连接的东西,会有一些约定,比如连接的尺寸等等,些细节在目前状态下建议不要动,底下有一方言,SQL有标准,但是每一种数据库实现有一点差异,没有做到完全一致,所以每一种数据库都有一种方言,装着MQL去下载应该都是8有8.0.19所以org.hibernate.dialect.MySQL8Dialect是MySQL8的方言,true</property>是要不要带输出流是tomcat日志控台上去输出真正执行的SQL语句,一般来说true</property>输出简单的看一下,再下面是哪些东西要靠hibernate去托管,才真正要关心的mapping,意思是告知写的类需要托管,所以把类写好在配文件里没有Names the annotated entity class这一条,Mapping就不会去只去读所有mapping标签里的类org.reins.orm.entity.Event,知道org.reins.orm.entity.Event类需要hibernate托管,所以把所有的事情连起来,文件里面连哪数据库,以及在连好数据库之后对哪些类的操作要hibernate进行托管前面一旦连好数据库,就要去映射库里的表,字段也可之前的不一样如果把数据库改一下不是ormsample是别的数据库,只要数据库里也有EVENTS表,结还是一样,只是在另外一库里只改刚才地方,EVENTS类仍然能去处理新的数据库里的表,所以便可以知道为什么在里面只映射到表,因为表跟类相关,库只要切换一,如果两库完全一样,就是位置不一样,或者是库的名字不一样,但是里面的EVENTS表一样,EVENTS映射是不用做任何修改,就是OUR映射的概念上面只是映射好

图片121.png


三、助手类

真正要去操作的时候一般会写助手类,助手类是要帮获取接工即之前整个配置接工,配好之后如何创建接工获取,一般在助手类里面写,调用buildSessionFactory方法,写法所有的基于hibernate做or映射的代码,直接搬HibernateUtil整段代码就可以,不用做任何修改,因为没有和具体的某一些设定去设置绑定,在任何一个应用hibernate的应用里面,直接把助手类搬过去就可以,唯一目的就是要暴露一getSessionFactory的方法出来,方法会返回一SessionFactory,SessionFactory是用代码构建的,那SessionFactory这样做的原因要注意到前面的修饰词static final,意思是说在应用里面SessionFactory static只有一实例,final不能变,意思是SessionFactory对象是一非常重量级的一对象,不但重量级而且有多实例,会对数据库的操作带来负面形象,所以SessionFactory不能自己new一出来,要严格控制,系统里只能有一,所以用种方法在告知通过助手类的静态方法,在SessionFactory就能得到一SessionFactory,不管多少程序,通过静态类,通过助手类的静态方法来获取,获取到的都是唯一的实例,获取的意义是通过创建之前说的session,所有操作都是基于session所以要看如何去操作,上节课再讲Servlet,之后可能不会用到,因为要写SpringMVC后面用的是Spring的controller,

图片122.png

如果用的是Strats后面用的实际上是Strats的Action,但是两东西都是对Servlet的封装所以SpringMVC第一是基本道理要明白怎样去响应,前发过来一请求,第二是在讲数据库的时候controllerAction还没讲,需要先过度一下,先用前放一简单的Servlet来做处理,Servlet上节课讲了,第一监听哪一种类型的请求-EventServlet,就是当前的应用,比如Http-localhost8080-s12-Servlet是这样进行访问的。

URL被监听,监听到以后就会去看是do get 还是do post,然后把do get或者是dopost拿过来去调用,而processReqest注意跟上节课讲的代码是一样的,request里面会是客户端发过来的请求对象,Tomcat包装成Java的对象发给方法,还有空的response,就是要根据request的内容去往response里面写东西,底下第一部是说告诉response将来返回的的内容是纯文本的一些东西,为了考虑如果有中文不会出现乱码,charset=UTF―8的,接下来要往response里面写东西,所以要getWriter然后通过out.printin往里写,写的是Servlet,html lang是标签,head是头底下body是体先从request里面去得到参数,就是有关title的参数,然后要从里面得到date参数,但是前段过来的date是一字符串要转成用SimpleDateFormat就是来格式化对象,把字符串转成Java.Date类型的对象,细节不是特别重要,因为之前其实传过来怎去转细节可能要查询手册,讲很多,可能也讲不全,因为太杂,现在知道有一叫SimpleDateFormat的东西可以把字段串转成date类型。下面要把写到数据库里,可以看到底下是和Hibernate相关的东西,之前讲过所有的东西都要在session里执行,第一步,先通过助手类getSessionFactory方法即之前看到的方法,得到sessionFactory的一引用,拿到之后不是要改变,是要通过引用获取一session,获取一session之后就到session,所有的动作全部是在session里面去执行的

比较良好的习惯是不但要在session里执行还要在事物里执行,先不要深究事物是什么,先记住在session里面操作的时候一定要开一事物,session.beginTransaction是必须写之后在底下做的所有操作都会是在session的管理之下,比如新创建一个Event对象,然后调用t上的setDate把之前的date设进去,调用setTitle把title给设进去,然后在session上面用save方法,把t给存一,注意看里面发生的事情,Event是前面定义的一类,之前讲过类是在在映射数据库里的events创建的对象,setDate和setTitle没有sateid,原因是因为id属性根本不是设置进去的,只能去获取因为是数据库自动生成的,所以在创建Event对象的时候不用去做setid的动作也做不了,

数据库会帮自动生成,当调用session的时候,Hibernate就知道希望把对象写到数据库里面去,注意只是记住了,没说hibernate马上就去做件事,在底下一行session.getTransaction().commit,前面开启了一事物,begin getTransaction,底下说把事物在到以后给提交掉,在session.getTransaction().commit一步,hibernate才真正的把对象写到了数据库里去,id没设写进去了,想知道写进去之后生成的id是什么样的,接着往下看,底下做了一FORM,FORM是输入Event ID,输入Person ID,有一提交,就会把人参加活动记录写到关联表PERSON-EVENT里面去


四、事件Servelt

如何写需要再开启一事物,然后执行查询createQuery,里面东西from Event和SQL很像,但是不是SQL,叫HQL,HQL的语法跟SQL非常接近,但是里面出现的东西全是对象,里面看到的from Event是要从Events的类里面获取所有的对象,这样会被hibernate翻译成for Events表里去找出所有记录,然后全部都装成Event对象,放到一列表里,所以这个时候例子里面就包含了所有的数据库,Evens表里所有的event

接下来,每一次从里面取出一对象,因为event里面放的是object,所以把object转换成event,接下来可以调用getid就得到了数据库生成的ld,getTitle或者是getDate就可以把相应的titledate拿出,这是一个最简单的例子在里面有两东西没讲,第一,Person类是怎样来的第二是已经拿到了list以后为什么要做一次事物的提交?

原因和之前一样,在执行

list events=session.createQuery(“from.event”)list()一步的时候,有可能Events里面是空,只是想做件事hibernate不代表马上就去做,只有把事物提交掉才真正去做,所以如果缺少list events=session.createQuery(“from.event”)list()一句,一步不写,极有可能在下面碰到events的时候会被告知是空,只有执行了一句,才会真正的执行查询动作道理很简单,也很自然,如果是自己设计hibernate也会样设计,告知hibernate要干什么,到数据库里面真正的去做一条相应的动作,如果每当有一用户发起样的请求真的到数据库连接上去做一下,需要n个连接频繁操作,于是便会先将要做的东西记录下来,就像可能要查询,可能还要存储所以需要记录下来当事物提交的时候,一次性的通过一个连接把多条语句发过来去执行,数据库交互次数少一点因为数据交互很费时间,消耗的资源比较多,所以为了保证list不为空,先把事物提交一下,

可以尝试list events=session.createQuery(“from.event”)list()删掉以后很有可能碰到超出一空的即到空指针的异常,这两个内容没有讲。

图片123.png

真正去运行的时候,当只有event的时候工程的例子可以看下图,当把一对象插入进去,要进行操作的时候就是这样的,后面的页面就Event ID和person ID,PersonID写的不对应该写一人,比如说一号人,一点的时候会去进行一些操作。看一下代码,可以看到events的,类和之前唯一的差异就是在里面做了一Person关联,等一会再讲,先看刚才讲过的部分,就是有三属性,要去映射Events表,然后有一无参数的构造器,里面可以不写任何东西,只给hibernate去使用的,然后有getID和setID,get title和set title,所有的方法在get前面要加innocation,因为title在数据库里就叫title所以没有做任何描述,Date在数据库里叫Events_Date所以做了一下Column描述,并且因为是Java的hit对象,所以用Tempora来表明一下是一时间戳类型的,年月日加小时分钟,是ID要用数据库的资深重建结束

然后是hibernate的助手类,可以看到是Hibernate的比较新的写法,上面注释掉可以用,但是方法会说过时了,建议用底下的方法来做,其实助手类在所有涉及到Hibernate的应用都可以用,没有什么其的关于细节绑定,所以都可以使用

Servlet刚刚看到了监听然后底下两没有考,因为在之前的课也看到了,get方法或者是post方法过来的请求都是写的processRequest,在里面就是刚刚看到的,会从参数里面去获取title和date,之后获取一session,开启事物,创建一event,不需要设置ID只需要设置Date和Title,之后存进去,存进去以后,存的时候告诉getTransaction想存,底下把事物提交就存进去了,底下是响应里面给画一页面,让用户输入ID:personID和EventID,想把人和事件关联起来,再往下就是查询出所有的Event的对象,然后输出所有的内容结束这里需要注意,其实在idear里面也可以操作数据库,就是在View里看到的Tool windows,Tool windows里然后选Database里,选了之后,就在一边Database就给打开,打开以后可以去加Data Source选My SQL,在里面用户名,密码,数据库名字

图片124.png

写好之后产生底下东西,在底下可以看到,之前在底下配的数据ORMsample的数据源,打开以后就会看到里面有表双击表格就能打开表格的内容,甚至可以在里进行操作,之前做测试在里做了很多东西,所以在里看起来有很多,打开表格的内容,在里操作也可以,但是不是特别好操作反复试过,所以还是要装一客户端

图片125.png

代码运行起来是之前看到的,因为已经把工程跑起来,跑起来可以看到操作几下,可以看到里面输出的东西很多,其中里面有很多东西,EventServiet就是在在前的配置里面,Hibernate配置里面,show_SQL的意思可以在控制台看到执行的SQL,其实是插入了一Event,可以看到处理逻辑但是字可能比较小,执行一下工程也能看到,操作的逻辑到数据库里面去查Events,因为由数据库生成组的,查一下当前最大的ID是谁,然后在基础上插入一新的记录其中ID就是查询出来的ID,可以看到刚才的表有一问题从一开始一直往下增,要把里面有一些东西删掉,比如说把所有的东西全部删掉,再去增,也不会从1重新开始,会从65开始,所以可能带来弊端

再看页面,页面有两表,输入Title和Date提交一下,用的是POST方法,POST方法里面有一个是Title是Date再点SUBMIT提交的时候,就会对着位置EvenServlet的位置,用POST方法发过去请求,其中会把title和date的两的内容当参数传过去

所以需要顺一下逻辑,在启动以后,会把HTML的页面打开,打开以后,里面让填入title和date两值,两值在点击SUBMIT之后会对着EventServlet位置发一个出去之后是POST,于是Servlet专门在里监听EventServlet的请求,过来之后,因为是POST方法,所以doPost就激活,会被调用,调用了之后把titledate的值封装在request里面的erride,把封装好的request给了doPost,之后给了request一空的response,

图片126.png之后doPost调用processRequest,所以就到了自己写的方法里拿到了封装好的request和response,然后在request去获取参数,可以看到刚才输入的titledate,所以前后端就形成了一次交互,剩下的解释就不再说了

图片127.png

自从跑起来会出现一个页面,所以要有一什么样的Event,比如说是Concert,在哪一天比如五四青年节,比如有一音乐会在五四青年节那一天,点Save event,点Save event之后看输出,在最底下就会产生一输出会插入进去产生一输出,继续下翻看到数据库里只到64,65刚插进去,65是自动产生的,刚刚在代码中看到的是64,产生的是6565,是在里要求插入的一记录,其实65不是自己赋的,是真正被插入到数据库里面会有,在便利的时候,在拿出的Event的时候可以通过getID去获取到被自动插入主键的记录的主键值。

进入到页面之后是到目前为止讲过的东西,其实讲来讲去讲,只讲了一个数据源的操作就是一表的操作

图片128.png


五、Hibernate

接下来要稍微复杂一点,学习关系是怎么存储的,在之前先来看一看Hibernate,刚才是有一直观感受,现在再来看看Hibernate,Hibernate里面第一可以看到有一SessionFactor,对的是接口编程的,所以是对着SessionFactor编程,实际上有一实现类,上节课讲的接口实现分离道理一样,对着接口编程是需要用到的,之后通过SessionFactory获取到了一session,以后所有的事情都在session上做,但是是在session上通过Transaction来做,所以Hibernate就是在Java数据库连接协议上封装,暴露一些JPA的接口,也有一些自定义的扩展功能的接口,作为hibernate的用户,可以只调标准的JPA的接口,也就是只用一些基本功能,有一些Hibernate扩展出来的新功能也想用就可以调用的,但是一但调用overview的代码,系统的可移植性可能就会差一点,比如说想把代码从Hibernate移植到Spring的JPA上,现实中这种需求比较少,推荐想用hibernate的高级功能提高性能时是可以用的。

图片129.png

之前谈到的都集中在EVENTS上,events和person做双向的关联,很简单在之前的类上面新加一个东西,其他相同的代码没有贴全,加了一个属性private Set<person>participants=newHashSet,注意前提是没有PERSON_EVENT类,只有EVENTS和PERSON,但是要将关联的信息包含在里面,关联的信息是一个人可以参加多个活动,一个活动有多个人参加需要维护多对多的关系。

所以一个event对应的有一组人参加,所以设置新的变量成员是集合类型的,里面放了一组person,因为一组人参加了,对这个属性也要有get和set方法,同样要在get方法前作注解,注解相当复杂,首先是多对多的ManyToMany,第二是否要做集连的操作即如果将一个event存到数据库里关联的一person需要一起存进行PERSIST,PERSIST实际上除了涉及一起存还涉及一起删,将事件删掉,参加事件的人需要一起删,还有一个MERGE下节课去讲。

在加载一个事件的时候事件对象和人的对象在Tomcat里,另一边是数据库,拉回一个事件对象即将事件对象的记录取回,需要将关联的一组人同时取回。重要的是表明event和person之间是什么关系。接下来需要知道哪一EVENT和哪一PERSON关联所以第一看关联表的名字叫什么,关联表的名字叫PERSON_EVENT所以要讲清楚内容就是PERSON_EVENTS。即事件要跟哪些人关联,要去查PERSON表才能知道

第二,表里对应的是哪一列,叫做joinColumns,对应的是event id的一列,对应的是自己的id一列,也就是EVENTS里面的id对应的就是PERSON_EVENT表如果做关联,换句话就是EVENT_PERSON里面的外键引用EVENTS的ID的外键是哪一列,需要说清楚EVENTS_ID一列是在引用自己的ID

第三,反过来是inversejoinCoulumns是Person id一列,在引用Person的id听起来有点绕口,但是实际上就是想告EVENTS_ID引用的是自己的,PERSON_ID引用的是对方的,因为表本身就是三属性,一个是表的名字,一是关联EVENTS的外键的是谁,一个是是关联的PERSON的外键是谁,通过JoinTable讲清楚,讲清楚之后,Hibernate知道EVENTS里面的Person是如何来的,去查表拿着ID到表里面到EVENT ID一列把所有相对应的id全都取出来,取出一组跟events相同的id的记录拿出来之后把里面所有对应的Person ID拿出来,到Person里面去找id等于Person ID的Person,即一边是EVENTS,一边是PERSON_EVENTS,另一边是PERSON,PERSON是1表里面有PERSON_ID,有EVENTS_ID,一事件有一人参加,有二人参加,有三人参加,有四人参加,二事件有一人参加,依次类推,从表里面去找event一列,找出记录之后,就会得到后面的PERSON_ID,拿着PERSON的表里找,于是就把1.2.3.4四人找到,找到之后组装成person对象,扔进Persor集合就得到了一集合

图片130.png

Person.java中,有前面的铺垫就比较快,Person映射的PERSONS表,id同样是自增的,有age,firstname,lastname,有一evens,底下先不管,先看上面,也有一events集合类型,比如说List类型里面放着一组Event,组Event哪来的,因为前面在Event已经做过一详细的设置,已经知道关联表谁,id表示谁,所以Person.Java就没有麻烦,直接用Many To Many讲好要去映射谁,event.java里拿到之后到Person里面去找的时候是怎样找的,participants应的是一组Person,也就是未来产生多对多关系的一个类,类里面有一participants的属性,属性是在映射当前Person,所以谁的Eventsparticipants里面包含,就把Events拿过来放在集合里

图片131.png

听起来也有点绕,就是现在有一组Events,participants变量里面就会有Person1,Person的1会说去找一找所有的Events,谁的participant里面有,就把EVENTS取出来,放到List里面去,于是就能拿到一组EVENTS,EVENTS里面就包含了,底下email先跳过,这时就建立了PERSONS之间的两者的关联

图片132.png

接下来看,又写了一PersonServlet对应的是刚才看到的Servlet的代码,,有一INPUT,写EVENTS的ID写PERSON的ID会发出PersonServlet的一请求,对应要处理请求的就不讲了

获取输入的Events和Person的参数,传过来的时候都是字符串,所以需要转成整数类型,因为ID是整数类型,是long类型,就有了EVENTS_ID和PERSON_ID,然后紧跟着底下,前面一样,然后底下是说用get方法去到Person和Event两类里面,取出对应的人和对应的事件,然后底下的逻辑是比较重要的,稍微有点绕,从找到的人去获取里面的Events,于是就得到了要参加的一组事件,然后在集合里添加一当前输入事件,输入一人和一事件,表示人要加入事件或者是参加活动,于是把人参加的所有活动的集合加入一元素,就是找到的事件,反过来也是一样,要在事件里面,所有的参加人的集合里面添加一元素,底下是为了验证Email的写法,两东西都被添加了,所以状态发生了变化提交就行,于是状态写回后面又开了一个saction将事件里面所有参加的人取出来便利一下,输出Firstnamelastname进行了这样的逻辑

图片133.png

看一下代码,先看EVENT跳过的,回过头再看多了一participant,关键是要写关联表PERSON_EVENT,上课讲过的就不再去讲,接下来看Person Servlet,要从前段获取PersonS和EVENTS的内容,转换以后写进去,get或者是load的方法加载,如果用get就是fatch必须是eager,细节下节课

图片134.png

取出了人和事物,真正编程的时候做了保守制编程,就是要判断一下是不是空,不是空才做相应的动作,如果是空要新设一下速度是什么,设好速度之后底下就是看到的,把人加到了事件里,把事件加到了人里,然后底下再编立,出来的效果就是刚才不是执行到比如说有一人要参加当台65事件,然后next一下,应该是上面是事件下面是人,Event ID是65,person ID是3,3人参加6565事件有person3加入到里面去,这便是两张表联合的方式,要注意的是,在整程序里只有PERSOEVENT,PERSON_EVENT表是没有的,在面向对象的世界里是不存在的,如果能设置出样一类,严格按照表的结构,一张表一类设置,理论上也不会出错,代码仍然能跑,但是从面向对象的角度来看是一件非常怪异的事情,因为PERSON_EVENT不是一实体,真正的实体只有PERSON和EVENT两种,二者可以互相持有对方的一集合,在进行OR映射的时候,之前提到的关联关系没有映射成表而是映射成类,关联关系不是用类来映射的,关联表在类的世界没有,在数据库里是没有办法直接表示N对N的,多对多的,必须拆成两一对多,多出一关联表,但是在类的世界里面可以,所以一类映射成一张表,是大的原则,但实际上在映射的过程当中,不是死板,fash没有说,到下节课讲,简单说一下,Person关联了一组Event,再把Person拿回到Tomcat一端来的时候,Person关联的组EventS要不要马上拿过来,马上从数据库里拿过来,如果不拿,是一种方式好处是加载Person并不是要看Event是要看Age或者是name,一次性把关联的Event都拿过来,传输量太大,太浪费,拿的好处是如果真的想去看Event就不用再去拿,所以拿不拿对用户的感觉没有任何差异,Event不拿就是空的,但是在Person上调用getEvent的时候,差异是一开始只把不为空的东西拿过来,Event先不拿,因为有一定的概率大量操作根本就不适用于Event,一种是在拿的时候把关联疑问词一起拿进来,下次真的是大量操作类再访问Event,就不用到数据库里面去拿一次了,差异就在第一种方式就叫Lazy第二种当时就叫Eager

代码里写的一是get一是load,两都可以拿出去,但是一支持Lazy,一不支持Lazy,但实际上现在的情况是基本上用一就可以,用Lazy的情况比较少,但是用Eager会造成如果Person是一,Event也是一,加载的人就会把关联的人拿出来,形成一循环,要想办法打破循环。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
Java 应用服务中间件 数据库
RocketBot 的使用 | 学习笔记
快速学习 RocketBot 的使用
363 0
RocketBot 的使用 | 学习笔记
|
存储 缓存 算法
缓冲区管理器 | 学习笔记
快速学习缓冲区管理器
192 0
缓冲区管理器 | 学习笔记
|
NoSQL MongoDB 开发者
故障测试_1|学习笔记
快速学习故障测试_1
97 0
故障测试_1|学习笔记
|
机器学习/深度学习 算法 Serverless
总结与回顾| 学习笔记
快速学习总结与回顾。
56 0
|
算法 开发者 索引
FuzzyQuery|学习笔记
快速学习 FuzzyQuery。
186 0
|
云安全 安全 网络安全
总结 | 学习笔记
快速学习总结
79 0
|
人工智能 开发者
特征空间与应用 | 学习笔记
快速学习特征空间与应用
105 0
特征空间与应用 | 学习笔记
|
C++ 开发者 Python
练习1|学习笔记
快速学习练习1
84 0
练习1|学习笔记
|
存储 Java 开发者
BinaryTree|学习笔记
快速学习BinaryTree
BinaryTree|学习笔记
|
Python
雨痕大神的《学习笔记系列》
雨痕大神的《学习笔记》可以在他的GitHub(https://github.com/qyuhen/book)下载,7000+的Star,足以证明认可度。 笔记系列陆陆续续在出版,已出版的有: 《Python 3学习笔记(上卷)》https://www.
3612 0