国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

數據庫操作方法總結

2019-11-14 22:33:42
字體:
來源:轉載
供稿:網友
數據庫操作方法總結

解決辦法:

端口號錯誤。

初學者可以這么搞,堅持半年,效果顯著。

  1. 釋放資源的時候

    我們需要從外往里面依次釋放,與你聲明的時候相反。就像人們穿衣服一樣,然后脫衣服,效果類似。

  2. 有些sql語句沒有參數,怎么辦

    遍歷數組,需要判斷,有些語句不需要賦值。所以需要先判斷是否需要賦值,所以先判斷是否為空。

    參考資料:http://zhidao.baidu.com/link?url=wT5zIOjpPQzE3pfAjPC-DZAlnEAO89O2ihgLT8SpFCKaXtktcBELHO5iRKeasUkMF8Wt0W__nhdMjK6-3i4-J_

  3. 分層

    系統架構的解耦,主要是為了今后的擴展。因為 今天的項目 需求變更多,項目大。

    表示層:jsf structs2.0 門窗

    框架: sPRing 骨骼

    持久層:hibernate

    層與層之間是松耦合的。

    三層:

    Web層 , service層, DAO層 表示層,服務層,數據訪問層

    Web層調用service層;服務層調用dao層。

    必須先有,才能調用。所以,編程從后往前。

    生產與使用分離。想象一下 主板與內存條的關系。

    無緣無故多搞出來一層,其目的是上面一層DAO層幾乎不怎么動,而service層只需調用即可。也就是說,我們多了一個interface層。

    訪問數據庫的工具在util中,我如何在impl中使用工具

    1. 實例化一個對象
    2. 繼承工具類,繼承過來就是我的,我就可以直接使用了。

錯誤:

你在程序中操作的長度大于在數據庫當中的長度

因為我在設計數據庫表的時候,sex的長度只有1,而我在程序里面賦值為男,為兩個字符。所以,長度不一致。

當然,還有其他一些錯誤:比如長度不一致,順序不一致。 ? 與 param必須嚴格一致。一個? 對應一個變量。一個參數,這樣才可以。

新聞欄目添加 、 修改、查詢()、刪除(新聞欄目下面有很多新聞內容,先刪除內容,再刪除欄目)

下面講講規范:

一般 我們開發分為幾層。DAO層 一般放接口

