日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java中jdbc的封装笔记_JDBC封装学习笔记(三)---面向对象的JDBC,使用preparedStatement...

發布時間:2024/9/30 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中jdbc的封装笔记_JDBC封装学习笔记(三)---面向对象的JDBC,使用preparedStatement... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用PreparedStatement對象:為什么要使用PreparedStatement

原因:(1)使用Statement需要拼接SQL,太費勁,也容易出錯。

String sql = "insert into userinfo" + " values (" + player.getId() + ",'" + player.getPlayerID() + "','"+ player.getName() + "','" + player.getTeam() + "','" + player.getCity() + "'," + player.getMaxScore()+ ",'" +player.getDraftyear() + "')";

PreparedStatement 在創建時就可以直接傳入一個SQL語句,并且字段使用占位符即可,提供了處理占位符值得方法PreparedStatement ps = Connection.PreparedStatement(sql);

String sql = insert into userinfo values(?,?,?,?).這樣的額SQL語句是不容易出錯的,因此我們之前使用Statement做的更新操作,可以用PreparedStatement來代替了

在執行ps.executeUpdate()里面不再需要傳入SQL語句

(2)PreparedStatement可以有效的禁止SQL注入

(3) ?PreparedStatement是Statement的子接口

==============================================================================================================================================================

在JDBCUtils.java中我們可以添加一個方法,實現如下圖所示:其中傳入了一個SQL語句,還有一個可變參數,因為不知道具體的類型,所以使用了可變參數。。。。

// 使用preparedStatement對象進行更新

1 public static voidupdateDataUsePS(String sql, Object... args) {2 //獲取連接

3 Connection conn = null;4 PreparedStatement ps = null;5 ResultSet rs = null;6 try{7 conn = JDBCUtils.getConnection();//獲得連接

8 ps = conn.prepareStatement(sql); //創建statement對象9 //獲取可變參數的值

10 for (int i = 0; i < args.length; i++) {11 ps.setObject(i + 1, args[i]);12 }13 ps.executeUpdate();14 //System.out.println(sql);

15 System.out.println("SQL執行成功");16 } catch(ClassNotFoundException e) {17 //TODO Auto-generated catch block

18 e.printStackTrace();19 } catch(IOException e) {20 //TODO Auto-generated catch block

21 e.printStackTrace();22 } catch(SQLException e) {23 //TODO Auto-generated catch block

24 e.printStackTrace();25 } finally{26 JDBCUtils.closeSource(null, ps, conn);27 System.out.println("資源關閉成功");28 }29

30 }

然后在實際的操作中調用這個方法:

// 插入一個新的運動員,使用preparedStatement

1 public voidtestAddPlayers1(Players player) {2 String sql = "insert into userinfo values (?,?,?,?,?,?,?)";3 JDBCUtils.updateDataUsePS(sql, player.getId(), player.getPlayerID(), player.getName(), player.getTeam(),4 player.getCity(), player.getMaxScore(), player.getDraftyear());5 }

//在測試方法中,去調用testAddPlayers1(Players player) 這個方法:

// 測試方法

1 @Test2 public voidtestAddPlayers() {3 Players player =getFromConsole();4 testAddPlayers1(player);5 //return player;

6 }

這里就可以使用Junit框架進行測試了,控制臺運行截圖如下所示:

完整源代碼如下所示:

1 packagecom.jdbc.basedemo;2

3 importjava.io.IOException;4 importjava.sql.Connection;5 importjava.sql.ResultSet;6 importjava.sql.SQLException;7 importjava.sql.Statement;8 importjava.util.Scanner;9

10 importorg.junit.Test;11

12 importcom.jdbc.bean.Players;13

