晚来天欲雪,能饮一杯无

个人记录


  • 首页

  • 分类

  • 归档

  • 标签

  • 搜索

mysql 触发器

发表于 2018-08-29 | 分类于 数据库

在MySQL中,触发器可以在你执行INSERT、UPDATE或DELETE的时候,执行一些特定的操作。在创建触发器时,可以指定是在执行SQL语句之前或是之后执行这些操作。通过触发器,你可以实现一些业务逻辑或一些数据限制,在简化应用程序逻辑,优化系统性能时非常有用。但在使用MySQL触发器也有一些注意事项,否则会导致触发器不能工作或不按指定的方式工作。

1. MySQL触发器注意事项

MySQL触发器使用非常简单,当然其功能也比较有限。当你在项目中大量使用触发器,那么你应该注意以下几点,以避免触发器不按预期效果执行:

MySQL触发器能基于行触发,MySQL触发器始终时基于表中的一条记录触发,而不是一组SQL语句。因此,如果需要变动整个数据集而数据集数据量又较大时,触发器效果会非常低。
每一个表的一个事件只能定义一个触发器,例如:不能在AFTER INSERT上定义一个以上的触发器。

2. MySQL触发器可能导致的问题

由于MySQL触发器基于行触发的特性,因此对于批量操作并不适合使用触发器,如:汇总表、缓存表等。触发器使用不当,可能会导致以下问题:

一个MySQL触发器可能会关联到另外一张表或几张表的操作。因此,会导致数据库服务器负荷也会相应的增加一倍或几倍,如果出现因为触发器问题导致的性能问题,会很难定位问题位置和原因。
在基于锁的操作中,触发器可能会导致锁等待或死锁。触发器执行失败,原来执行的SQL语名也会执行失败。而因为触发器导致的失败结果和失败原因,往往很难排查。

3. MySQL触发器的好处

对MySQL触发器有足够的认识和了解后,MySQL触发器会给我们带来极大的便利。当实现一些系统约束时,或在实现系统维护及针对操作数据的更新时,使用触发器都非常方便。在之胶我们介绍了MySQL触发器不适合做的一些工作,但MySQL触发器在以下一些应用场景中,会非常实用:

  • 基于行数据变更的日志记录。如:在用户订单系统中,我们可以基于用户订单数据状态的改变,使用触发器构建用户订单日志表数据。
  • 基于行数据变更的关系数据的更新。如:用户订单改变至付款或相关状态时,我们可以基于用户订单数据状态的改变,使用触发器改变用户会付款或相应状态信息。
  • 基于行数据变更的数据汇总。如:用户订单成交或失败,我们可以基于用户订单数据状态的改变,使用触发器构建用户总成交量或失败量汇总数据。

以上仅列举了一些常用场景,合理的利用MySQL触发器会在数据库工作效率和开发效率上有很大的提高。

由于MySQL触发器的种种问题,要求我们在创建触发器就应该充分考虑。避免使用不合适的触发器,并能对所有触发器有足够的了解,以便问题的定位和排查。

特性

  • 有begin end体,begin end;之间的语句可以写的简单或者复杂
  • 什么条件会触发:I、D、U
  • 什么时候触发:在增删改前或者后
  • 触发频率:针对每一行执行
  • 触发器定义在表上,附着在表上

注意

  • 尽量少使用触发器,不建议使用。
  • 假设触发器触发每次执行1s,insert table 500条数据,那么就需要触发500次触发器,光是触发器执行的时间就花费了500s,而insert 500条数据一共是1s,那么这个insert的效率就非常低了。因此我们特别需要注意的一点是触发器的begin end;之间的语句的执行效率一定要高,资源消耗要小。
  • 触发器尽量少的使用,因为不管如何,它还是很消耗资源,如果使用的话要谨慎的使用,确定它是非常高效的:触发器是针对每一行的;对增删改非常频繁的表上切记不要使用触发器,因为它会非常消耗资源。

    语法

1、创建只有一个执行语句的触发器

1
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROW 执行语句;

2、创建有多个执行语句的触发器

1
2
3
4
5
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
执行语句列表
END;

例

1
2
3
4
5
6
CREATE TRIGGER trig2 BEFORE DELETE
ON work FOR EACH ROW
BEGIN
  INSERT INTO time VALUES(NOW());
   INSERT INTO time VALUES(NOW());
END

3、NEW与OLD详解

