MySQL 学习笔记 2:触发器
图源:ubiq.co
触发器,就像字面意思那样,它会在数据库某些事件发生时执行一些操作。
具体来说,触发器会在特定表的INSERT
、UPDATE
、DELETE
这些类型的 SQL 语句执行时被“触发”,并执行触发器中定义好的(一条或多条) SQL 语句。
在 MySQL 中,触发器存在一些限制,我们只能对同一张表定义最多6个触发器,分别对应6个事件:
BEFORE INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE
AFTER DELETE
此外,无法在触发器中调用存储过程,也无法对临时表和视图使用存储过程。
本文使用的数据库可视化工具和测试数据同上一篇文章,不再赘述。
创建触发器
用 SQLyog 创建触发器会有类似下面这样的模版:
DELIMITER $$
CREATE
TRIGGER ` jpa` . ` afterStudentAdd` BEFORE/ AFTER INSERT / UPDATE / DELETE
ON ` jpa` . ` `
FOR EACH ROW BEGIN
END $$
DELIMITER ;
这里的afterStudentAdd
是我们的触发器名称,名称后需要指明执行触发器的事件,也就是前面说过的6种事件之一,这里我们要按需要修改。ON
后是触发器关联的数据库和表,这里要填写需要触发器的表名。FOR EACH ROW
说明每一条数据触发事件后都会执行触发器内的 SQL。最后,在BEGIN
和END
之间填写触发器的 SQL,如果只有一条 SQL 要执行,BEGIN
和END
可以省略。
原则上同一张表的触发器名称唯一即可,但作为良好习惯,触发器名称应该在数据库中唯一。
INSERT
下面是我编写的触发器:
DELIMITER $$
CREATE
TRIGGER ` jpa` . ` afterStudentAdd` AFTER INSERT
ON ` jpa` . ` student`
FOR EACH ROW BEGIN
declare nowTime datetime default NOW ( ) ;
INSERT INTO ` jpa` . ` student_add_log` ( ` id` , ` average_score` , ` level` , ` name` , ` time` ) VALUES ( NEW. id, NEW. average_score, NEW. level , NEW. name, nowTime) ;
END $$
DELIMITER ;
这个触发器将在INSERT
语句执行后执行,作用是将新添加的数据插入一个日志表student_add_log
,并且记录添加时间。在 INSERT 事件中,我们可以使用临时表NEW
获取新添加的数据。需要注意的是,自增主键只有在数据真正添加后(INSERT
语句执行后)才会产生,所以类似的NEW.id
只有在AFTER INSERT
事件中才能获取到,BEFORE INSERT
中是不存在的。
实际上这里的局部变量nowTime
并不是必须的。
日志表的表结构如下:
CREATE TABLE ` student_add_log` (
` id` bigint NOT NULL ,
` average_score` int NOT NULL ,
` level` enum ( 'FRESH_MAN' , 'JUNIOR' , 'SENIOR' , 'SOPHOMORE' ) NOT NULL ,
` name` varchar ( 45 ) NOT NULL ,
` time` datetime NOT NULL ,
PRIMARY KEY ( ` id` )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci
需要注意的是,**如果触发器关联的事件是BEFORE INSERT
,而且触发器执行失败,那后续的INSERT
语句和AFTER INSERT
关联的触发器就不会再执行。**这点其它的BEFORE XXX
触发器也是同样的。
我们还可以利用BEFORE INSERT
事件,在执行插入语句之前对要插入的数据进行检查,或者将某些数据处理成我们需要的格式:
DELIMITER $$
CREATE
TRIGGER ` jpa` . ` beforeStudentAdd` BEFORE INSERT
ON ` jpa` . ` student`
FOR EACH ROW BEGIN
set NEW. name = INSERT ( NEW. name, 1 , 1 , UCASE ( LEFT ( NEW. name, 1 ) ) ) ;
END $$
DELIMITER ;
现在即使 INSERT SQL 中要插入的name
字段的值首字母小写,也会在执行 SQL 时被触发器替换为首字母大写的形式,这样就确保了数据库中student
表的name
字段首字母都是大写。
关于 MySQL 的相关函数说明,可以阅读这里。
修改 & 删除触发器
用 SQLyog 修改触发器会提供类似下面的模版 SQL:
DELIMITER $$
USE ` jpa` $$
DROP TRIGGER ` afterStudentAdd` $$
CREATE
TRIGGER ` afterStudentAdd` AFTER INSERT ON ` student`
FOR EACH ROW BEGIN
DECLARE nowTime DATETIME DEFAULT NOW ( ) ;
INSERT INTO ` jpa` . ` student_add_log` ( ` id` , ` average_score` , ` level` , ` name` , ` time` ) VALUES ( NEW. id, NEW. average_score, NEW. level , NEW. name, nowTime) ;
END ;
$$
DELIMITER ;
和存储过程类似,触发器只能在删除后重新添加,删除触发器的语句是:
DROP TRIGGER ` afterStudentAdd` ;
如果触发器不存在时避免报错,可以:
DROP TRIGGER IF EXISTS ` afterStudentAdd` ;
UPDATE
下面是我编写的一个在BEFORE UPDATE
事件发生时执行的触发器:
DELIMITER $$
CREATE
TRIGGER ` jpa` . ` beforeStudentUpdate` BEFORE UPDATE
ON ` jpa` . ` student`
FOR EACH ROW BEGIN
INSERT INTO ` jpa` . ` student_update_log` ( ` old_id` , ` old_average_score` , ` old_level` , ` old_name` , ` new_id` , ` new_average_score` , ` new_level` , ` new_name` , ` time` ) VALUES ( OLD. id, OLD. average_score, OLD. level , OLD. name, NEW. id, NEW. average_score, NEW. level , NEW. name, NOW ( ) ) ;
END $$
DELIMITER ;
这个触发器会在student
中的表数据修改时将其记录到日志表。
在UPDATE
事件中,可以用临时表NEW
访问修改后的表数据,可以用临时表OLD
访问被修改前的表数据。
日志表结构如下:
CREATE TABLE ` student_update_log` (
` id` bigint NOT NULL AUTO_INCREMENT ,
` old_id` bigint NOT NULL ,
` old_average_score` int NOT NULL ,
` old_level` enum ( 'FRESH_MAN' , 'JUNIOR' , 'SENIOR' , 'SOPHOMORE' ) NOT NULL ,
` old_name` varchar ( 45 ) NOT NULL ,
` new_id` bigint NOT NULL ,
` new_average_score` int NOT NULL ,
` new_level` enum ( 'FRESH_MAN' , 'JUNIOR' , 'SENIOR' , 'SOPHOMORE' ) NOT NULL ,
` new_name` varchar ( 45 ) NOT NULL ,
` time` datetime NOT NULL ,
PRIMARY KEY ( ` id` )
) ENGINE = InnoDB AUTO_INCREMENT = 3 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci
这里使用BEFORE UPDATE
而不是AFTER UPDATE
的好处在于,可以保证任何情况下都能记录日志信息(即使UPDATE
语句执行失败)。当然这也可能是缺陷,要具体问题具体分析。
与BEFORE INSERT
类似,在 BEFORE UPDATE
事件关联的触发器中,我们也可以修改临时表NEW
中的值,这样就会导致之后执行的INSERT
语句使用我们修改后的值来进行插入:
DELIMITER $$
USE ` jpa` $$
DROP TRIGGER ` beforeStudentUpdate` $$
CREATE
TRIGGER ` beforeStudentUpdate` BEFORE UPDATE ON ` student`
FOR EACH ROW BEGIN
set NEW. name = INSERT ( NEW. name, 1 , 1 , UCASE ( LEFT ( NEW. name, 1 ) ) ) ;
INSERT INTO ` jpa` . ` student_update_log` ( ` old_id` , ` old_average_score` , ` old_level` , ` old_name` , ` new_id` , ` new_average_score` , ` new_level` , ` new_name` , ` time` ) VALUES ( OLD. id, OLD. average_score, OLD. level , OLD. name, NEW. id, NEW. average_score, NEW. level , NEW. name, NOW ( ) ) ;
END ;
$$
DELIMITER ;
这里修改了存储过程beforeStudentUpdate
,通过以下命令改写了临时表NEW
中的name
字段:
set NEW. name = INSERT ( NEW. name, 1 , 1 , UCASE ( LEFT ( NEW. name, 1 ) ) ) ;
这个命令的用途是将name
字段值的首字母替换为大写。
DELETE
最后,用类似的方式添加一个触发器,用于在执行删除 SQL 时将删除的数据保存到日志表:
DELIMITER $$
CREATE
TRIGGER ` jpa` . ` beforeStudentDelete` BEFORE DELETE
ON ` jpa` . ` student`
FOR EACH ROW BEGIN
INSERT INTO ` jpa` . ` student_delete_log` ( ` id` , ` average_score` , ` level` , ` name` , ` time` ) VALUES ( OLD. id, OLD. average_score, OLD. level , OLD. name, NOW ( ) ) ;
END $$
DELIMITER ;
在DELETE
事件时,可以用临时表OLD
获取被删除的旧数据。
日志表结构:
CREATE TABLE ` student_delete_log` (
` id` bigint NOT NULL ,
` average_score` int NOT NULL ,
` level` enum ( 'FRESH_MAN' , 'JUNIOR' , 'SENIOR' , 'SOPHOMORE' ) NOT NULL ,
` name` varchar ( 45 ) NOT NULL ,
` time` datetime NOT NULL ,
PRIMARY KEY ( ` id` )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci
总结
触发器的优点在于:在数据库端是透明的,可以通过设置触发器来控制数据录入或者记录日志信息。这些都不受客户端调用的影响,无论 SQL 是以什么样的方式在数据库上执行,相应的触发器都会起作用。
缺点在于:这些触发器对于代码端是“隐藏的”,只凭借代码是无法察觉到这些触发器的,是容易被忽略的。
说到底,触发器属于数据库编程的部分,对于开发人员有一定要求。
The End,谢谢阅读。
参考资料
《MySQL 必知必会》
MySQL 函数 | 菜鸟教程 (runoob.com)
你可能感兴趣的:(JAVA,mysql,触发器,trigger)
面试运维没工作经验怎么办?_没有运维经验去面试运维岗位
慕烟疏雨
面试 运维 职场和发展 网络安全 web安全 网络 程序员
面试运维没工作经验怎么办大家都知道面试,都是需要工作经验,刚转行或者刚毕业哪里有什么经验呢?面试时候基本都是被拒之门外怎么办:今天我分享下我的经验:面试简历方面:一定要对自己的简历很熟悉,简历写得技能一定能说出一二,因为面试官很多问题都是挑的你的简历你写得问的,比如你写了熟练mysql主从同步原理集群搭建,一般肯定会问你,主从同步原理呀,如果你写了都说不出来,面试官咋样,肯定回家等通知了如果面试官
Groovy语言的漏洞扫描
花韵婷
包罗万象 golang 开发语言 后端
Groovy语言漏洞扫描:深入分析与实践引言Groovy是一种基于Java虚拟机(JVM)的动态编程语言,它结合了Python、Ruby和Smalltalk等语言的特性,提供了简洁的语法和强大的功能。Groovy广泛应用于脚本编写、自动化测试、构建工具(如Gradle)以及Web开发等领域。然而,随着Groovy的广泛应用,其安全性问题也逐渐显现出来。本文将深入探讨Groovy语言中的常见漏洞类型
自动同步多服务器下SQL脚本3.0
a栋栋栋
遇到的问题 sql 自动化 事务失效
由于上一版发现数据库【MySQL】不支持DML事务回滚,该迭代主要是去兼容这种问题。数据表新增一个completed字段,用来表示当前版本下同步成功的个数。数据表CREATETABLE`auto_sql_version`(`id`intNOTNULLAUTO_INCREMENT,`version`varchar(20)CHARACTERSETutf8mb4COLLATEutf8mb4_0900_a
详解PriorityQueue
27xixi
算法 数据结构 java
PriorityQueue是Java集合框架中的一个类,它实现了优先级队列的数据结构。优先级队列是一种特殊的队列,其中的元素按照优先级顺序出队,而不是按照插入顺序(FIFO)。默认情况下,PriorityQueue是一个最小堆,即优先级最小的元素最先出队。1.PriorityQueue的特点基于堆实现:PriorityQueue通常基于二叉堆(最小堆或最大堆)实现。无界队列:PriorityQue
Java集合进阶
27xixi
java 开发语言
在Java中,集合框架(CollectionsFramework)是用于存储和操作一组对象的强大工具。它提供了多种接口和类,用于处理不同类型的集合(如列表、集合、队列、映射等)。1.Java集合框架概述Java集合框架主要包括以下接口和类:核心接口Collection:所有集合类的根接口。List:有序集合,允许重复元素(如ArrayList,LinkedList)。Set:无序集合,不允许重复元
java Stream API中的聚合操作
27xixi
java java18
聚合操作是指对一组数据进行处理,最终生成一个单一的结果。在编程中,聚合操作通常用于对集合(如列表、数组等)中的元素进行统计、计算或汇总。常见的聚合操作包括求和、求平均值、查找最大值/最小值、计数等。在Java的StreamAPI中,聚合操作是通过终端操作(TerminalOperations)来实现的。以下是一些常见的聚合操作及其用法:1.求和(Sum)对集合中的元素进行求和。示例:求整数列表的和
N个utils(处理日期)
庖丁解java
java
解释一下为什么会在java学习教程中放js的代码.1,最直接的肯定是我有时候会写js,而一些经典的逻辑,又不想新开前端文章,索性就放一起.2,java的面向对象太完善了,这也是我写文章的原因,导致写java代码很难学习到面向过程的编程思想,正好,原生js的代码,很大程度上写起来用的思维方式,很雷同面向过程的思考方式.算个补全,对写java代码,理解java代码,大有裨益.(这不是作者胡乱找补,写j
庖丁解java(一篇文章学java)
庖丁解java
java 开发语言
(大家不用收藏这篇文章,因为这篇文章会经常更新,也就是删除后重发)一篇文章学java,这是我滴一个执念...当然,真一篇文章就写完java基础,java架构,java业务实现,java业务扩展,根本不可能.所以,这篇文章,就是一个索引,索什么呢?请看下文...关于决定开始写博文的介绍(一切故事的起点源于这一次反省)中小技术公司的软扩展(微服务扩展是否有必要?)-CSDN博客SpringCloud(
python高并发访问mysql_Python访问MySQL
阿廖林诺
Python访问数据库作为Python开发工程师,选择哪个数据库呢?当然是MySQL。因为MySQL不仅免费,普及率最高,出了错,可以很容易找到解决方法。而且,围绕MySQL有一大堆监控和运维的工具,安装和使用很方便。使用MySQLMySQL是Web世界中使用最广泛的数据库服务器。SQLite的特点是轻量级、可嵌入,但不能承受高并发访问,适合桌面和移动应用。而MySQL是为服务器端设计的数据库,能
Exception in thread “main“ java.lang.NoSuchMethodError:
Awesome Baron
java java vscode
在VScode中运行代码调试力扣程序报错:Exceptioninthread“main”java.lang.NoSuchMethodError:‘intSolution.subarraySum(int[],int)’attest_560.main(test_560.java:9)原因是因为在不同的.java程序中使用了同名的Solution类,导致编译器和运行时选择的类不一致。解决方案:只保留一个
ubuntu12 mysql5.6_Ubuntu 12 安装 MySQL 5.6.26 及 问题汇总
乔德地
ubuntu12 mysql5.6
安装过程:#安装依赖库sudoapt-getinstalllibaio-dev#移动到安装目录sudomkdir/opt/software/mysqlcd/opt/software-backup/lnmp/source2/mysqltar-xzvf./mysql-5.6.26-linux-glibc2.5-x86_64.tar.gzsudomv./mysql-5.6.26-linux-glibc2
mysql安装启动报错_mysql安装/启动报错汇总
weixin_29179583
mysql安装启动报错
2016/9/6补充初始化报错:#/usr/local/mysql/scripts/mysql_install_db--user=mysql--basedir=/usr/local/mysql/--datadir=/data/mysqldb/InstallingMySQLsystemtables...2016-09-0617:29:160[Warning]TIMESTAMPwithimplicit
这些 JavaScript 编码习惯,让你最大程度提高你的项目可维护性!
快乐非自愿
javascript 开发语言 ecmascript
前言:因为JavaScript语言是一门极其松散、极其自由的语言,这意味着我们可以随心所欲的操作它,这是他的优点,但同时也是它的缺点。在编码过程中,我们需要一种良好的规范或者习惯来保持应用程序的一致性和可维护性。而今天我们要说的就是,怎么在日常编码中通过一些的良好的编码习惯,从你编码的基础层面就能使得你的JavaScript代码可以更好维护。什么是可维护性?很多人学习前端,可能是从各种不同的渠道获
MySQL 深度分页如何优化?
司徒阿宝
mysql 数据库
例如select*fromt1orderby10000,10查询10000-10010页数据,mysql会先查询出100010页,再抛弃100000。这个操作会产生大量的无用IO/CPU消耗范围查询1.当ID能保证连续无空缺时,可以使用范围查询。select*fromt1whereid>{seed_id}andid{seed_id}limit10子查询我们先查询出limit第一个参数对应的主键值,
什么是mybatis?
十二.413
mybatis java 数据库
目录一、mybatis框架介绍二、mybatis配置三、mybatis逆向工程三、userMapper.xml配置一、mybatis框架介绍1.1mybatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwareoundation迁移到了googlecode,并且改名为MyBatis。2013年11月迁移到Github。mybatis是一个基于Java的持久
基于oracle linux的 DBI/DBD 标准化安装文档(二)
文档
一、安装DBIDBI(DatabaseInterface)是perl连接数据库的接口。其是perl连接数据库的最优方法,他支持包括Orcale,Sybase,mysql,db2等绝大多数的数据库,下面将简要介绍其安装方法。1.1解压tar-zxvfDBI-1.616_901.tar.gz1.2安装依赖yuminstallperl-ExtUtils-CBuilderperl-ExtUtils-Mak
基于asp.NET的病历管理系统 (源码+net+vue+部署文档+讲解等)
qq_1406299528
计算机毕业设计 asp asp.net vue.js 后端
收藏关注不迷路!!文末获取源码+数据库感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人文章目录前言程序资料获取一、项目技术二、项目内容和功能介绍三、核心代码数据库参考四、效果图五、资料获取前言博主介绍:✨全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,专注于Java/Python/小程序app/深度学
爬取电影标题、评论、评分(21-11-4)
穆桥
Python爬虫 XPath解析 MySQL数据库 电影信息 疾病数据
功能描述:1、爬取网页1中的电影名称、评分、简介到mysql数据库中。2、爬取网页2中的标题、时间、正文、采集时间到mysql数据库中。使用的技术:requests请求、xpath解析、mysqlxpath解析语法//子孙节点/直接子节点.选取当前节点…选取当前节点的父节点@选取属性通过Python的lxml库,利用XPath进行HTML的解析。scrapy封装了lxml也可以导入scrapy任务
什么是 MyBatis?有哪些优点和缺点?
码农落落
java基础 mybatis java 数据库
什么是MyBatis?有哪些优点和缺点?MyBatis是一款基于Java的开源持久化框架,可以帮助开发者轻松地将SQL语句与Java对象映射起来,使业务逻辑与数据持久化分离,提高开发效率。MyBatis的主要优点和缺点如下:优点:1.简单易用:MyBatis对开发者提供了简单易用的API,无需编写繁琐的JDBC代码,降低了学习和使用成本。2.灵活性强:MyBatis比较灵活,支持多种配置方式,可以
MyBatis高级查询:一对多查询详解
蓝天资源分享
mybatis tomcat java
MyBatis高级查询:一对多查询详解MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码和手动设置参数以及获取结果集的工作。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(PlainOldJavaObjects,普通的Java对象)映射成数据库中的记录。本文将深入探讨MyBatis中的
基于Asp.net的汽车租赁管理系统
计算机学姐
Asp精选实战项目源码 asp.net 汽车 后端 mysql sqlserver vue.js c#
作者:计算机学姐开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码精品专栏:Java精选实战项目源码、Python精选实战项目源码、大数据精选实战项目源码系统展示【2025最新】基于Asp.net的汽车租赁管理系统开发
提速 Java性能优化实战:6大技巧解锁丝滑体验
墨瑾轩
一起学学Java【一】 java 性能优化 开发语言
在Java应用程序性能优化的领域,有多种策略可以帮助提升程序运行效率和响应速度。以下是一些实用的技巧,涵盖代码层面、JVM调优、以及设计模式等方面,旨在全面优化应用性能。1.代码层面优化避免不必要的对象创建频繁的对象创建和销毁会占用大量的CPU时间和内存资源。尽量重用对象,特别是在循环中。Java//优化前for(inti=0;i
web开发技术栈个人总结
蓝砖科技HR_金庆硕
前端
编程:Spring是一个非常强大的Java框架,被设计为帮助开发者更快速、容易地创建复杂的应用程序。Spring框架的核心是控制反转(IoC)和依赖注入(DI),它们提供了一种方法,允许开发者定义对象的依赖关系,而不是硬编码这些关系。这增加了可维护性和可测试性Spring框架有很多模块和子项目,这些可以根据应用程序的需求进行选择。下面是一些主要的Spring项目及其用途:SpringFramewo
Java 将 byte[] 转换为 File 对象
我真的不想做程序员
java java 开发语言 后端 数据结构 算法
目录一、将byte[]转换为File对象二、完整示例三、总结在Java开发中,将字节数组(byte[])转换为文件对象(File)是一个常见的需求。这种需求常见于处理文件上传、下载以及与其他系统集成的场景。本文将详细介绍如何实现这一功能,并提供具体代码示例。一、将byte[]转换为File对象在Java中,可以使用java.io包中的File类和FileOutputStream类来将字节数组转换为
正则表达式全解析 + Java常用示例
我真的不想做程序员
算法 java java 后端 开发语言 算法 正则表达式
目录一、正则表达式基础(一)元字符(二)字符集(三)量词二、正则表达式常用示例(一)验证邮箱格式(二)验证电话号码格式(三)提取网页中的链接(四)验证日期格式(五)验证URL格式三、正则表达式在Java中的应用(一)匹配操作(二)替换操作(三)分割操作四、总结一、正则表达式基础正则表达式是一种用于匹配字符串的强大工具。它使用特定的语法来定义匹配模式,可以在文本处理、表单验证、数据提取等场景中发挥重
2025年Python生态全景:从AI霸主到量子计算,揭秘其不可替代的技术魅力
南玖yy
python 人工智能 量子计算
在2025年的技术浪潮中,Python凭借其极简的语法、庞大的生态系统以及跨领域融合能力,依然稳坐编程语言界的“头把交椅”。尽管Java等语言在AI领域发起挑战,但Python通过持续的技术革新和生态扩展,展现出不可撼动的生命力。本文将从技术趋势、行业应用与未来挑战三个维度,解析Python的“常青”密码。一、AI领域的持续主导:生态优势与工具革新Python在AI领域的统治地位仍未动摇。尽管有观
JavaScript 内置对象-Math对象
咖啡の猫
javascript 开发语言
在JavaScript编程中,处理各种数学运算和数值操作是不可避免的任务。幸运的是,JavaScript提供了一个非常有用的内置对象——Math对象,它包含了大量用于执行常见数学任务的方法和属性。本文将详细介绍Math对象的主要特性和使用方法,帮助你更高效地进行数学相关的编程工作。一、什么是Math对象?Math是一个内置的对象,提供了对数学常量和函数的访问。与其它全局对象不同,Math不是一个构
JavaScript基础-变量的作用域
難釋懷
javascript 开发语言
在学习JavaScript的过程中,理解变量的作用域是至关重要的。作用域决定了变量的可见性和生命周期,即在程序的哪些部分可以访问这些变量。正确理解和应用变量作用域不仅能帮助编写更清晰、更高效的代码,还能避免一些常见的编程错误。本文将详细介绍JavaScript中的变量作用域概念、类型及其应用场景。一、什么是作用域?作用域(Scope)是指变量的有效范围,在这个范围内,变量是可以被访问和使用的。Ja
rapidocr-onnxruntime库及在open-webui上传PDF 图像处理 (使用 OCR)应用
原野AI
大模型部署 pdf ocr 深度学习 open-webui
背景rapidocr-onnxruntime是一个跨平台的OCR库,基于ONNXRuntime推理框架。目前已知运行速度最快、支持最广,完全开源免费并支持离线快速部署的多平台多语言OCR。缘起:百度paddle工程化不是太好,为了方便大家在各种端上进行ocr推理,我们将它转换为onnx格式,使用Python/C++/Java/Swift/C#将它移植到各个平台。名称来源:轻快好省并智能。基于深度学
Java多线程与高并发专题——原子类和 volatile、synchronized 有什么异同?
黄雪超
技术基础 java 开发语言 并发编程
原子类和volatile异同首先,通过我们对原子类和的了解,原子类和volatile都能保证多线程环境下的数据可见性。在多线程程序中,每个线程都有自己的工作内存,当多个线程访问共享变量时,可能会出现一个线程修改了共享变量的值,而其他线程不能及时看到最新值的情况。原子类和volatile关键字都能在一定程度上解决这个问题。例如,当一个变量被volatile修饰后,对该变量的写操作会立即刷新到主内存,
TOMCAT在POST方法提交参数丢失问题
357029540
java tomcat jsp
摘自http://my.oschina.net/luckyi/blog/213209
昨天在解决一个BUG时发现一个奇怪的问题,一个AJAX提交数据在之前都是木有问题的,突然提交出错影响其他处理流程。
检查时发现页面处理数据较多,起初以为是提交顺序不正确修改后发现不是由此问题引起。于是删除掉一部分数据进行提交,较少数据能够提交成功。
恢复较多数据后跟踪提交FORM DATA ,发现数
在MyEclipse中增加JSP模板 删除-2008-08-18
ljy325
jsp xml MyEclipse
在D:\Program Files\MyEclipse 6.0\myeclipse\eclipse\plugins\com.genuitec.eclipse.wizards_6.0.1.zmyeclipse601200710\templates\jsp 目录下找到Jsp.vtl,复制一份,重命名为jsp2.vtl,然后把里面的内容修改为自己想要的格式,保存。
然后在 D:\Progr
JavaScript常用验证脚本总结
eksliang
JavaScript javaScript表单验证
转载请出自出处:http://eksliang.iteye.com/blog/2098985
下面这些验证脚本,是我在这几年开发中的总结,今天把他放出来,也算是一种分享吧,现在在我的项目中也在用!包括日期验证、比较,非空验证、身份证验证、数值验证、Email验证、电话验证等等...!
&nb
微软BI(4)
18289753290
微软BI SSIS
1)
Q:查看ssis里面某个控件输出的结果:
A MessageBox.Show(Dts.Variables["v_lastTimestamp"].Value.ToString());
这是我们在包里面定义的变量
2):在关联目的端表的时候如果是一对多的关系,一定要选择唯一的那个键作为关联字段。
3)
Q:ssis里面如果将多个数据源的数据插入目的端一
定时对大数据量的表进行分表对数据备份
酷的飞上天空
大数据量
工作中遇到数据库中一个表的数据量比较大,属于日志表。正常情况下是不会有查询操作的,但如果不进行分表数据太多,执行一条简单sql语句要等好几分钟。。
分表工具:linux的shell + mysql自身提供的管理命令
原理:使用一个和原表数据结构一样的表,替换原表。
linux shell内容如下:
=======================开始 
本质的描述与因材施教
永夜-极光
感想 随笔
不管碰到什么事,我都下意识的想去探索本质,找寻一个最形象的描述方式。
我坚信,世界上对一件事物的描述和解释,肯定有一种最形象,最贴近本质,最容易让人理解
&
很迷茫。。。
随便小屋
随笔
小弟我今年研一,也是从事的咱们现在最流行的专业(计算机)。本科三流学校,为了能有个更好的跳板,进入了考研大军,非常有幸能进入研究生的行业(具体学校就不说了,怕把学校的名誉给损了)。
先说一下自身的条件,本科专业软件工程。主要学习就是软件开发,几乎和计算机没有什么区别。因为学校本身三流,也就是让老师带着学生学点东西,然后让学生毕业就行了。对专业性的东西了解的非常浅。就那学的语言来说
23种设计模式的意图和适用范围
aijuans
设计模式
Factory Method 意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。 适用性 当一个类不知道它所必须创建的对象的类的时候。 当一个类希望由它的子类来指定它所创建的对象的时候。 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
Abstr
Java中的synchronized和volatile
aoyouzi
java volatile synchronized
说到Java的线程同步问题肯定要说到两个关键字synchronized和volatile。说到这两个关键字,又要说道JVM的内存模型。JVM里内存分为main memory和working memory。 Main memory是所有线程共享的,working memory则是线程的工作内存,它保存有部分main memory变量的拷贝,对这些变量的更新直接发生在working memo
js数组的操作和this关键字
百合不是茶
js 数组操作 this关键字
js数组的操作;
一:数组的创建:
1、数组的创建
var array = new Array(); //创建一个数组
var array = new Array([size]); //创建一个数组并指定长度,注意不是上限,是长度
var arrayObj = new Array([element0[, element1[, ...[, elementN]]]
别人的阿里面试感悟
bijian1013
面试分享 工作感悟 阿里面试
原文如下:http://greemranqq.iteye.com/blog/2007170
一直做企业系统,虽然也自己一直学习技术,但是感觉还是有所欠缺,准备花几个月的时间,把互联网的东西,以及一些基础更加的深入透析,结果这次比较意外,有点突然,下面分享一下感受吧!
&nb
淘宝的测试框架Itest
Bill_chen
spring maven 框架 单元测试 JUnit
Itest测试框架是TaoBao测试部门开发的一套单元测试框架,以Junit4为核心,
集合DbUnit、Unitils等主流测试框架,应该算是比较好用的了。
近期项目中用了下,有关itest的具体使用如下:
1.在Maven中引入itest框架:
<dependency>
<groupId>com.taobao.test</groupId&g
【Java多线程二】多路条件解决生产者消费者问题
bit1129
java多线程
package com.tom;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.loc
汉字转拼音pinyin4j
白糖_
pinyin4j
以前在项目中遇到汉字转拼音的情况,于是在网上找到了pinyin4j这个工具包,非常有用,别的不说了,直接下代码:
import java.util.HashSet;
import java.util.Set;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin
org.hibernate.TransactionException: JDBC begin failed解决方案
bozch
ssh 数据库异常 DBCP
org.hibernate.TransactionException: JDBC begin failed: at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:68) at org.hibernate.impl.SessionImp
java-并查集(Disjoint-set)-将多个集合合并成没有交集的集合
bylijinnan
java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.ut
Java PrintWriter打印乱码
chenbowen00
java
一个小程序读写文件,发现PrintWriter输出后文件存在乱码,解决办法主要统一输入输出流编码格式。
读文件:
BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
通常,Reader 所作的每个读取请求都会导致对基础字符或字节流进行相应的读取请求。因
[天气与气候]极端气候环境
comsci
环境
如果空间环境出现异变...外星文明并未出现,而只是用某种气象武器对地球的气候系统进行攻击,并挑唆地球国家间的战争,经过一段时间的准备...最大限度的削弱地球文明的整体力量,然后再进行入侵......
那么地球上的国家应该做什么样的防备工作呢?
&n
oracle order by与union一起使用的用法
daizj
UNION oracle order by
当使用union操作时,排序语句必须放在最后面才正确,如下:
只能在union的最后一个子查询中使用order by,而这个order by是针对整个unioning后的结果集的。So:
如果unoin的几个子查询列名不同,如
Sql代码
select supplier_id, supplier_name
from suppliers
UNI
zeus持久层读写分离单元测试
deng520159
单元测试
本文是zeus读写分离单元测试,距离分库分表,只有一步了.上代码:
1.ZeusMasterSlaveTest.java
package com.dengliang.zeus.webdemo.test;
import java.util.ArrayList;
import java.util.List;
import org.junit.Assert;
import org.j
Yii 截取字符串(UTF-8) 使用组件
dcj3sjt126com
yii
1.将Helper.php放进protected\components文件夹下。
2.调用方法:
Helper::truncate_utf8_string($content,20,false); //不显示省略号 Helper::truncate_utf8_string($content,20); //显示省略号
&n
安装memcache及php扩展
dcj3sjt126com
PHP
安装memcache tar zxvf memcache-2.2.5.tgz cd memcache-2.2.5/ /usr/local/php/bin/phpize (?) ./configure --with-php-confi
JsonObject 处理日期
feifeilinlin521
java json JsonOjbect JsonArray JSONException
写这边文章的初衷就是遇到了json在转换日期格式出现了异常 net.sf.json.JSONException: java.lang.reflect.InvocationTargetException 原因是当你用Map接收数据库返回了java.sql.Date 日期的数据进行json转换出的问题话不多说 直接上代码
&n
Ehcache(06)——监听器
234390216
监听器 listener ehcache
监听器
Ehcache中监听器有两种,监听CacheManager的CacheManagerEventListener和监听Cache的CacheEventListener。在Ehcache中,Listener是通过对应的监听器工厂来生产和发生作用的。下面我们将来介绍一下这两种类型的监听器。
activiti 自带设计器中chrome 34版本不能打开bug的解决
jackyrong
Activiti
在acitivti modeler中,如果是chrome 34,则不能打开该设计器,其他浏览器可以,
经证实为bug,参考
http://forums.activiti.org/content/activiti-modeler-doesnt-work-chrome-v34
修改为,找到
oryx.debug.js
在最头部增加
if (!Document.
微信收货地址共享接口-终极解决
laotu5i0
微信开发
最近要接入微信的收货地址共享接口,总是不成功,折腾了好几天,实在没办法网上搜到的帖子也是骂声一片。我把我碰到并解决问题的过程分享出来,希望能给微信的接口文档起到一个辅助作用,让后面进来的开发者能快速的接入,而不需要像我们一样苦逼的浪费好几天,甚至一周的青春。各种羞辱、谩骂的话就不说了,本人还算文明。
如果你能搜到本贴,说明你已经碰到了各种 ed
关于人才
netkiller.github.com
工作 面试 招聘 netkiller 人才
关于人才
每个月我都会接到许多猎头的电话,有些猎头比较专业,但绝大多数在我看来与猎头二字还是有很大差距的。 与猎头接触多了,自然也了解了他们的工作,包括操作手法,总体上国内的猎头行业还处在初级阶段。
总结就是“盲目推荐,以量取胜”。
目前现状
许多从事人力资源工作的人,根本不懂得怎么找人才。处在人才找不到企业,企业找不到人才的尴尬处境。
企业招聘,通常是需要用人的部门提出招聘条件,由人
搭建 CentOS 6 服务器 - 目录
rensanning
centos
(1) 安装CentOS
ISO(desktop/minimal)、Cloud(AWS/阿里云)、Virtualization(VMWare、VirtualBox)
详细内容
(2) Linux常用命令
cd、ls、rm、chmod......
详细内容
(3) 初始环境设置
用户管理、网络设置、安全设置......
详细内容
(4) 常驻服务Daemon
【求助】mongoDB无法更新主键
toknowme
mongodb
Query query = new Query(); query.addCriteria(new Criteria("_id").is(o.getId())); &n
jquery 页面滚动到底部自动加载插件集合
xp9802
jquery
很多社交网站都使用无限滚动的翻页技术来提高用户体验,当你页面滑到列表底部时候无需点击就自动加载更多的内容。下面为你推荐 10 个 jQuery 的无限滚动的插件:
1. jQuery ScrollPagination
jQuery ScrollPagination plugin 是一个 jQuery 实现的支持无限滚动加载数据的插件。
2. jQuery Screw
S