14 public classCrudPlayer {15 //添加一個運動員,傳入一個運動員對象

16 public voidaddPlayers(Players player) {17 //給出一個SQL

18 String sql = "insert into userinfo" + " values (" + player.getId() + ",'" + player.getPlayerID() + "','"

19 + player.getName() + "','" + player.getTeam() + "','" + player.getCity() + "'," +player.getMaxScore()20 + ",'" + player.getDraftyear() + "')";21 System.out.println(sql);22 //調用更新方法

23 JDBCUtils.updateData(sql);24 }25

26 //@插入一個新的運動員,使用preparedStatement

27

28 public voidtestAddPlayers1(Players player) {29 String sql = "insert into userinfo values (?,?,?,?,?,?,?)";30 JDBCUtils.updateDataUsePS(sql, player.getId(), player.getPlayerID(), player.getName(), player.getTeam(),31 player.getCity(), player.getMaxScore(), player.getDraftyear());32 }33

34 //測試方法

35 @Test36 public voidtestAddPlayers() {37 Players player =getFromConsole();38 testAddPlayers1(player);39 //return player;

40 }41

42 //從控制臺獲取輸入的運動員信息

43 privatePlayers getFromConsole() {44 //TODO Auto-generated method stub

45 Scanner input = newScanner(System.in);46 Players player = newPlayers();47 System.out.println("請輸入球員信息");48 //這里因為主鍵在數據表中設置了自增,所以拼接的SQL中只獲取,而不用再一次輸入ID

49 System.out.print("球員ID:");50 player.setPlayerID(input.next());51 System.out.print("球員姓名:");52 player.setName(input.next());53 System.out.print("球隊名稱:");54 player.setTeam(input.next());55 System.out.print("球隊城市:");56 player.setCity(input.next());57 System.out.print("個人單場最高分:");58 player.setMaxScore(input.nextInt());59 System.out.println("選秀年:");60 player.setDraftyear(input.next());61

62 returnplayer;63 }64

65 //查詢類型

66 @Test67 public voidtestGetPlayer() {68 //獲取查詢類型

69 int searchType =getTypeFromConsole();70 //執行查詢

71 Players players =searchPlayer(searchType);72 //打印運動員信息

73 printPlayer(players);74

75 //return players;

76 }77

78 //打印運動員信息

79 private voidprintPlayer(Players players) {80 //TODO Auto-generated method stub

81 if (players != null) {82 System.out.println(players);83 } else{84 System.out.println("查無此人....");85 }86 }87

88 //具體查詢運動員信息方法

89 private Players searchPlayer(intsearchType) {90 //TODO Auto-generated method stub91 //select * 的寫法不好,這里為了偷懶

92 String sql = "select * from userinfo" + " where ";93 Scanner scanner = newScanner(System.in);94 //根據確定的type,提示用戶輸入查詢的類型

95 最終確認SQL語句

96 if (searchType == 1) {97 System.out.print("請輸入球員ID編號:");98 String playerID =scanner.next();99 sql = sql + "playID='" + playerID + "'";100 } else{101 System.out.print("請輸入球員姓名:");102 String name =scanner.next();103 sql = sql + "username='" + name + "'";104 }105 //執行查詢

106 Players player =getPlayer(sql);107

108 returnplayer;109 }110

111 //執行查詢的方法,根據SQL語句執行查詢

112 privatePlayers getPlayer(String sql) {113 //TODO Auto-generated method stub

114 Players player = null;115 Connection conn = null;116 Statement statement = null;117 ResultSet rs = null;118

119 try{120 conn =JDBCUtils.getConnection();121 statement =conn.createStatement();122 rs =statement.executeQuery(sql);123 if(rs.next()) {124 player = new Players(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5),125 rs.getInt(6), rs.getString(7));126 int id = rs.getInt(1);127 String playID = rs.getString(2);128 String name = rs.getString(3);129 String team = rs.getString(4);130 String city = rs.getString(5);131 int maxScore = rs.getInt(6);132 String draftYear = rs.getString(7);133

134 System.out.println("ID:" +id);135 System.out.println("playID:" +playID);136 System.out.println("名字:" +name);137 System.out.println("球隊:" +team);138 System.out.println("城市:" +city);139 System.out.println("個人單場最高分:" +maxScore);140 System.out.println("選秀年:" +draftYear);141

142 }143 } catch(ClassNotFoundException e) {144 //TODO Auto-generated catch block

145 e.printStackTrace();146 } catch(IOException e) {147 //TODO Auto-generated catch block

148 e.printStackTrace();149 } catch(SQLException e) {150 //TODO Auto-generated catch block

151 e.printStackTrace();152 } finally{153 JDBCUtils.closeSource(rs, statement, conn);154 }155 //System.out.println(sql);

156 returnplayer;157 }158

159 //從控制臺讀入一個整數,返回1,用球員ID 查詢,2,用姓名查詢,其他的無效并提示讓用戶重新輸入