MySQL 中定义了 NEW 和 OLD,用来表示触发器的所在表中,触发了触发器的那一行数据,来引用触发器中发生变化的记录内容,具体地:

  • 在INSERT型触发器中,NEW用来表示将要(BEFORE)或已经(AFTER)插入的新数据;

  • 在UPDATE型触发器中,OLD用来表示将要或已经被修改的原数据,NEW用来表示将要或已经修改为的新数据;

  • 在DELETE型触发器中,OLD用来表示将要或已经被删除的原数据;

另外,OLD是只读的,而NEW则可以在触发器中使用 SET 赋值,这样不会再次触发触发器,造成循环调用(如每插入一个学生前,都在其学号前加“2013”)。

4、查看触发器

1
2
3
4
SHOW TRIGGERS;
显示所有触发器的基本信息;无法查询指定的触发器。
SELECT * FROM information_schema.triggers;
显示所有触发器的详细信息;同时,该方法可以查询制定触发器的详细信息。

如果加where,可以写成

1
2
select * from information_schema.triggers 
where trigger_name='tri_insert_order';

所有触发器信息都存储在information_schema数据库下的triggers表中,可以使用SELECT语句查询,如果触发器信息过多,最好通过TRIGGER_NAME字段指定查询。

5、删除触发器

1
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name

删除触发器之后最好使用上面的方法查看一遍;同时,也可以使用database.trig来指定某个数据库中的触发器。

示例

在做支付宝订单支付的时,支付宝支付接口在一个单独的项目中,在后台调取接口生成订单去支付,当完成支付时,因为回调方法在另一个项目中,没法修改,只能用触发器来实现对表数据的监控,来完成剩下的业务逻辑。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
BEGIN
DECLARE done INT DEFAULT FALSE ; /*遍历数据结束标志 */
declare lenght_time int(5); /*时长*/
declare column_id varchar(32); /*栏目id*/
/*定义游标 以及赋值*/
declare column_ids cursor for
select sod.service_id,sod.duration from sys_order_detail sod where order_id in
(SELECT t.order_id
FROM sys_order_info t
WHERE order_number = NEW.out_trade_no);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE ;/* 将结束标志绑定到游标 */

IF (NEW.trade_status = 'TRADE_SUCCESS') THEN

UPDATE sys_order_info

set order_status = '2'

where order_number = NEW.out_trade_no;
/*打开游标*/
open column_ids ;
/*循环开始*/
read_loop:loop
/*提前游标的值 */
fetch column_ids into column_id ,lenght_time;
/*声明结束的时候*/
if done
then leave read_loop ; end if ;
/*根据时长和栏目id修改时长*/
UPDATE xypt_column SET end_time = DATE_ADD(end_time, INTERVAL lenght_time MONTH) where id =column_id ;
end loop ; /*循环结束*/
close column_ids ;/*关闭游标*/
ELSE

UPDATE sys_order_info

set order_status = '3'

where order_number = NEW.out_trade_no;

END IF;
END

参考地址

点击查看触发器概念 https://itbilu.com/database/mysql/4y77zMXel.html
点击查看触发器应用 https://www.cnblogs.com/geaozhang/p/6819648.html
点击查看官网示例 https://dev.mysql.com/doc/refman/5.5/en/trigger-syntax.html

java List接口

发表于 2018-08-29 | 分类于 后端

介绍

Interface List 继承自Collection, Iterable,实现类有AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector,最常用的实现类是ArrayList。

常用方法概要

接口方法 (有描述的为常用方法)

修饰符和返回类型 方法 描述
boolean add(E e) 将指定的元素追加到此列表的末尾(可选操作)。
void add(int index, E element) 将指定的元素插入此列表中的指定位置(可选操作)。
boolean addAll(Collection<? extends E> c)
boolean addAll(int index, Collection<? extends E> c)
void clear() 从此列表中删除所有元素(可选操作)。
boolean contains(Object o) 如果此列表包含指定的元素,则返回 true 。
boolean containsAll(Collection<?> c)
boolean equals(Object o)
E get(int index) 返回此列表中指定位置的元素。
int hashCode() 返回此列表的哈希码值。
int indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1
boolean isEmpty()
Iterator iterator()
int lastIndexOf(Object o)
ListIterator listIterator()
ListIterator listIterator(int index)
E remove(int index) 删除该列表中指定位置的元素(可选操作)。
boolean remove(Object o) 从列表中删除指定元素的第一个出现(如果存在)(可选操作)。
boolean removeAll(Collection<?> c)
default void replaceAll(UnaryOperator operator)
boolean retainAll(Collection<?> c)
E set(int index, E element) 用指定的元素(可选操作)替换此列表中指定位置的元素。
int size()
default void sort(Comparator<? super E> c)
default Spliterator spliterator()
List subList(int fromIndex, int toIndex)
Object[] toArray() 以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组。
T[] toArray(T[] a) 以正确的顺序返回一个包含此列表中所有元素的数组(从第一个到最后一个元素); 返回的数组的运行时类型是指定数组的运行时类型

