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

来源:互联网 发布:sql授权语句 revoke 编辑:程序博客网 时间:2024/06/06 19:39

话说
在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测试,想测试哪个就测试哪个。


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

原创粉丝点击