- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章postgreSQL的crud操作详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
postgreSQL学习笔记 。
欢迎大家指出问题! 。
版本从6.0开始支持SQL解释器 。
安装一路下一步.
1.创建数据库 。
1
2
3
4
5
|
//命令行操作
createdb database_name;
CREATE
DATABASE
database_name;
psql -l //展示所有数据库
psql database_name //进入数据库
|
2.删除数据库 。
1
2
|
dropdb
database
;
DROP
DATABASE
database_name;
|
3.创建表 。
1
2
3
|
create
table
表名 (title
varchar
(255), content text);
//修改表名
alter
table
posts rename
to
表名;
|
1
2
3
4
5
6
|
//查看表信息(结构)
\d 表名
//执行这个sql文件
\i a.sql
//切换数据显示方式(横向和纵向显示)
\x
|
1
2
3
4
5
6
|
create
table
posts (
id serial
primary
key
,
title
varchar
(255)
not
null
,
content text
check
(length(content) > 3),
is_draft boolean
default
FALSE
,
created_date
timestamp
default
'now'
);
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
CREATE
TABLE
public
.students
(
id
integer
NOT
NULL
,
name
character
(128),
subjects
character
(1),
CONSTRAINT
student2_pkey
PRIMARY
KEY
(id)
)
WITH
(
OIDS=
FALSE
);
ALTER
TABLE
public
.students
OWNER
TO
postgres;
COMMENT
ON
TABLE
public
.students
IS
'这是一个学生信息表'
;
|
案例表:
4.删除表 。
1
|
DROP
TABLE
students;
|
5.数据类型 。
数值型:
integer real serial(序列型,一般用于自增字段) 。
文字型: 。
char varchar text 。
布尔型: 。
boolean 。
日期型: 。
date time timestamp 。
特色类型: 。
Array inet(网口类型) JSON XML 。
6.添加表约束 。
unique:所在数据中值必须唯一 。
check:字段设置条件,可以指定函数check(length(content) > 3)必须超过3个字符 。
default:字段默认值 。
7.INSERT语句 。
1
|
insert
into
表名(cloum1,cloum2) value(a,b);
|
8.数据抽出选项:
order by asc升序 desc降序 。
limit 限制返回数据条数 。
offset 偏移量(从哪条数据开始) 。
1
2
3
|
//分页查询limit和offset结合使用。
select
*
from
users
order
by
score
desc
limit 3;
select
*
from
users
order
by
score
desc
limit 3 offset 3;
|
9.统计抽出数据 。
distinct 去重 。
group by/having(在group by之后进行再次筛选) 分组 。
1
|
select
team,
max
(score)
from
users
group
by
team
having
max
(score)>25
order
by
max
(score);
|
10.方便的函数 。
length concat(连接两个字符串) alias(别名) substring(截取字符串) random 。
1
2
3
4
5
6
|
select
player,length(player)
from
users;
select
player,concat(player,
"/"
,team)
from
users;
select
player,concat(player,
"/"
,team)
as
"球员信息"
from
users;
select
concat(
'我'
,
substring
(team,1,1))
as
"球队首文字"
from
users;
//随机抽奖
select
player
from
users
order
by
random() limit 1;
|
11.更新和删除 。
1
2
|
update
[
table
]
set
[field=newvalue,…]
where
…
delete
from
[
table
]
where
…
|
eg
1
|
update
users
set
score = score + 100
where
team
IN
(
"勇士"
,
"骑士"
);
|
12.变更表结构 。
1
2
3
|
//
alter
table
[tablename] …
//给表添加一条fullname字段
alter
table
users
add
fullname
varchar
(255);
|
1
2
3
4
|
//给哪个表的字段建索引(索引提高查询效率,但是增删效果不好)
create
index
索引名
on
users(字段名);
//删除索引
drop
index
索引名;
|
1
2
3
4
|
//修改列名
alter
table
users rename player
to
nba_player;
//修改字段的的长度
alter
table
users
alter
nba_player type
varchar
(128);
|
13.操作多个表 。
1
2
3
4
|
//两表的关联查询
select
users.player,twitters.content
from
users,twitters
where
users.id = twitters.user_id;
//别名
select
u.player,t.content
from
users
as
u,twitters
as
t
where
u.id = t.user_id;
|
14.使用视图 。
视图:视图就是一个select语句,把业务系统中常用的select语句简化成一个类似于表的对象,便于简单读取和开发。 (对于经常使用的select语句建立视图便于编码和管理) 。
1
2
3
4
5
6
|
//创建一个视图(通过 \dv 查看视图描述)
create
view
curry_twitters
as
select
u.player,t.content
from
users
as
u,twitters
as
t
where
u.id = t.user_id;
//要进行查询时
select
*
from
curry_twitters;
//删除视图
drop
view
curry_twitters;
|
15.使用事务 。
数据库事务:是指作为单个逻辑工作单元执行的一系列操作,要么一起成功,要么一起失败。必须满足ACID(原子性、 一致性、隔离性、持久性) 。
PostgreSQL数据库事务使用 。
begin 开启事务 。
commit 提交 。
rollback 回滚 。
1
2
3
4
5
|
eg:
begin
;
update
users
set
score = 50
where
player =
'库里'
;
update
users
set
score = 60
where
player =
'哈登'
;
commit
; //如果不想跟新可以
rollback
;
|
补充:postgresql一般crud存储过程参考 。
这里是一份经过再三调试测试而成功的postgres数据库单表crud存储过程,请注意,对于多结果的返回方式,请查看getPageByCondition的书写方式,用的是refcursor,返回一个cursor,同时可以返回其他out,inout参数,但是refcursor必须在事务中调用,所以java端的调用过程需要注意,好吧,我同时放出一份dal样板,大家可以直接copy来用.
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
|
/******************************************************************
* 表名:test3
* Made
by
码农下的天桥
******************************************************************/
--use MYDB;--你可以指定自己的数据库
/******************************************************************
****************************各种常用查询***************************
******************************************************************/
------------------------------------
--用途:复杂形式的查询语句,用于查询分页数据。
--这个是泛用型的,假如你要根据用户输入去查询,那么最好不要用这个了,
--以免出现sql注入。
--参数说明:
---_offset int 需要取的记录的开始位置
---_limit int 需要获取记录的总条数,针对分页而言,就是分页的pagesize。
---_columns varchar(800) 需要获取的字段
---_where varchar(800) 需要过滤的条件譬如: where id<10 可以带where,不过建议不要带。
---_orderby varchar(800) 需要进行排序的提交,譬如:order by id
---_totalCount int 返回总共记录条数。
---_totalPages int 返回总共页数。
------------------------------------
create
or
replace
function
test3_getListByCondition(
INOUT pageindex
INT
,
INOUT pagesize
INT
,
IN
_columns
VARCHAR
(800),
IN
_where
VARCHAR
(800),
IN
_orderby
VARCHAR
(800),
out
_totalCount
INT
,
out
_totalPages
INT
)
returns
SETOF record
AS
$$
DECLARE
condition_columns
VARCHAR
(800);
DECLARE
condition_where
varchar
(800);
DECLARE
condition_orderby
VARCHAR
(800);
DECLARE
_dymatic_sql
VARCHAR
(1600);
DECLARE
_beginNO
INT
;
DECLARE
_dynamic_getCount
varchar
(1600);
DECLARE
_theOffset
INT
;
DECLARE
_tmpInt1
INT
;
BEGIN
condition_where:=ltrim(rtrim(
COALESCE
(_where,
''
)));
condition_orderby:=ltrim(rtrim(
COALESCE
(_orderby,
'order by t3id'
)));
condition_columns:=ltrim(rtrim(
COALESCE
(_columns,
'*'
)));
--分析传过来的参数,构造动态sql语句。
IF
"character_length"
(condition_where)>0
THEN
IF strpos(condition_where,
'where '
)!=1
THEN
condition_where:=
'where '
|| condition_where;
END
IF;
END
IF;
--order by 语句构造
IF
"character_length"
(condition_orderby)>0
THEN
IF strpos(condition_orderby,
'order '
)!=1
THEN
condition_orderby:=
'order by '
||condition_orderby;
END
IF;
END
IF;
--判断pageindex是否合法及pagesize是否合法
IF pageindex<1
THEN
pageindex:=1;
END
IF;
IF pagesize<1
THEN
pagesize:=20;
END
IF;
_dynamic_getCount:=
'select count(*) from test3 '
||condition_where||
' '
;
EXECUTE
_dynamic_getCount
INTO
_totalCount;
IF _totalCount<1
THEN
pageindex:=1;
RETURN
;
END
IF;
--计算总共页数
_tmpInt1:=_totalCount%pagesize;
IF _tmpInt1=0
THEN
_totalPages:=_totalCount / pagesize;
ELSE
_totalPages:=(_totalCount-_tmpInt1)/pagesize+1;
END
IF;
IF _totalPages < pageindex
then
pageindex:=_totalPages;
END
IF;
_theOffset:=(pageindex-1) * pagesize+1;
_dymatic_sql:=
'select '
||condition_columns||
' from test3 '
||condition_where||
' '
||condition_orderby||
' limit '
||pagesize||
' '
||
' offset '
||_theOffset||
' '
;
--raise info '动态构造语句为:%',_dymatic_sql;
return
query
EXECUTE
_dymatic_sql;
END
;
$$ language plpgsql VOLATILE;
------------------------------------
--用途:复杂形式的查询语句,用于查询多条记录数据。
--这个是泛用型的,假如你要根据用户输入去查询,那么最好不要用这个了,
--以免出现sql注入。
--参数说明:
---_offset int 需要取的记录的开始位置
---_limit int 需要获取记录的总条数,针对分页而言,就是分页的pagesize。
---_columns varchar(800) 需要获取的字段
---_where varchar(800) 需要过滤的条件譬如: where id<10 可以带where,不过建议不要带。
---_orderby varchar(800) 需要进行排序的提交,譬如:order by id
---_totalCount int 返回总共记录条数。
------------------------------------
create
or
replace
function
test3_getPageByCondition(
INOUT pageindex
INT
,
INOUT pagesize
INT
,
IN
_columns
VARCHAR
(800),
IN
_where
VARCHAR
(800),
IN
_orderby
VARCHAR
(800),
out
_totalCount
INT
,
out
_totalPages
INT
,
out
_refcursor refcursor
)
returns
SETOF record
AS
$$
DECLARE
condition_columns
VARCHAR
(800);
DECLARE
condition_where
varchar
(800);
DECLARE
condition_orderby
VARCHAR
(800);
DECLARE
_dymatic_sql
VARCHAR
(1600);
DECLARE
_beginNO
INT
;
DECLARE
_dynamic_getCount
varchar
(1600);
DECLARE
_theOffset
INT
;
DECLARE
_tmpInt1
INT
;
BEGIN
condition_where:=ltrim(rtrim(
COALESCE
(_where,
''
)));
condition_orderby:=ltrim(rtrim(
COALESCE
(_orderby,
'order by t3id'
)));
condition_columns:=ltrim(rtrim(
COALESCE
(_columns,
'*'
)));
--分析传过来的参数,构造动态sql语句。
IF
"character_length"
(condition_where)>0
THEN
IF strpos(condition_where,
'where '
)!=1
THEN
condition_where:=
'where '
|| condition_where;
END
IF;
END
IF;
--order by 语句构造
IF
"character_length"
(condition_orderby)>0
THEN
IF strpos(condition_orderby,
'order '
)!=1
THEN
condition_orderby:=
'order by '
||condition_orderby;
END
IF;
END
IF;
--判断pageindex是否合法及pagesize是否合法
IF pageindex<1
THEN
pageindex:=1;
END
IF;
IF pagesize<1
THEN
pagesize:=20;
END
IF;
_dynamic_getCount:=
'select count(*) from test3 '
||condition_where||
' '
;
EXECUTE
_dynamic_getCount
INTO
_totalCount;
IF _totalCount<1
THEN
pageindex:=1;
RETURN
;
END
IF;
--计算总共页数
_tmpInt1:=_totalCount%pagesize;
IF _tmpInt1=0
THEN
_totalPages:=_totalCount / pagesize;
ELSE
_totalPages:=(_totalCount-_tmpInt1)/pagesize+1;
END
IF;
IF _totalPages < pageindex
then
pageindex:=_totalPages;
END
IF;
_theOffset:=(pageindex-1) * pagesize+1;
_dymatic_sql:=
'select '
||condition_columns||
' from test3 '
||condition_where||
' '
||condition_orderby||
' limit '
||pagesize||
' '
||
' offset '
||_theOffset||
' '
;
--raise info '动态构造语句为:%',_dymatic_sql;
open
_refcursor
for
EXECUTE
_dymatic_sql;
RETURN
NEXT
;
END
;
$$ language plpgsql VOLATILE;
------------------------------------
--用途:获取其中一条记录
------------------------------------
create
or
replace
function
test3_getRecord(
in
_id
integer
)
returns
SETOF test3
AS
$$
BEGIN
return
query
select
*
from
test3
where
t3id=_id LIMIT 1 OFFSET 0;
END
;
$$ LANGUAGE plpgsql VOLATILE;
------------------------------------
--用途:复杂形式的查询语句,用于查询前面第几条记录,这个就相当好了
--这个是泛用型的,假如你要根据用户输入去查询,那么最好不要用这个了,
--以免出现sql注入。
--参数说明:
---_topN int 需要取的topN条记录。
---_columns varchar(800) 需要获取的字段
---_where varchar(800) 需要过滤的条件譬如: where id<10 可以带where,不过建议不要带。
---_orderby varchar(800) 需要进行排序的提交,譬如:order by id
------------------------------------
create
or
replace
function
test3_getTopNbyCondition(
IN
_topN
int
,
IN
_columns
VARCHAR
(800),
IN
_where
VARCHAR
(800),
IN
_orderby
VARCHAR
(800))
returns
SETOF test3
AS
$$
DECLARE
condition_columns
VARCHAR
(800);
DECLARE
condition_where
varchar
(800);
DECLARE
condition_orderby
VARCHAR
(800);
DECLARE
_dymatic_sql
VARCHAR
(1600);
BEGIN
condition_where:=ltrim(rtrim(
COALESCE
(_where,
''
)));
condition_orderby:=ltrim(rtrim(
COALESCE
(_orderby,
'order by t3id'
)));
condition_columns:=ltrim(rtrim(
COALESCE
(_columns,
'*'
)));
--分析传过来的参数,构造动态sql语句。
IF
"character_length"
(condition_where)>0
THEN
IF strpos(condition_where,
'where '
)!=1
THEN
condition_where:=
'where '
|| condition_where;
END
IF;
END
IF;
--order by 语句构造
IF
"character_length"
(condition_orderby)>0
THEN
IF strpos(condition_orderby,
'order '
)!=1
THEN
condition_orderby:=
'order by '
||condition_orderby;
END
IF;
END
IF;
_dymatic_sql:=
'select '
||condition_columns||
' from test2 '
||condition_where||
' '
||condition_orderby||
' limit '
||
CAST
(_topN
as
VARCHAR
)||
' offset 0 '
;
--raise info '动态构造语句为:%',_dymatic_sql;
return
query
EXECUTE
_dymatic_sql;
END
;
$$ language plpgsql VOLATILE;
/******************************************************************
*****************************记录删除******************************
******************************************************************/
------------------------------------
--用途:删除多条记录
------------------------------------
create
or
replace
function
test3_DeleteList(
in
ids
VARCHAR
(800),
out
status boolean,
out
msg
VARCHAR
(200))
returns
record
AS
$$
DECLARE
_arr_ids
int
[];
DECLARE
_str_ids
"text"
;
DECLARE
_str_sql
VARCHAR
(1600);
DECLARE
_effects
int
;
BEGIN
IF
"character_length"
(ids)<1
THEN
status:=
false
;
msg:=
'没有指定需要删除的数据!'
;
return
;
end
if;
_arr_ids:=tools_str2intarray(ids,
','
);
_str_ids:=tools_stringify(_arr_ids,
','
);
--pkey为主键,自增的整数, <@ 表示判断pkey是不是在数组里面。是不是很方便?
/*动态构造执行*/
--_str_sql:='DELETE FROM test3 where t3id in ('||_str_ids||') ;';
--EXECUTE _str_sql;
/*直接执行*/
delete
from
test3
where
t3id =
ANY
( _arr_ids);
GET DIAGNOSTICS _effects = ROW_COUNT;
IF _effects>0
THEN
status:=
true
;
msg:=
'成功删除'
||_effects||
'条记录!'
;
ELSE
status:=
false
;
msg:=
'没有删除任何记录!'
;
end
if;
END
$$ LANGUAGE plpgsql VOLATILE;
/******************************************************************
****************************添加及编辑*****************************
******************************************************************/
------------------------------------
--用途:增加一条记录
------------------------------------
create
or
replace
function
test3_Insert(
in
__t3name
varchar
(400) ,
in
__t_birthday
date
,
in
__myage
smallint
,
in
__isadmin boolean ,
in
__myintro text ,
in
__price
float
,
out
__t3id
integer
,
out
_status boolean,
out
_msg
varchar
(200))
returns
record
AS
$$
BEGIN
Insert
into
test3
(
"t3name"
,
"t_birthday"
,
"myage"
,
"isadmin"
,
"myintro"
,
"price"
)
values
(
__t3name,__t_birthday,__myage,__isadmin,__myintro,__price
);
/*判断添加记录是否成功。*/
if FOUND
then
_status:=
true
;
_msg:=
'成功添加记录.'
;
__t3id:=currval(pg_get_serial_sequence(
'test3'
,
't3id'
));
else
_status:=
false
;
_msg:=
'无法添加记录!'
;
end
if;
end
;
$$ LANGUAGE plpgsql VOLATILE;
------------------------------------
--用途:修改一条记录
------------------------------------
create
or
replace
function
test3_Update(
in
__t3name
varchar
(400) ,
in
__t_birthday
date
,
in
__myage
smallint
,
in
__isadmin boolean ,
in
__myintro text ,
in
__price
float
,
in
__t3id
integer
,
out
_status boolean,
out
_msg
varchar
(200))
returns
record
AS
$$
BEGIN
update
test3
set
"t3name"
=__t3name,
"t_birthday"
=__t_birthday,
"myage"
=__myage,
"isadmin"
=__isadmin,
"myintro"
=__myintro,
"price"
=__price
where
t3id=__t3id;
/*判断保存记录是否成功。*/
if FOUND
then
_status:=
true
;
_msg:=
'成功保存记录.'
;
else
_status:=
false
;
_msg:=
'无法保存记录!'
;
end
if;
end
;
$$ LANGUAGE plpgsql VOLATILE;
|
对应dal调用文件:
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
|
package EasisWeb.DAL;
import EasisWeb.config.DBPool;
import Easis.Common.StringUtil;
import Easis.util.DataRow;
import Easis.util.DataTable;
import Easis.util.DataTableHelper;
import java.util.
Date
;
import Easis.DBUtility.PooledConnection;
import java.sql.*;
import java.util.List;
import java.util.ArrayList;
import Easis.util.OperationResult;
import Easis.util.PagerResult;
import EasisWeb.Model.test3Model;
/**
* 这是利用CodeGen工具生成的自动访问数据库的一个模板,作者为“码农下的天桥”
*生成的类名称:
* @author 码农下的天桥
* @version 1.00
*/
public
class test3DAL {
/*表格各种
column
*/
public
static
final String col_t3id=
"test3"
;
public
static
final String col_t3name=
"test3"
;
public
static
final String col_t_birthday=
"test3"
;
public
static
final String col_myage=
"test3"
;
public
static
final String col_isadmin=
"test3"
;
public
static
final String col_myintro=
"test3"
;
public
static
final String col_price=
"test3"
;
public
static
final String PKColumn=
"t3id"
;
/**
*存储过程名称:test3_ListByCondition
*存储过程参数:
*@param pageindex
*@param pagesize
*@param columns 需要获取的字段
*@param condition
where
条件语句
*@param orderColumn
order
by
排序语句
*
*@
return
分页对象
*/
public
PagerResult getPageListByCondition(
int
pageindex,
int
pagesize, String columns, String condition, String orderColumn){
PagerResult pres=new PagerResult();
//
output
参数定义
int
_total = 0 ;
int
_pagesize = 0 ;
int
_pageindex = 0 ;
int
_totalpages = 0 ;
//
output
参数定义结束
//调用存储过程
DataTable res__datatable=new DataTable();
try{
PooledConnection __myconn=DBPool.getConnection();
__myconn.setAutoCommit(
false
); //
return
refcursor must within a
transaction
CallableStatement _stmt=__myconn.prepareCall(
"{ call test3_getPageByCondition( ?, ?, ?, ?, ?, ?, ?, ?)}"
);
_stmt.setInt(1,pageindex);
_stmt.setInt(2,pagesize);
_stmt.registerOutParameter(1,Types.
INTEGER
);
_stmt.registerOutParameter(2,Types.
INTEGER
);
_stmt.setString(3,columns);
_stmt.setString(4,condition);
_stmt.setString(5,orderColumn);
_stmt.registerOutParameter(6, Types.
INTEGER
);
_stmt.registerOutParameter(7, Types.
INTEGER
);
_stmt.registerOutParameter(8,Types.OTHER);
_stmt.
execute
();
ResultSet __rslist=(ResultSet)_stmt.getObject(8);
res__datatable=DataTableHelper.rs2datatable(__rslist);
//取回参数
_total=_stmt.getInt(6);
pres.totalrecords=_total;
_pageindex=_stmt.getInt(1);
pres.totalrecords=_total;
_pagesize=_stmt.getInt(2);
pres.pageindex=_pageindex;
pres.pagesize=_pagesize;
_totalpages=_stmt.getInt(7);
pres.totalpages=_totalpages;
pres.datasource=res__datatable;
//
--提交并还原
__myconn.
commit
();
__myconn.setAutoCommit(
true
); //返回游标必须在一个事务中,提交完以后将autocommit还原。
//释放资源
__rslist.
close
();
_stmt.
close
();
__myconn.
close
();}
catch (Exception __e){
System.
out
.println(
"在运行[test3DAL]的List_Condition时候出现错误。"
);
__e.printStackTrace();
}
return
pres;
}
/**
*存储过程名称:test3_Insert
*存储过程参数:
*param t3id 【主键】
t3name
t_birthday
myage
isadmin
myintro
price
*
*@
return
*/
public
OperationResult
Insert
(test3Model model){
OperationResult __ores=new OperationResult();
/*
output
参数定义*/
int
t3id = 0 ;
DataRow returnInfo=new DataRow();
boolean status =
false
;
String message =
""
;
/*
output
参数定义结束*/
/*调用存储过程*/
try{
PooledConnection __myconn=DBPool.getConnection();
CallableStatement _stmt=__myconn.prepareCall(
"{call test3_Insert(?,?,?,?,?,?,?,?,?)}"
);
_stmt.setObject(1,model.t3name,Types.
VARCHAR
);
_stmt.setObject(2,new
Timestamp
(model.t_birthday.getTime()),Types.
DATE
);
_stmt.setObject(3,model.myage,Types.
SMALLINT
);
_stmt.setObject(4,model.isadmin,Types.BOOLEAN);
_stmt.setObject(5,model.myintro,Types.
VARCHAR
);
_stmt.setObject(6,model.price,Types.
FLOAT
);
_stmt.registerOutParameter(7,Types.
INTEGER
,-1);
_stmt.registerOutParameter(8, Types.BOOLEAN,1);
_stmt.registerOutParameter(9, Types.
VARCHAR
,200);
_stmt.
execute
();
/*取回参数*/
t3id=_stmt.getInt(7);
status=_stmt.getBoolean(8);
message=_stmt.getString(9);
__ores.id= t3id;
__ores.status=status;
__ores.message=message;
/*释放资源*/
_stmt.
close
();
__myconn.
close
();}
catch (Exception __e){
__e.printStackTrace();
__ores.message=__e.toString();
}
return
__ores;
}
/**
*存储过程名称:test3_Update
*存储过程参数:
* t3id【主键】
t3name
t_birthday
myage
isadmin
myintro
price
*
*@
return
*/
public
OperationResult
Update
(test3Model model){
OperationResult __ores=new OperationResult();
/*
output
参数定义*/
boolean status =
false
;
String message =
""
;
/*
output
参数定义结束*/
/*调用存储过程*/
DataTable res__datatable=new DataTable();
try{
PooledConnection __myconn=DBPool.getConnection();
CallableStatement _stmt=__myconn.prepareCall(
"{ call test3_Update( ?,?,?,?,?,?,?,?,?)}"
);
_stmt.setObject(1,model.t3name,Types.
VARCHAR
);
_stmt.setObject(2,new
Timestamp
(model.t_birthday.getTime()),Types.
DATE
);
_stmt.setObject(3,model.myage,Types.
SMALLINT
);
_stmt.setObject(4,model.isadmin,Types.BOOLEAN);
_stmt.setObject(5,model.myintro,Types.
VARCHAR
);
_stmt.setObject(6,model.price,Types.
FLOAT
);
_stmt.setInt(7,model.t3id);
_stmt.registerOutParameter(8, Types.BOOLEAN,1);
_stmt.registerOutParameter(9, Types.
VARCHAR
,400);
_stmt.
execute
();
/*取回参数*/
status=_stmt.getBoolean(8);
message=_stmt.getString(9);
__ores.status=status;
__ores.message=message;
/*释放资源*/
_stmt.
close
();
__myconn.
close
();}
catch (Exception __e){
__e.printStackTrace();
}
return
__ores;
}
/**
*存储过程名称:test3_DeleteList
*存储过程参数:
*@param ids 【参数名称:ids 参数类型:nvarchar 对应java类型:String 长度:400 】
*
*@
return
*/
public
OperationResult DeleteList( String ids){
/*
output
参数定义*/
OperationResult __ores=new OperationResult();
boolean status =
false
;
String message =
""
;
/*
output
参数定义结束*/
/*调用存储过程*/
DataTable res__datatable=new DataTable();
try{
PooledConnection __myconn=DBPool.getConnection();
CallableStatement _stmt=__myconn.prepareCall(
"{ call test3_DeleteList( ?, ?, ?)}"
);
_stmt.setString(1,ids);
_stmt.registerOutParameter(2, Types.BOOLEAN,1);
_stmt.registerOutParameter(3, Types.
VARCHAR
,400);
_stmt.
execute
();
/*取回参数*/
status=_stmt.getBoolean(2);
message=_stmt.getString(3);
__ores.status=status;
__ores.message=message;
/*释放资源*/
_stmt.
close
();
__myconn.
close
();}
catch (Exception __e){
__e.printStackTrace();
}
return
__ores;
}
/**
*存储过程名称:test3_GetRecord
*存储过程参数:
*@param t3id 【参数名称:id 参数类型:
int
对应java类型:
int
长度:非字符类型 】
*
*@
return
DataTable对象。
*/
public
test3Model GetRecord(
int
t3id ){
/*调用存储过程*/
DataTable res__datatable=new DataTable();
test3Model model=new test3Model();
try{
PooledConnection __myconn=DBPool.getConnection();
CallableStatement _stmt=__myconn.prepareCall(
"{ call test3_GetRecord( ?)}"
);
_stmt.setInt(1,t3id);
ResultSet __rslist =_stmt.executeQuery();
res__datatable=DataTableHelper.rs2datatable(__rslist);
model=tryParseModel(res__datatable.get(0));
/*释放资源*/
__rslist.
close
();
_stmt.
close
();
__myconn.
close
();}
catch (Exception __e){
__e.printStackTrace();
}
return
model;
}
/**
*存储过程名称:test3_Top_Condition
*存储过程参数:
*@param topN 【参数名称:topN 参数类型:
int
对应java类型:
int
长度:非字符类型 】
*@param columns 【参数名称:columns 参数类型:nvarchar 对应java类型:String 长度:800 】
*@param condition 【参数名称:condition 参数类型:nvarchar 对应java类型:String 长度:800 】
*@param orderColumn 【参数名称:orderColumn 参数类型:nvarchar 对应java类型:String 长度:800 】
*
*@
return
DataTable对象。
*/
public
DataTable Top_Condition(
int
topN, String columns, String condition, String orderColumn ){
/*调用存储过程*/
DataTable res__datatable=new DataTable();
try{
PooledConnection __myconn=DBPool.getConnection();
CallableStatement _stmt=__myconn.prepareCall(
"{ call test3_Top_Condition( ?, ?, ?, ?)}"
);
_stmt.setInt(1,topN);
_stmt.setString(2,columns);
_stmt.setString(3,condition);
_stmt.setString(4,orderColumn);
ResultSet __rslist =_stmt.executeQuery();
res__datatable=DataTableHelper.rs2datatable(__rslist);
/*释放资源*/
__rslist.
close
();
_stmt.
close
();
__myconn.
close
();}
catch (Exception __e){
__e.printStackTrace();
}
return
res__datatable;
}
public
test3Model tryParseModel(DataRow drow){
test3Model model=new test3Model();
if(drow==
null
){
return
model;
}
/*
return
"boolean"
;
return
"Date"
;
return
"double"
;
return
"float"
;
return
"int"
;
return
"long"
;
return
"String"
;
return
"Object"
;
*/
/*尝试赋值*/
model.t3id = drow.get(
"t3id"
).toInt();
model.t3name = drow.get(
"t3name"
).toString();
model.t_birthday = drow.get(
"t_birthday"
).toDate();
model.myage = drow.get(
"myage"
).toInt();
model.isadmin = drow.get(
"isadmin"
).toBoolean();
model.myintro = drow.get(
"myintro"
).toString();
model.price = drow.get(
"price"
).toFloat();
return
model;
}
public
List<test3Model> tryParseList(List<DataRow> dataList){
List<test3Model> modellist=new ArrayList<test3Model>();
if(dataList==
null
){
return
modellist;
}
for
(DataRow drow :dataList){
modellist.
add
(tryParseModel(drow));
}
return
modellist;
}
}
|
这只是一份模板而已.
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我。如有错误或未考虑完全的地方,望不吝赐教.
原文链接:https://blog.csdn.net/qq_43473129/article/details/104430338 。
最后此篇关于postgreSQL的crud操作详解的文章就讲到这里了,如果你想了解更多关于postgreSQL的crud操作详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
大家好,我是汤师爷~ 什么是订单履约系统? 订单履约是从消费者下单支付到收到商品的全流程管理过程,包括订单接收、订单派单、库存分配、仓储管理和物流配送等环节,核心目标是确保商品准时、准确地送达消费
大家好,我是汤师爷~ 今天聊聊促销系统整体规划。 各类促销活动的系统流程,可以抽象为3大阶段: B端促销活动管理:商家运营人员在后台系统中配置和管理促销活动,包括设定活动基本信息、使用规则
全称“Java Virtual Machine statistics monitoring tool”(statistics 统计;monitoring 监控;tool 工具) 用于监控虚拟机的各种运
主要是讲下Mongodb的索引的查看、创建、删除、类型说明,还有就是Explain执行计划的解释说明。 可以转载,但请注明出处。  
1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发。 2>循环服务器和并发服务器
详解 linux中的关机和重启命令 一 shutdown命令 shutdown [选项] 时间 选项: ?
首先,将json串转为一个JObject对象: ? 1
matplotlib官网 matplotlib库默认英文字体 添加黑体(‘SimHei')为绘图字体 代码: plt.rcParams['font.sans-serif']=['SimHei'
在并发编程中,synchronized关键字是常出现的角色。之前我们都称呼synchronized关键字为重量锁,但是在jdk1.6中对synchronized进行了优化,引入了偏向锁、轻量锁。本篇
一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接配置被收拢到统一的配置中心,由DBA统一配置和维护,业务方通过某个字符串配置拿到的是Connection对象。  
实例如下: ? 1
1. MemoryCahe NetCore中的缓存和System.Runtime.Caching很相似,但是在功能上做了增强,缓存的key支持object类型;提供了泛型支持;可以读缓存和单个缓存
argument是javascript中函数的一个特殊参数,例如下文,利用argument访问函数参数,判断函数是否执行 复制代码 代码如下: <script
一不小心装了一个Redis服务,开了一个全网的默认端口,一开始以为这台服务器没有公网ip,结果发现之后悔之莫及啊 某天发现cpu load高的出奇,发现一个minerd进程 占了大量cpu,googl
今天写这个是为了 提醒自己 编程过程 不仅要有逻辑 思想 还有要规范 代码 这样可读性 1、PHP 编程规范与编码习惯最主要的有以下几点: 1 文件说明 2 funct
摘要:虚拟机安装时一般都采用最小化安装,默认没有lspci工具。一台测试虚拟网卡性能的虚拟机,需要lspci工具来查看网卡的类型。本文描述了在一个虚拟机中安装lspci工具的具体步骤。 由于要测试
1、修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统
目录 算术运算符 基本四则运算符 增量赋值运算符 自增/自减运算符 关系运算符 逻
如下所示: ? 1
MapperScannerConfigurer之sqlSessionFactory注入方式讲解 首先,Mybatis中的有一段配置非常方便,省去我们去写DaoImpl(Dao层实现类)的时间,这个
我是一名优秀的程序员,十分优秀!