list去重方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
List<String> lst1=new ArrayList<>();
lst1.add("aa");
lst1.add("dd");
lst1.add("ss");
lst1.add("aa");
lst1.add("ss");
//-----------------------------------
//方法 1.
for (int i = 0; i <lst1.size()-1; i++) {
for (int j = lst1.size()-1; j >i; j--) {
if (lst1.get(j).equals(lst1.get(i))) {
lst1.remove(j);
}
}
}
System.out.println(lst1);
//-----------------------------------
//方法 2.
List<String> lst2=new ArrayList<>();
for (String s:lst1) {
if (Collections.frequency(lst2, s)<1) {
lst2.add(s);
}
}
System.out.println(lst2);

参考地址

java 官方文档 https://docs.oracle.com/javase/8/docs/api/java/util/List.html
中文文档下载

ECharts 地图统计数据

发表于 2018-08-29 | 分类于 前端 , 数据可视化

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<!-- 为ECharts准备一个具备大小(宽高)的Dom -->
<div>
<div id="main" style="height:400px;width:800px;margin: auto;"></div>
</div>
<!-- ECharts单文件引入 -->
<script src="http://echarts.baidu.com/build/dist/echarts.js"></script>
<script type="text/javascript">
// 路径配置
require.config({
paths: {
echarts: 'http://echarts.baidu.com/build/dist'
}
});

// 使用
require(['echarts',
'echarts/chart/line',
'echarts/chart/bar', // 使用柱状图就加载bar模块,按需加载
'echarts/chart/map', ],
function(ec) {
// 基于准备好的dom,初始化echarts图表
var myChart = ec.init(document.getElementById('main'));

var option = {

title: {
text: '访问来访分析',
x:"center"
/*subtext: '数据来自国家统计局' */
},
tooltip: {
trigger: 'item'
},

dataRange: {
orient: 'horizontal',
min: 0,
max: 55000,
text: ['高', '低'],
// 文本,默认为数值文本
splitNumber: 0,
x: "20%"
},
toolbox: {
show: false,
orient: 'vertical',
x: 'right',
y: 'center',
feature: {
mark: {
show: true
},
dataView: {
show: true,
readOnly: false
}
}
},
series: [{
name: '累积访问次数',
type: 'map',
mapType: 'china',
mapLocation: {
x: 'center'
},
itemStyle: {
normal: {
label: {
show: true
}
},
emphasis: {
label: {
show: true
}
}
},
data: [
{name:'北京', value:16251.93},
{name:'福建', value:17560.18},
{name:'上海', value:19195.69},
{name:'湖北', value:19632.26},
{name:'湖南', value:19669.56},
{name:'四川', value:21026.68},
{name:'辽宁', value:22226.7},
{name:'河北', value:24515.76},
{name:'河南', value:26931.03},
{name:'浙江', value:32318.85},
{name:'山东', value:45361.85},
{name:'江苏', value:49110.27},
{name:'广东', value:53210.28}]
}],
animation: false
};
// 为echarts对象加载数据
myChart.setOption(option);
});
</script>

效果

点击查看 ECharts_demo2.html

参考地址

参考地址:http://echarts.baidu.com/echarts2/doc/example/mix3.html

ECharts 制作折线图/统计图

发表于 2018-08-28 | 分类于 前端 , 数据可视化

官方api

官网 http://echarts.baidu.com/examples/
官方api http://echarts.baidu.com/api.html#echarts
配置项详细介绍 http://echarts.baidu.com/option.html#title

介绍

ECharts2.0提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的地图、热力图、线图,用于关系数据可视化的关系图、treemap、旭日图,多维数据可视化的平行坐标,还有用于 BI 的漏斗图,仪表盘,并且支持图与图之间的混搭。
ECharts 3 开始加强了对多维数据的支持。

