SET命令用来将新值赋给被更新的列。
更新多个列时,只需要使用单个SET命令,每个‘列=值’对之间用逗号分隔
删除某个列的值,可设置它为NULL。
可采用两种方式使用DELETE:(1)删除表中特定的行;(2)删除表中所有行
DELETE删除整行而不是删除列。
如果想从表中删除所有行,不要使用DELETE,可使用TRUNCATE TABLE语句。
为了利用CREATE TABLE 创建表,必须给出下列信息:
(1)新表的名字,关键字CREATE TABLE之后给出
(2)表列的名字和定义,用逗号分隔
每列的定义以列名(它在表中是唯一的)开始,后跟列的数据类型。
表的主键可以在创建表时用PRIMARY KEY关键字指定。
主键只能使用不允许NULL值的列。
AUTO_INCREMENT告诉MySQL,本列每增加一行时自动增量,每个表只允许有一个这样的列,而且它必须被索引。
默认值用列定义中的DEFAULT关键字指定。
ENGINE指定数据库引擎
使用ALTER TABLE更改表结构,必须给出下面的信息:
(1)在ALTER TABLE之后给出要更改的表名(该表必须存在)
(2)所做更改的列表
执行这条语句将永久删除该表。
视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询
productcustomers是整个查询包装成的虚拟表,是一个视图,它不包含表中应该有的任何列或数据,它包含的是一个SQL查询。
(1)视图必须唯一命名
(2)对于可以创建的视图数目没有限制
(3)为了创建视图,必须具有足够的访问权限
(4)视图可以嵌套
(5)ORDER BY能使用
(6)视图不能索引,也不能有关联的触发器或默认值
(7)视图可以和表一起使用
(1)视图用CREATE VIEW语句来创建
创建一个productcustomers的视图,联结3个表。
视图通常是可更新的,更新一个视图将更新其基表。
如果视图定义中以下操作,则不能进行视图的更新:
(2)联结
(3)子查询
(4)并(UNION)
(5)函数聚集(MAX()、Count()等)
(6)DISTINCT(去重)
(7)导出(计算)列
存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。
MySQL称存储过程的执行为调用。CALL接受存储过程的名字以及需要传递给它的任意参数。
@pricehigh,
@priceaverage);
BEGIN
如果存储过程接受参数,它们将在()中列举出来。
BEGIN和END语句用来限定存储过程体。
过程体本身是一个简单的SELECT语句。
DELIMITER//告诉命令行使用程序使用//作为新的语句结束分隔符,恢复可使用DELIMITER ; 。
BEGIN
END//
存储过程在创建之后,被保存在服务器上以供使用,直至被删除。
删除存储过程,可使用语句:
注意: CALL productpricing()时需要有()符号, 删除时后面没有(),只给出存储过程名。
BEGIN
INTO pl
INTO ph
INTO pa
这个存储过程接受3个参数,每个参数必须具有指定的类型,DECIMAL(8,2)十进制。
关键字OUT指出相应的参数用来从存储过程中传出一个值(返回给调用者)。
MySQL支持IN(传递给存储过程)、OUT(从存储过程传出)和 INOUT(对存储过程传入和传出)类型的参数。
为此调用这个存储过程,必须指定3个变量名。
@pricehigh,
@priceaverage);
@后面的名字,它们是存储过程将保存结果的3个变量的名字
所有MySQL变量都必须以@开始
游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序
可以根据需要滚动或浏览其中的数据。
BEGIN
FOR
DECLARE命名游标,并定义相应的SELECT语句,根据需要带WHERE和其他字句。
在一个游标被打开后,可以使用FETCH语句分别访问它的每一行,FETCH指定检索什么数据(所需的列),检索出来的数据存储在什么地方。它还向前移动游标中
的内部行指针,使下一条FETCH语句检索下一行(不重复读取同一行)
触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句):DELETE、INSERT、UPDATE
创建触发器时,需要给出4条信息:
(1)唯一的触发器名
(2)触发器关联的表
(3)触发器应该响应的活动(DELETE、INSERT、UPDATE)
(4)触发器何时执行(处理之前或之后)
BEFORE和AFTER决定之前或之后,FOR EACH ROW 定义对每个插入行执行。
注意:(1)只有表才支持触发器,视图不支持(临时表也不支持)
(2)触发器按每个表每个事件每次地定义,每个表每个事件每次只允许一个触发器,每个表只支持6次(DELETE、INSERT、UPDATE之前之后)。
触发器不能更新或覆盖,为了修改一个触发器,必须先删除它,然后再重新创建。
INSERT触发器在INSERT语句执行之前或之后执行
(1)在INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行
(2)在BEFORE INSERT触发器中,NEW中的值也可以被更新(允许更改被插入的值)
(3)对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0,在INSERT执行之后包含新的自动生成值。
DELETE触发器在DELETE语句执行之前或之后执行
(1)在DELETE触发器代码内,可以引用一个名为OLD的虚拟表,访问被删除的行
(2)OLD中的值全部都是只读的,不能更新
BEGIN
UPDATE触发器在UPDATE语句执行之前或之后执行
(1)在UPDATE触发器代码中,可以引用一个名为OLD的虚拟表访问以前(UPDATE语句前)的值,引用一个名为NEW的虚拟表访问新更新的值
(2)在BEFORE UPDATE触发器中,NEW中的值可能也被更新(允许更改将要用于UPDATE语句中的值)
(3)OLD中的值全都是只读的,不能更新
并非所有的引擎都支持事物处理。
事物处理是一种机制,用来管理必须成批执行的MySQL操作,以保证数据库不包含不完整的操作结果。利用事物处理,可以保证一组操作不会中途停止,它们或
者作为整体执行,或者完全不执行(除非明确指示)。如果没有错误发生,整组语句提交给(写道)数据库表。如果发生错误,则进行回退(撤销)以恢复数据库到
某个已知且安全的状态。
回退(rollback)指撤销指定SQL语句的过程
提交(commit)指将未存储的SQL语句结果写入数据库表
保留点(savepoint)指事物处理中设置的临时占位符(place-holder),你可以对它发布回退(与回退整个事物处理不同)
管理事物处理的关键在于将SQL语句组分解为逻辑快,并明确规定数据何时应该回退,何时不应该回退
MySQL的ROLLBACK命令用来回退(撤销)语句
ROLLBACK; --回退开始的所有事物
事物处理模块中,提交不会隐含地进行。为了明确的提交,使用COMMIT语句。
提示:最后的COMMIT语句仅在不出错时写出更改。
为了支持回退部分事物处理,必须能在事物处理快中合适的位置放置占位符,当需要回退时,可以回退到某个占位符
创建保留点
SAVEPOINT delete1; --每个保留点都取标识它的唯一名字
为了回退到保留点
指示MySQL不自动提交更改,需要使用以下语句:
MySQL用户账号和信息存储在名为mysql的MySQL数据库中。
获取所有用户账号列表时
mysql数据库有一个名为user的表,它包含所有用户账号。user表有一个名为user的列,它存储用户登陆名。
创建一个新用户账号,使用CREATE USER语句
为重新命名一个用户账号,使用RENAME USER语句
删除一个用户账号(以及相关的权限),使用DROP USER语句
新创建的用户账号没有访问权限,它们能登陆mysql,但不能看到数据,不能执行任何操作数据库操作
为看到赋予用户账号的权限,使用SHOW GRANTS FOR
为设置权限,使用GRANT语句,至少给出以下信息:
(1)要授予的权限
(2)被授予访问权限的数据库或表
(3)用户名
GRANT的用法:
SHOW GRANTS反映这个更改:
GRANT的反操作为REVOKE,用它来撤销特定的权限。
GRANT和REVOKE可在几个层次上控制访问权限:
(2)整个数据库,使用ON database.*
(4)特定的列
(5)特定的存储过程
授予权限时,可通过列出个权限并用逗号分隔,将多条GRANT语句串在一起
更改用户口令,可使用SET PASSWORD语句
1、硬件C/S架构(打印机)
互联网处处是C/S架构
比如百度网站是服务端,浏览器是客户端(B/S架构也是C/S架构的一种)
腾讯作为服务端提供微信服务,需要下载微信安装包安装使用才可以去聊微信。
用socket就是为了完成C/S架构的开发
server端(必须遵守的):
1、位置必须固定死,绑定一个固定的地址
2、对外一直提供服务,稳定运行
3、支持并发(让多个客户端感觉是同时被服务着)
须知一个完整的计算机系统是由硬件、操作系统、应用软件三者组成,具备了这三个条件,一台计算机系统就可以自己跟自己玩了(打个单机游戏,玩个扫雷)
如果你要跟别人一起玩,那你就需要上网了,什么是互联网?
互联网的核心就是由一堆协议组成,协议就是标准,比如全世界人通信的标准是英语
如果把计算机比作人,互联网协议就是计算机界的英语。所有的计算机都学会了互联网协议,那所有的计算机都就可以按照统一的标准去收发信息从而完成通信了。
人们按照分工不同把互联网协议从逻辑上划分了层级
互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层
物理层功能:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0
数据链路层由来:单纯的电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思
数据链路层的功能:定义了电信号的分组方式
blogs.com/linhaifeng/articles/5937962.html,tcp在数据传输时,发送端先把数据发送到自己的缓存中,然后协议控制将缓存中的数据发往对端,对端返回一个ack=1,发送端则清理缓存中的数据,对端返回ack=0,则重新发送数据,所以tcp是可靠的
而udp发送数据,对端是不会返回确认信息的,因此不可靠
recv里指定的1024意思是从缓存里一次拿出1024个字节的数据
send的字节流是先放入己端缓存,然后由协议控制将缓存内容发往对端,如果待发送的字节流大小大于缓存剩余空间,那么数据丢失,用sendall就会循环调用send,数据不会丢失
为字节流加上自定义固定长度报头,报头中包含字节流长度,然后一次send到对端,对端在接收时,先从缓存中取出定长的报头,然后再取真实数据
该模块可以把一个类型,如数字,转成固定长度的bytes
我们可以把报头做成字典,字典里包含将要发送的真实数据的详细信息,然后json序列化,然后用struck将序列化后的数据长度打包成4个字节(4个自己足够用了)
再编码报头内容然后发送
先手报头长度,用struct取出来
根据取出的长度收取报头内容,然后解码,反序列化
从反序列化的结果中取出待取数据的详细信息,然后去取真实的数据内容
基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环
socketserver模块中分两大类:server类(解决链接问题)和request类(解决通信问题)
功能实现
作业:开发一个支持多用户在线的FTP程序
要求:
用户加密认证
允许同时多用户登录
每个用户有自己的家目录 ,且只能访问自己的家目录
对用户进行磁盘配额,每个用户的可用空间不同
允许用户在ftp server上随意切换目录
允许用户查看当前目录下文件
允许上传和下载文件,保证文件一致性
文件传输过程中显示进度条
附加功能:支持文件的断点续传
作业地址:
内容来源于网络如有侵权请私信删除
使用代码进行演示,帮助理解:
对不同状态下的实例A,persist会产生以下操作:
对不同状态下的实例A,merge会产生一下操作:
对 不同状态下的实例mit();
* 1、如果保存的数据,希望使用已有的,就需要从数据库中查出来!(持久状态)、否则报错:游离状态不能持久化! * 2、如果一个业务方法有多个持久化操作,记得加上@Transactional,否则不能共用一个session * 3、在单元测试中,如果用到了@Transactional,如果有增删改操作就需要加 @Commit * 4、单元测试会认为你的事务方法@Transactional,只是进行测试,不会提交事务,需要单独加上@Commit * 多对多其实并不适合删除,应为经常出现数据可能出现和当前这一端关联还在另一端进行关联! * 要进行删除,要保证没有额外的另一端数据关联多对多进行删除可能出现的问题!
这个时候,在 Jpa.save()方法被调用的时候,时间字段会自动设置并插入数据库,但是CreatedBy和LastModifiedBy并没有赋值,因为需要实现AuditorAware接口来返回你需要插入的值。
如果要进行使用的话,需要导入aop的依赖,虽然有aop但是报错没有aspects,添加如下:
经过测试如果你的实体类上面的多个字段使用了@CreatedBy这样的注解,只会有一个生效,也就是说在一次请求中,只会被调用一次!
没有找到bean,解决思路:
spring.jpa.hibernet.ddl-auto
设置成none,否则有啥问题,我也没尝试过。这样配置可以避免两种方式一起使用。
update
这个属性配置。