首页 > 学院 > 开发设计 > 正文

数据库操作方法总结

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. }

    以上搞定了 业务逻辑层调用 数据访问层, 后面开始搞 表示层调用 业务逻辑层。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表