直接贴代码

以下部分配置项注释已加,还需要配置其他请查看配置项详细介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>ECharts</title>
</head>
<body>
<!-- 为ECharts准备一个具备大小(宽高)的Dom -->
<div>
<div id="main" style="height:400px;width:800px;margin: auto;"></div>
</div>
<!-- ECharts单文件引入 -->
<script src="http://echarts.baidu.com/build/dist/echarts.js"></script>
<script type="text/javascript">
// 路径配置
require.config({
paths: {
echarts: 'http://echarts.baidu.com/build/dist'
}
});
// 使用
require(
[
'echarts',
'echarts/chart/line' ,
'echarts/chart/bar', // 使用柱状图就加载bar模块,按需加载
],
function (ec) {
// 基于准备好的dom,初始化echarts图表
var myChart = ec.init(document.getElementById('main'));
var option = {
title : {//标题
text: '一周内流量统计变化',
x:'center', //此处使用 left:"center",textAlign:"center"均不可用,
//换成x后才好使,下面的同理
},
tooltip: { //提示框
show: true,
trigger: 'axis' //坐标轴触发
},
toolbox: { //工具箱
show: true, //是否展示按钮
x:'left',
feature: {
magicType: { //模式切换(折线图,柱状图)
type: ['line', 'bar', ],
show: true
},
dataZoom: { //区域放大
show: true
},
dataView: { //数据视图
show: true
},
restore: { //还原按钮
show: true
},
saveAsImage: { //保存图片按钮
show: true
}
}
},
legend: { //名称
data:['统计',"累计"],
y:'8%',
},
xAxis : [ //x轴数据
{
type : 'category', //分类
boundaryGap : true, //数据边界线
data :
['2018-08-21','2018-08-22',
'2018-08-23','2018-08-24',
'2018-08-25','2018-08-26',
'2018-08-27']
}
],
yAxis : [ //y轴数据
{
type : 'value'
}
],
series : [
{
"name":"统计",
"type":"line",
"data":[5, 20, 40, 10, 10, 20,55]
},
{
"name":"累计",
"type":"line",
"data": [0,21,15,6,0,0,3]
}
]
};

// 为echarts对象加载数据
myChart.setOption(option);
}
);
</script>
</body>

效果

点击查看效果 ECharts_demo.html

参考地址

参考地址:http://echarts.baidu.com/echarts2/doc/example/line2.html

mysqlql计算一段时间内 表中每天的数据量

发表于 2018-08-27

原sql为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 SELECT
CAST(tt.startTime AS char) x,count(tt.id) y
FROM
(
SELECT
t.id id,
date(t.start_time) startTime
FROM
sys_visit_log t
WHERE
t.prod_id IN (
SELECT
xp.id
FROM
xypt_production xp
WHERE
xp.org_id = #{orgId,jdbcType=VARCHAR}
)
) tt
where tt.startTime &lt; date(NOW()) and tt.startTime &gt;= date( DATE_SUB(NOW(), INTERVAL 7 DAY))
GROUP BY startTime
ORDER BY tt.startTime ASC
结果
1
2
3
4
2018-08-20	16
2018-08-22 21
2018-08-23 15
2018-08-24 6

修改后改为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
SELECT
CAST(a.x AS CHAR) x,
count(tt.id) y
FROM
(
SELECT date( DATE_SUB(NOW(), INTERVAL 1 DAY) ) x
UNION ALL
SELECT date( DATE_SUB(NOW(), INTERVAL 2 DAY) ) x
UNION ALL
SELECT date( DATE_SUB(NOW(), INTERVAL 3 DAY) ) x
UNION ALL
SELECT date( DATE_SUB(NOW(), INTERVAL 4 DAY) ) x
UNION ALL
SELECT date( DATE_SUB(NOW(), INTERVAL 5 DAY) ) x
UNION ALL
SELECT date( DATE_SUB(NOW(), INTERVAL 6 DAY) ) x
UNION ALL
SELECT date( DATE_SUB(NOW(), INTERVAL 7 DAY) ) x
) a
LEFT JOIN (
SELECT
t.id id,
date(t.start_time) startTime
FROM
sys_visit_log t
WHERE
t.prod_id IN (
SELECT xp.id
FROM xypt_production xp
WHERE xp.org_id = 'a4b1ccf70e4c47978e7931356ab43577'
)
AND date(t.start_time) < date(NOW())
AND date(t.start_time) >= date(
DATE_SUB(NOW(), INTERVAL 7 DAY)
)
) tt ON a.x = tt.startTime
GROUP BY a.x
ORDER BY a.x ASC
结果
1
2
3
4
5
6
7
2018-08-20	16
2018-08-21 0
2018-08-22 21
2018-08-23 15
2018-08-24 6
2018-08-25 0
2018-08-26 0

