好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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操作详解的详细内容...

  阅读:37次