JavaWeb-JDBC-2-不仅仅只是连接

xiaoxiao2021-02-28  124

话说 在JavaWeb-JDBC-1-不仅仅只是连接里面,我们做了CURD的操作,不过我们重复写了好多遍,就会想到如何去做优化,难道每次都这么写?这只能算是操作工,没有思想的操作工罢了。

今天,在上次基础上做优化。 先看下JavaWeb结构:

一、我们今天升级的第一个版本是daov1.

发现,在1里面,在加载驱动、获取连接、关闭资源方面,代码都相同,故而做个封装。封装成BaseDaoV1,代码如下:

package com.hmc.jdbc.daov1; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * @Author Meice * @Date 2017年8月5日 */ public class BaseDaoV1 { // 把加载驱动这部分放在静态语句块里,随着类的加载而加载 static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //把获取连接这一CURD都共有的操作封装成getConn()方法。 public Connection getConn() { Connection conn = null; String url = "jdbc:mysql://localhost:3306/news_db"; String user = "root"; String password = "119913"; try { conn = DriverManager.getConnection(url, user, password); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } // 定义关闭资源方法close() public void close(ResultSet rs, PreparedStatement ps, Connection conn) { try { if(rs != null) rs.close(); if(ps != null) ps.close(); if(conn != null) conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

总结:


1 重复性的的代码,就封装成方法,直接调用。如同我们给自己确定的一 些原则和底线一样,遇到类似的事情,我们直接选择,不用纠结。我会 固定买一些品牌的服装,买的时候直接买,很省事省力,选择是很费精 力的事情。 2 创建方法的时候,考虑好是否有返回值,方法修饰符以及是否带参。 3 我们有4中选择可以利用已有的方法 1)new这个类,调用方法; 2)设置为静态语句块,不用调兵遣将,直接随着类的加载而加载; 3)把这个方法也定义为静态的,不用new,直接调用。 4)extends这个类,也就继承了类的方法和属性(除private),用this调用。


二、测试版,测试CURD

package com.hmc.jdbc.daov1; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * @Author Meice * @Date 2017年8月5日 */ public class TestBaseDaoV1CURD extends BaseDaoV1{ //定义为全局变量,方便多个方法调用。 Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; // 1 测试Select public void select() { //调用BaseDaoV1封装好的getConn()方法获取连接 conn = this.getConn(); String sql = "select * from t_news"; // 预编译 try { ps = conn.prepareStatement(sql); rs = ps.executeQuery(); //遍历结果集 while(rs.next()) { //可以根据.getInt( int columnIndex)或者.getInt(String columnLabel)来获取集合中的具体值。 System.out.println(rs.getInt("id")+"--"+rs.getString("title")+rs.getString("author")); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { //调用关闭资源方法close() this.close(rs, ps, conn); } } //2 测试Insert public void add() { conn = this.getConn(); String sql = "insert into t_news (title,author) values (?,?)"; try { ps = conn.prepareStatement(sql); ps.setString(1, "我是V1版本新增的新闻1"); ps.setString(2, "admin3"); int result = ps.executeUpdate(); if(result>0) { System.out.println("恭喜你,增加新闻成功!"); }else { System.out.println("遗憾,增加新闻失败!"); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { /** * 这里要注意,我们executeUpdate()方法,是没有返回结果集ResultSet的。 * 所以用null来替代,如果没有就不关闭。 */ this.close(null, ps, conn); } } // 3 测试update public void update() { conn = this.getConn(); String sql = "update t_news set title = ?,author = ? where id = ? "; try { ps = conn.prepareStatement(sql); //这只参数。第一个参数代表第几个?,第二个参数代表值 ps.setString(1, "我是DaoV1修改后的新闻"); ps.setString(2, "admin5"); ps.setInt(3, 6); int result = ps.executeUpdate(); if(result>0) { System.out.println("DaoV1修改新闻成功!"); }else { System.out.println("遗憾,DaoV1修改新闻失败!"); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { this.close(null, ps, conn); } } //4 测试delete public void Del() { conn = this.getConn(); String sql = "delete from t_news where id = ?"; try { ps = conn.prepareStatement(sql); //注意设置参数的位置,应该在执行之前,预编译之后。如果在预编译之前,汇报NullPointException ps.setInt(1, 6); int result = ps.executeUpdate(); if(result>0) { System.out.println("DaoV1执行删除成功!可喜可贺!"); } else { System.out.println("DaoV1执行删除失败!再接再厉!"); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { this.close(null, ps, conn); } } public static void main(String[] args) { // new TestBaseDaoV1CURD().select(); // new TestBaseDaoV1CURD().add(); // new TestBaseDaoV1CURD().update(); new TestBaseDaoV1CURD().Del(); } }

总结 1 除了Select与众不同之外,发现还是写了大量重复性代码,如何继续优化? 2 优化insert update delete,怎么优化?看来只能在sql和传参上想办法了; 3 这里会发现main方法测试的一个弊端,我只想执行一个方法,但是main()总是不由分辨的从头执行到尾。所以得注释掉测试。因此,世界上就诞生了Junit测试,想测试哪个就测试哪个。


预知后事如何,请听下回分解。

转载请注明原文地址: https://www.6miu.com/read-24566.html

最新回复(0)