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

本文介绍了通过封装公共操作如数据库连接获取与关闭等方法,实现对JavaWeb-JDBC代码的优化过程。通过创建BaseDaoV1类进行CURD操作的优化,并提供了具体的实现示例。

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


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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值