下面以UserInfo這張表為例,講講MVC金典操作。

  1. 首先建立實體類

    實體類的建立,依據數據庫表中的字段而來的。下面是這些數據庫表中的字段名。

    然后,通過eclipse 生成getter 和 setter 方法。程序如下面所示。

  1. package com.buu.news.day3.entity;
  2. public class UserInfo {
  3. private String userID;
  4. private String UserRealName;
  5. private String sex;
  6. private String birth;
  7. private String famillyaddress;
  8. private String email;
  9. private String tel;
  10. private String userLoginName;
  11. private String regDate;
  12. private String userPasWord;
  13. private String conform;
  14. private String flag;
  15. public String getUserID() {
  16. return userID;
  17. }
  18. public void setUserID(String userID) {
  19. this.userID = userID;
  20. }
  21. public String getUserRealName() {
  22. return UserRealName;
  23. }
  24. public void setUserRealName(String userRealName) {
  25. UserRealName = userRealName;
  26. }
  27. public String getSex() {
  28. return sex;
  29. }
  30. public void setSex(String sex) {
  31. this.sex = sex;
  32. }
  33. public String getBirth() {
  34. return birth;
  35. }
  36. public void setBirth(String birth) {
  37. this.birth = birth;
  38. }
  39. public String getFamillyaddress() {
  40. return famillyaddress;
  41. }
  42. public void setFamillyaddress(String famillyaddress) {
  43. this.famillyaddress = famillyaddress;
  44. }
  45. public String getEmail() {
  46. return email;
  47. }
  48. public void setEmail(String email) {
  49. this.email = email;
  50. }
  51. public String getTel() {
  52. return tel;
  53. }
  54. public void setTel(String tel) {
  55. this.tel = tel;
  56. }
  57. public String getUserLoginName() {
  58. return userLoginName;
  59. }
  60. public void setUserLoginName(String userLoginName) {
  61. this.userLoginName = userLoginName;
  62. }
  63. public String getRegDate() {
  64. return regDate;
  65. }
  66. public void setRegDate(String regDate) {
  67. this.regDate = regDate;
  68. }
  69. public String getUserPasword() {
  70. return userPasword;
  71. }
  72. public void setUserPasword(String userPasword) {
  73. this.userPasword = userPasword;
  74. }
  75. public String getConform() {
  76. return conform;
  77. }
  78. public void setConform(String conform) {
  79. this.conform = conform;
  80. }
  81. public String getFlag() {
  82. return flag;
  83. }
  84. public void setFlag(String flag) {
  85. this.flag = flag;
  86. }
  87. }
    1. 建立UserInfo這個表的接口層,定義一些個操作,我們稱之為用戶操作接口。主要完成 用戶登錄、刪除、修改、查詢和插入新的用戶等操作。

      操作如下:

  88. package com.buu.news.day3.dao;
  89. import java.sql.ResultSet;
  90. import com.buu.news.day3.entity.UserInfo;
  91. /*
  92. * 用戶操作接口
  93. * 1、登錄操作
  94. * 2、刪除操作
  95. * 3、修改操作
  96. * 4、查詢操作
  97. * 5、插入新的用戶操作
  98. */
  99. public interface UserDao {
  100. //需要先定義一個封裝用戶的實體類
  101. /*
  102. *1、 用戶登錄操作
  103. * 參數:用戶對象
  104. * 返回值:true :登錄成功
  105. * false:登錄失敗
  106. */
  107. public boolean userLogin(UserInfo user);
  108. /*
  109. *2、 刪除用戶操作
  110. * 參數:用戶對象
  111. * 返回值:int : 0:不成功
  112. * !0 :成功
  113. */
  114. public int userDelete(UserInfo user);
  115. /*
  116. *3、 用戶修改
  117. * 參數:用戶對象
  118. * 返回值:int : 0:不成功
  119. * !0 :成功
  120. */
  121. public int userUpdate(UserInfo user);
  122. /*
  123. *4、 用戶插入
  124. * 參數:用戶對象
  125. * 返回值:int : 0:不成功
  126. * !0 :成功
  127. */
  128. public int userInsert(UserInfo user);
  129. /*
  130. *5、 用戶查詢
  131. * 參數:用戶對象
  132. * 返回值:resultset集合
  133. *
  134. */
  135. public ResultSet userSelect(UserInfo user);
  136. }
    1. 建立UserServiceDao的接口層,此層與上面的代碼一樣。只是增加了一個接口而已。
    2. 建立UserDaoImpl ,此類是UserDao的實現類,實現UerDao接口。

      代碼如下:(里面有增刪改查)

  137. package com.buu.news.day3.dao.impl;
  138. import java.sql.ResultSet;
  139. import com.buu.news.day3.dao.UserDao;
  140. import com.buu.news.day3.entity.UserInfo;
  141. import com.buu.news.day3.util.ConnDB;
  142. public class UserDaoImpl extends ConnDB implements UserDao {
  143. //public ConnDB conn = new ConnDB();
  144. public int userDelete(UserInfo user) {
  145. // TODO Auto-generated method stub
  146. String sql = "delete from userInfo where userID = ?"; //占位符?
  147. String[] param = {user.getUserID()}; //調用方法必須傳數組
  148. int rtn = this.executeSQL(sql, param);
  149. if(rtn > 0)
  150. System.out.println("刪除成功");
  151. else
  152. System.out.println("刪除失敗");
  153. return rtn;
  154. }
  155. public int userInsert(UserInfo user) {
  156. // TODO Auto-generated method stub
  157. String sql = "insert into userInfo values(?,?,?,?,?,?,?,?,?,?,?)";
  158. String[] param = {user.getUserRealName(),user.getSex(),user.getBirth(),user.getFamillyaddress(),user.getEmail(),user.getTel(),user.getUserLoginName(),user.getRegDate(),user.getUserPasword(),user.getConform(),user.getFlag()};
  159. int rtn = this.executeSQL(sql, param);
  160. if(rtn > 0)
  161. System.out.println("插入成功");
  162. else
  163. System.out.println("插入失敗");
  164. return rtn;
  165. }
  166. public boolean userLogin(UserInfo user) {
  167. // TODO Auto-generated method stub
  168. return false;
  169. }
  170. public ResultSet userSelect(UserInfo user) {
  171. // TODO Auto-generated method stub
  172. String sql = "select * from userInfo where userID = ?";
  173. String[] param = {user.getUserID()};
  174. ResultSet rs = this.executeSelectSQL(sql,param);
  175. if(rs != null)
  176. System.out.println("查詢成功");
  177. else
  178. System.out.println("查詢失敗");
  179. return rs;
  180. }
  181. public int userUpdate(UserInfo user) {
  182. // TODO Auto-generated method stub
  183. String sql = "update userInfo set userRealName = ?,sex = ?,birth = ?,fimallyAddress = ?,Email=?";
  184. sql += ",Tel=?,userLoginName=?,regDate=?,userPassword=?,confirm1=?,flog=? where userID=?";
  185. String[] param = {user.getUserRealName(),user.getSex(),user.getBirth(),user.getFamillyaddress(),user.getEmail(),user.getTel(),user.getUserLoginName(),user.getRegDate(),user.getUserPasword(),user.getConform(),user.getFlag(),user.getUserID()};
  186. int rtn = this.executeSQL(sql, param);
  187. if(rtn > 0)
  188. System.out.println("更新成功");
  189. else
  190. System.out.println("更新失敗");
  191. return rtn;
  192. }
  193. }

    其中,有幾個關鍵的地方,需要提一下

    關鍵地方一:this.executeSelectSQL(sql,param); 和 this.executeSQL(sql, param); 這兩句是增刪改 與 查 分家的地方。我們可以定義工具類來實現頂層操作。

    這些頂層操作是工具,是可以重復利用的代碼邏輯。

    關鍵地方二:為啥用this,其實這里面我們完全可以用類的實例化,然后再調用對象.方法來實現,這里卻用到了上面的形式。我們在實現此接口的同事,還可以

    繼承工具類,這樣的話,我們就可以不用實例化了,這樣的話,代碼量可以進一步減少。健壯性又有所提高。

    1. 工具類 ConnDB

      代碼如下:

  194. package com.buu.news.day3.util;
  195. import java.sql.Connection;
  196. import java.sql.DriverManager;
  197. import java.sql.PreparedStatement;
  198. import java.sql.ResultSet;
  199. import java.sql.SQLException;
  200. import java.sql.Statement;
  201. /*
  202. * 數據庫基本操作
  203. * 1、獲取連接對象
  204. * 2、釋放相關資源
  205. * 3、數據庫增刪改查
  206. */
  207. public class ConnDB {
  208. //定義數據連接字符串,訪問數據庫用戶名和密碼
  209. public final static String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
  210. public final static String url = "jdbc:sqlserver://localhost:1433;DataBaseName=NewsSystem";
  211. public final static String dbName = "sa";
  212. public final static String dbPa = "123456";
  213. /*1、獲取數據庫連接對象
  214. * 返回值:connection對象
  215. */
  216. public Connection getConn()
  217. {
  218. Connection conn = null;
  219. try {
  220. Class.forName(driver);
  221. conn = DriverManager.getConnection(url, dbName, dbPa);
  222. System.out.println("數據庫連接成功");//提示的
  223. } catch (Exception e) { //為了使拋出的異常減少,拋出ClassNotFound的父類即可
  224. // TODO Auto-generated catch block
  225. e.printStackTrace();
  226. }//必須要有異常處理,增加程序的健壯性
  227. return conn;
  228. }
  229. /*釋放連接數據庫的所有資源
  230. * 資源包括:連接對象connection,statement對象,preparement對象,resultset對象
  231. */
  232. public void closeAll(Connection conn, Statement stmt, PreparedStatement pstmt, ResultSet rs)
  233. {
  234. try {
  235. if(rs!=null)
  236. rs.close();
  237. if(pstmt!=null)
  238. pstmt.close();
  239. if(stmt!=null)
  240. stmt.close();
  241. if(conn!=null)
  242. conn.close();
  243. } catch (SQLException e) {
  244. // TODO Auto-generated catch block
  245. e.printStackTrace();
  246. }
  247. }
  248. /*
  249. * 執行更新操作:插入、修改、刪除(會有成功和失敗)
  250. * 參數:sql語句; param:sql賦值參數
  251. * 返回值:int類型。sql語句對數據庫影響的行數
  252. * 0:含義:插入、修改、刪除失敗
  253. */
  254. public int executeSQL(String sql, String[] param)
  255. {
  256. Connection conn = null;
  257. PreparedStatement pstmt = null;
  258. int rtn = 0;
  259. //處理sql語句,執行sql語句
  260. conn = this.getConn();// 里面已經有鏈接了
  261. try {
  262. pstmt = conn.prepareStatement(sql);//sql語句只有一條,但賦的值不只一條,避免重復造輪子
  263. if(param != null)
  264. {
  265. for(int i = 0; i < param.length; ++i)
  266. {
  267. pstmt.setString(i+1, param[i]);//為預編譯的sql語句賦參數,語句下標從1開始。(數組里面的個數 就是 sql語句中占位符的個數,不過sql語句里面的下標從1開始,數組下標從0開始)
  268. }
  269. }
  270. //執行sql語句
  271. rtn = pstmt.executeUpdate(); //只有他返回int類型參數
  272. } catch (SQLException e) {
  273. // TODO Auto-generated catch block
  274. e.printStackTrace();
  275. }
  276. return rtn;
  277. }
  278. /*
  279. * 執行查詢操作
  280. * 參數:sql語句; param:sql賦值參數
  281. * 返回值:ResultSet類型
  282. *
  283. */
  284. public ResultSet executeSelectSQL(String sql, String[] param)
  285. {
  286. Connection conn = null;
  287. PreparedStatement pstmt = null;
  288. //處理sql語句,執行sql語句
  289. conn = this.getConn();// 里面已經有鏈接了
  290. ResultSet rtn = null;
  291. try {
  292. pstmt = conn.prepareStatement(sql);//sql語句只有一條,但賦的值不只一條,避免重復造輪子
  293. if(param != null)
  294. {
  295. for(int i = 0; i < param.length; ++i)
  296. {
  297. pstmt.setString(i+1, param[i]);//為預編譯的sql語句賦參數,語句下標從1開始。
  298. }
  299. }
  300. //執行sql語句
  301. rtn = pstmt.executeQuery(); //只有他返回int類型參數
  302. } catch (SQLException e) {
  303. // TODO Auto-generated catch block
  304. e.printStackTrace();
  305. }
  306. return rtn;
  307. }
  308. }
    1. 創建數據庫訪問接口 ,這里 為UserServiceDaoImpl ,是UserServiceDao接口類的實現。

      程序里面只是一個接口而已,先實例化,然后返回一些個值。

  309. package com.buu.news.day3.service.impl;
  310. import java.sql.ResultSet;
  311. import com.buu.news.day3.dao.UserDao;
  312. import com.buu.news.day3.dao.impl.UserDaoImpl;
  313. import com.buu.news.day3.entity.UserInfo;
  314. import com.buu.news.day3.service.UserServiceDao;
  315. public class UserServiceDaoImpl implements UserServiceDao {
  316. //創建數據庫訪問接口
  317. private UserDao userdao = new UserDaoImpl();
  318. public int userDelete(UserInfo user) {
  319. // TODO Auto-generated method stub
  320. int rtn = userdao.userDelete(user);
  321. return rtn;
  322. }
  323. public int userInsert(UserInfo user) {
  324. // TODO Auto-generated method stub
  325. int rtn = userdao.userInsert(user);
  326. return rtn;
  327. }
  328. public boolean userLogin(UserInfo user) {
  329. // TODO Auto-generated method stub
  330. boolean rtn = userdao.userLogin(user);
  331. return rtn;
  332. }
  333. public ResultSet userSelect(UserInfo user) {
  334. // TODO Auto-generated method stub
  335. ResultSet rs = userdao.userSelect(user);
  336. return rs;
  337. }
  338. public int userUpdate(UserInfo user) {
  339. // TODO Auto-generated method stub
  340. int rtn = userdao.userUpdate(user);
  341. return rtn;
  342. }
  343. }

    以上搞定了 業務邏輯層調用 數據訪問層, 后面開始搞 表示層調用 業務邏輯層。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 理塘县| 瑞丽市| 安溪县| 璧山县| 图片| 称多县| 华蓥市| 青州市| 昔阳县| 依兰县| 汕尾市| 八宿县| 宝鸡市| 巩留县| 南投县| 轮台县| 都匀市| 永川市| 大姚县| 菏泽市| 乌拉特前旗| 扬中市| 布拖县| 吉安县| 峨边| 若尔盖县| 冀州市| 英山县| 和田市| 涿州市| 方城县| 封丘县| 县级市| 玉门市| 蒙自县| 鲁山县| 大英县| 和龙市| 南靖县| 太仓市| 望江县|