- 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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
我刚刚发现了这门语言,我想知道是否可以使用数据库制作基本的 CRUD 网络应用程序。 最佳答案 有 mysql 的库和 postgresql , 核心库提供了一个 web server支持 HTTP、
Symfony 4.0 发布后,不再支持 SensioGeneratorBundle .因此命令 php app/console generate:doctrine:crud不可用。 他们建议使用 M
在开发 Web 应用程序时,我通常会看到人们执行增删改查和同步 View 的两种方式。 这里是使用 ajax 的高级示例。 1-方法一 创建操作可能涉及 POST 请求,成功后只需执行另一个 GET
我已经成功地使用 Yii2 模型和 CRUD 生成器为我的网络应用程序获取了一些框架代码文件。特别是,CRUD Generator 声称已成功将其 View 文件创建到: /basic/views//
在我的项目中,我一直在使用 Django 的通用 CRUD View 来处理很多事情。我现在想开始迁移到 DJango 1.3 中基于类的新样式通用 CRUD View 。我没有发现这些文档有多大帮助
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 7年前关闭。 Improve this
我希望标题不要太含糊,所以这里是: 我创建了一个 MySQL 数据库,其中存储了两个表:一个包含输入数据,另一个包含输出数据。 之后我编写了一个程序,连接到这个特定的数据库,从输入表中提取数据,解析它
我需要编辑我的实体以获得更多值。我已经用我之前的值生成了 crud。如何在编辑实体后通过应用程序/控制台重新生成 crud,以便它自动为其他值生成函数。 最佳答案 为此,您需要删除为此 crud 生成
因此,我仅使用 JavaScript 创建了一个简单的 CRUD 应用程序。现在,您可以将国家/地区添加到数组中并从数组中删除国家/地区。我希望能够编辑数组中的现有国家/地区,例如我想将“斯德哥尔摩”
我想让java中的一个类有一个可以与Hibernate配置交互并执行某些操作的方法,该方法被标识为ENUM(例如:读取,更新,添加,删除等) 方法参数应为(枚举操作、类 DTO、NamedQuery
我正在构建一个 React 应用程序,并使用 auth0 来登录/验证用户。 在使用 auth0 之前,我一直在对 API 进行 CRUD 调用来发布帖子。这又是在使用 auth0 之前、在我拥有用户
尝试使用 BlueJ 构建我的第一个 Java MySQL CRUD 应用程序。我可以运行该应用程序并将数据写入 MySQL 数据库。但是,当我运行搜索函数时,我得到了 Java .NullPoint
我正在试用 Microsoft Master Data Services,我想以编程方式将数据添加到数据库中。我开始获得模型/实体/成员结构,但我还不确定。如果您对此结构有很好的解释,请分享。 假设有
我正在尝试开发一个 Backbone Marionette 应用程序,我需要知道如何以最佳方式执行 CRUD(创建、读取、更新和销毁)操作。我找不到任何解释这一点的资源(仅适用于 Backbone)。
我已经根据文档和 medium article 模拟了与 Room 的多对多关系。 .使用这个@Relation,我可以从数据库中检索RecipeWithIngredients 或Ingredient
Closed. This question is opinion-based。它当前不接受答案。 想要改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。 3年前关闭。
通过AngularJS通过REST进行CRUD操作的最佳实践是什么? 特别是这里的 Angular-Way 。我的意思是使用最少代码和最默认 Angular 设置来达到此目的的方式。 我知道$ res
我无法弄清楚我的更新功能。我能够从数据库中检索和删除,但我不知道如何更新。这对我来说是全新的,所以我很困惑。 .js 文件 //update user $("#btnUpdateUser").clic
我正在寻找一种对用户透明的 CRUD 操作后重新加载页面的方法。 实际上,在创建或删除之后,我必须重新加载页面才能显示我的操作。 我使用 api 来实现这个,当我将它与 json 文件一起使用时,它工
我是一名优秀的程序员,十分优秀!