参考地址

https://stackoverflow.com/questions/16636433/mysql-count-to-return-0-if-no-records-found

mybatis坑点

发表于 2018-08-27

问题

Mybatis出错:Error instantiating class xxx with invalid types () or values ()

解决

原因是JavaBean必须要有无参构造器

mybatis在创建bean映射的时候需要无参的构造其来构造对象,然后才进行赋值操作。

因此,Bean必须要有无参构造函数才能正确映射。

d3制作折线图

发表于 2018-08-27 | 分类于 前端 , 数据可视化

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
 <style>
.container {
margin: 30px auto;
width: 600px;
height: 300px;
border: 1px solid #000;
}
.axis path,
.axis line,
.line {
stroke: #000;
fill: none;
}
</style>
<div class="tablebox">
<div class="container">
<svg width="100%" height="100%"></svg>
</div>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script>
window.onload = function() {
var width = 600, height = 300;
// SVG画布边缘与图表内容的距离
var padding = { top: 50, right: 50, bottom: 70, left: 50 };
// 创建一个分组用来组合要画的图表元素
var main = d3.select('.container svg').append('g')
.classed('main', true)
.attr('transform', "translate(" + padding.top + ',' + padding.left + ')');
// 模拟数据
var dataset = [
{x: '2018-01-01', y: 11}, {x: '2018-01-02', y: 35},
{x: '2018-01-03', y: 23}, {x: '2018-01-04', y: 78},
{x: '2018-01-05', y: 55}, {x: '2018-01-06', y: 18},
{x: '2018-01-07', y: 98}, {x: '2018-01-08', y: 100},
{x: '2018-01-09', y: 22}, {x: '2018-01-10', y: 65}
];
// 创建x轴的比例尺(线性比例尺)
var format = d3.time.format("%Y-%m-%d");
/* var xScale = d3.scale.linear()
.domain(d3.extent(dataset, function(d) {
return d.x;
}))
.range([0, width - padding.left - padding.right]);*/
var xScale = d3.time.scale()
.domain([format.parse(dataset[0].x),
format.parse(dataset[dataset.length-1].x)])
.range([0, width - padding.left - padding.right]);
// 创建y轴的比例尺(线性比例尺)
var yScale = d3.scale.linear()
.domain([0, d3.max(dataset,function(d) {
return d.y;
})])
.range([height - padding.top - padding.bottom, 0]);
// 创建x轴
var xAxis = d3.svg.axis()
.scale(xScale)
.orient('bottom')
.tickFormat(d3.time.format("%Y-%m-%d"));
// 创建y轴
var yAxis = d3.svg.axis()
.scale(yScale)
.orient('left');
// 添加SVG元素并与x轴进行“绑定”
main.append('g')
.attr('class', 'x axis')
.attr('transform', 'translate(0,' + (height - padding.top - padding.bottom) + ')')
.call(xAxis)
.selectAll("text")
.attr("transform", "rotate(-70)")
.style("text-anchor", "end");
;
// 添加SVG元素并与y轴进行“绑定”
main.append('g')
.attr('class', 'axis')
.call(yAxis);
// 添加折线
var line = d3.svg.line()
.x(function(d) {
return xScale(format.parse(d.x))
})
.y(function(d) {
return yScale(d.y);
})
// 选择线条的类型
.interpolate('linear');
// 添加path元素,并通过line()计算出值来赋值
main.append('path')
.attr('class', 'line')
.attr('d', line(dataset));
// 添加点
main.selectAll('circle')
.data(dataset)
.enter()
.append('circle')
.attr('cx', function(d) {
return xScale(format.parse(d.x));
})
.attr('cy', function(d) {
return yScale(d.y);
})
.attr('r', 5)
.attr('fill', function(d, i) {
return getColor(i);
});
};
function getColor(idx) {
var palette = [
'#2ec7c9', '#b6a2de', '#5ab1ef', '#ffb980', '#d87a80',
'#8d98b3', '#e5cf0d', '#97b552', '#95706d', '#dc69aa',
'#07a2a4', '#9a7fd1', '#588dd5', '#f5994e', '#c05050',
'#59678c', '#c9ab00', '#7eb00a', '#6f5553', '#c14089'
]
return palette[idx % palette.length];
}
</script>
</div>