160 private static intgetTypeFromConsole() {161 //TODO Auto-generated method stub162 //1 根據提示讓用戶輸入查詢類型,返回1,用球員ID 查詢,2,用姓名查詢

163 System.out.println("請輸入查詢類型:1.使用球員ID查詢,2.使用姓名查詢");164 Scanner input = newScanner(System.in);165 int type =input.nextInt();166 //判斷

167 if (type != 1 && type != 2) {168 System.out.println("輸入不合法,請重新輸入....");169 throw new RuntimeException(); //中斷程序

170

171 }172 returntype;173 }174

175 }

=================================================================================================================================================================

JDBCUtils.java的源代碼文件:

1 packagecom.jdbc.basedemo;2

3 importjava.io.IOException;4 importjava.io.InputStream;5 importjava.sql.Connection;6 importjava.sql.DriverManager;7 importjava.sql.PreparedStatement;8 importjava.sql.ResultSet;9 importjava.sql.SQLException;10 importjava.sql.Statement;11 importjava.util.Properties;12

13 /*

14 * 操作數據庫的公共類,里面是一些公共方法15 **/

16 public classJDBCUtils {17 //獲取數據庫連接18 //連接數據庫

19

20 public static Connection getConnection() throwsClassNotFoundException, IOException, SQLException {21 //定義相關變量

22 String driverClass = null;23 String jdbcUrl = null;24 String user = null;25 String password = null;26

27 //讀取配置文件jdbc.properties

28 InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");29

30 Properties properties = newProperties();31 properties.load(in);32 driverClass = properties.getProperty("driver");33 jdbcUrl = properties.getProperty("jdbcUrl");34 user = properties.getProperty("user");35 password = properties.getProperty("password");36 //加載數據庫驅動

37 Class.forName(driverClass);38 //獲取連接

39 Connection conn =DriverManager.getConnection(jdbcUrl, user, password);40 returnconn;41 }42

43 //釋放資源的方法

44 public static voidcloseSource(ResultSet rs, Statement statement, Connection conn) {45 if (rs != null) {46 try{47 rs.close();48 } catch(Exception e) {49 //TODO: handle exception

50 e.printStackTrace();51 }52 }53 if (statement != null) {54 try{55 statement.close();56 } catch(Exception e) {57 //TODO: handle exception

58 e.printStackTrace();59 }60 }61 if (conn != null) {62 try{63 conn.close();64 } catch(Exception e) {65 //TODO: handle exception

66 e.printStackTrace();67 }68 }69 }70

71 //封裝一個通用的更新方法,適用于INSERT,UPDATE,DELETE

72 public static voidupdateData(String sql) {73 //獲取連接

74 Connection conn = null;75 Statement statement = null;76 ResultSet rs = null;77 try{78 conn = JDBCUtils.getConnection();//獲得連接

79 statement = conn.createStatement(); //創建statement對象

80 statement.executeUpdate(sql);81 //System.out.println(sql);

82 System.out.println("SQL執行成功");83 } catch(ClassNotFoundException e) {84 //TODO Auto-generated catch block

85 e.printStackTrace();86 } catch(IOException e) {87 //TODO Auto-generated catch block

88 e.printStackTrace();89 } catch(SQLException e) {90 //TODO Auto-generated catch block

91 e.printStackTrace();92 } finally{93 JDBCUtils.closeSource(rs, statement, conn);94 System.out.println("資源關閉成功");95 }96

97 }98 //使用preparedStatement對象進行更新

99

100 public static voidupdateDataUsePS(String sql, Object... args) {101 //獲取連接

102 Connection conn = null;103 PreparedStatement ps = null;104 ResultSet rs = null;105 try{106 conn = JDBCUtils.getConnection();//獲得連接

107 ps = conn.prepareStatement(sql); //創建statement對象108 //獲取可變參數的值

109 for (int i = 0; i < args.length; i++) {110 ps.setObject(i + 1, args[i]);111 }112 ps.executeUpdate();113 //System.out.println(sql);

114 System.out.println("SQL執行成功");115 } catch(ClassNotFoundException e) {116 //TODO Auto-generated catch block

117 e.printStackTrace();118 } catch(IOException e) {119 //TODO Auto-generated catch block

120 e.printStackTrace();121 } catch(SQLException e) {122 //TODO Auto-generated catch block

123 e.printStackTrace();124 } finally{125 JDBCUtils.closeSource(null, ps, conn);126 System.out.println("資源關閉成功");127 }128

129 }130 }

總結

以上是生活随笔為你收集整理的java中jdbc的封装笔记_JDBC封装学习笔记(三)---面向对象的JDBC,使用preparedStatement...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。