结果

点击查看 d3_demo.html

另外一个随机多折线demo d3_demo2.html

使用ECharts.js 制作折线图

请点击访问ECharts.js 制作折线图

参考地址

d3制作折线图
横坐标轴为日期
日期转换问题
刻度数
多折线

idea使用指南

发表于 2018-08-23 | 分类于 工具

项目运行时 自动编译更新项目

https://blog.csdn.net/wangyy130/article/details/70901589

idea激活

idea activate license server
地址:https://blog.csdn.net/u013218587/article/details/80590878

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
http://idea.toocruel.net

http://idea.youbbs.org

http://idea.congm.in

http://im.js.cn:8888

http://intellij.mandroid.cn/

http://idea.imsxm.com/

http://idea.iteblog.com/key.php

http://xdouble.cn:8888/

http://hb5.s.osidea.cc:1017

excel转html在线工具

发表于 2018-08-23 | 分类于 工具
链接地址:http://pressbin.com/tools/excel_to_html_table/index.html

解决方案

1
2
3
在makedowm中,设计表格可能会遇到需要合并两个表格的情况,但是makedown只能制作简单的表格,这时就需要直接写成html格式。
在朋友的提示下,找到了一个可以把excel直接转换为html的工具。
直接从excel中复制内容进来,点击 conver进行转换,然后进行修改。

缺陷

1
虽然这种方法可以解决问题,但是makedown原本目的是为了让文本简洁可读高效,违背了makedown的初衷,不建议用这种方式

spring 定时任务

发表于 2018-08-23 | 分类于 后端

可基于注解,也可基于配置

1.在配置文件中配置定时任务

spring配置文件中,添加命名空间
1
2
3
4
在<beans >中添加
xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.2.xsd
xml添加配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!-- 定时任务 (将类注入xml)-->
<bean id="jobBean" class="com.bxj.common.task.ClearOrderTask" />
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jobBean" />
<!--ClearOrderTask类中需要执行的方法-->
<property name="targetMethod" value="doClearOrder" />
<!--将并发设置为false-->
<property name="concurrent" value="false" />
</bean>

<bean id="clearOrderTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail" />
<!--表达式,每天晚上23点55分开始 执行一次 (可以自定义,谷歌关键词 cron表达式) -->
<property name="cronExpression" value="0 55 23 * * ?" />
</bean>

<!--总管理类如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="orderQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" >
<property name="triggers">
<list>
<!--作业调度器,list下可加入其他的调度器 -->
<ref bean="clearOrderTrigger" />
</list>
</property>
</bean>
执行方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
	public class ClearOrderTask {	
/**
* 调度任务开关
*/
@Value("${CLEAR_ORDER_TASK_SWITCH}")
private String CLEAR_ORDER_TASK_SWITCH;
@Autowired
private OrderInfoService orderInfoService;
@Autowired
private OrderDetailService orderDetailService;
@Transactional
public void doClearOrder() throws Exception{
//检查配置文件任务开关
if( Const.TASK_SWITCH_ON.equals( CLEAR_ORDER_TASK_SWITCH )){
//清除订单
//先删除订单明细
orderDetailService.deleteOrderDetailByTask();
//再删除订单
orderInfoService.deleteOrderInfoByTask();;
}
}
}

2.注解配置定时任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Component
public class MyTask2 {
/**
* 定时计算。每天凌晨 01:00 执行一次
*/
@Scheduled(cron = "0 0 1 * * *")
public void show() {
System.out.println("show method 2");
}

/**
* 启动时执行一次,之后每隔2秒执行一次
*/
@Scheduled(fixedRate = 1000*2)
public void print() {
System.out.println("print method 2");
}
}

定时任务和cron表达式相关链接

参考链接
在线cron表达式生成器
cron表达式详解

1…8910
无恤

无恤

java博客

95 日志
7 分类
29 标签
GitHub
© 2018 - 2021 无恤
本站访客数:人次
本站总访问量次