jdbc的简单封装(使用properties文件)

在前面两篇博客preparedstatement简单操作statement简单操作中,我们会发现很明显的一个问题就是,jdbc的Driver,connection的url,mysql的username和password具体的值都写在了java文件之中,这样子是不利于我们维护的,比如说,我们做项目的时候是使用本地的数据库进行测试,当我们项目做完了,交接的时候自然要用客户自己的数据库,难道要让客户深入到代码去修改上面的值吗….

最好的做法是将这些需要更改的东西写进一个配置文件之中…这样客户自己去修改配置文件就可以的…无需对我们写的代码伤筋动骨的….

我把上述的值都写进了一个叫jdbc.properties的文件之中(.properties文件是配置文件哦)…
文件的内容如下:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useSSL=true
jdbc.username=root
jdbc.password=scott

写了这个配置文件之后,我写了一个工具类来获取这些值,和封装了的带connection和关闭流的方法,
工具类的具体内容如下:

package JDBCUtils;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

public class JDBCUtils {

    private static Properties p = new Properties();

    static{
        try {
            InputStream is = Thread.currentThread().
                    getContextClassLoader().getResourceAsStream("jdbc.properties");
            p.load(is);
            Class.forName(p.getProperty("jdbc.driverClassName"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection(){
        try {
            return DriverManager.getConnection(p.getProperty("jdbc.url"),
            p.getProperty("jdbc.username"),p.getProperty("jdbc.password"));
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static void close(Connection conn , PreparedStatement ps , ResultSet rs ){
        if(conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }finally{
                if(ps != null){
                    try {
                        ps.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }finally{
                        if(rs != null){
                            try {
                                rs.close();
                            } catch (SQLException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }
    }
}

下面是重头戏:
在前面两篇博客之中,我们都要很幸苦的一个一个的给preparedstatement的占位符设置值..
我们就将这些东西封装好,以后就不用反复设置了…

我们对数据库的操作有四种,增删查改,而粗略的分,只有两种,就是更新(此处是只对数据库的更新)和查找,所以我封装了query和update两个方法
下面是代码:

package JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class JDBC_Functions {
    //DML操作....
    public static Integer update(String sql , Object...params){
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = JDBCUtils.getConnection();
            ps = conn.prepareStatement(sql);
            if(params != null){
                for(int i = 0 ; i<params.length ; i++){
                    ps.setObject(i+1, params[i]);
                }
            }
            ps.execute();
            return 1;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }finally{
            JDBCUtils.close(conn, ps, null);
        }
    }

    //DDL操作....
    public static <T> T query(String sql , IResultSetHandler<T> rsh,Object...params){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = JDBCUtils.getConnection();
            ps = conn.prepareStatement(sql);
            if( params != null){
                for(int i = 0 ; i < params.length ; i++ ){
                    ps.setObject(i+1, params[i]);
                }
            }
            rs = ps.executeQuery();
            return (T) rsh.handler(rs);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }finally{
            JDBCUtils.close(conn, ps, rs);
        }
    }
}

通过上面的代码,你会发现,每次进行数据库操作的时候,只需要将sql语句和占位符?的值传进封装好的query或者update方法里面就大功告成了….那我们的dao层方法只需要几行代码就可以了…..

看到这里,你可能会问,query的第二个参数IResultSetHandler rsh是什么东西呢….
因为我每次将数据从数据库里取出来,都会把它们转化成java的对象,之前通过ResultSet做循环取值和设值来转化,如果在query方法里面来完成这个转化,那这个query方法就不是通用的了…

因为有些类具有不一样的字段,用一个方法就完成不同类的转化,这不太可能…所以我写了一个接口,里面有一个负责完成从数据库数据转化成java对象的方法…..

接口具体代码如下:

package JDBCUtils;

import java.sql.ResultSet;

public interface IResultSetHandler<T> {
    T handler(ResultSet rs);
}

所以每有一个类需要这种转化,我们都需要实现这个接口,实现这个方法,将具体的转化过程写在这个实现的方法里面…这也是接口的意义所在(制定一套规范,在后面实现….)

好了,下面我用User类做师范,实现一下对User的增删查改,
User的代码如下:

package Pojo;

public class User {
    private Integer id;
    private String username;
    private String password;
------------------------------
    getter和setter方法
------------------------------

    public User(Integer id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public User() {
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", password=" + password + "]\n";
    }
}

首先要实现一个IResultSetHandler的接口,代码如下….

package JDBCUtils;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import Pojo.User;

public class UserResultSetHandler implements IResultSetHandler<List<User>>{

    public List<User> handler(ResultSet rs) {
        List<User> userList = new ArrayList<User>();
        try {
            while(rs.next()){
                int id = rs.getInt("ID");
                String username = rs.getString("USERNAME");
                String password = rs.getString ("PASSWORD");
                User u = new User(id,username,password);
                userList.add(u);
            }
            return userList;
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }

}

实现接口之后,我们写一个UserDao,封装对User进行增删查改的四个方法…..
代码如下:

package Dao;

import java.util.List;

import JDBCUtils.JDBC_Functions;
import JDBCUtils.UserResultSetHandler;
import Pojo.User;

public class UserDao {
    public void findUsers(){
        String sql = "SELECT * FROM USER";
        List<User> userList = JDBC_Functions.query(sql, new UserResultSetHandler());
        System.out.println(userList);
    }

    public void deleteUser(int id){
        String sql = "DELETE FROM USER WHERE ID = ?";
        JDBC_Functions.update(sql, id);
        System.out.println("删除成功.....");
    }

    public void addUser(User u){
        String sql = "INSERT INTO USER(ID,USERNAME,PASSWORD) VALUES(?,?,?)";
        JDBC_Functions.update(sql, u.getId(),u.getUsername(),u.getPassword());
        System.out.println("添加成功....");
    }

    public void updateUser(User u ){
        String sql = "UPDATE USER SET USERNAME = ? ,PASSWORD = ? WHERE ID = ?";
        JDBC_Functions.update(sql, u.getUsername(),u.getPassword(),u.getId());
        System.out.println("更新成功....");
    }
}

下面是开始测试了:

package App;

import Dao.UserDao;
import Pojo.User;

public class JDBCTest3 {
    public static void main(String[] args) {

        UserDao ud = new UserDao();

        System.out.println("------增加前--------");
        ud.findUsers();
        User u = new User(7,"white","9999999");
        ud.addUser(u);
        System.out.println("------增加后--------");
        ud.findUsers();

        System.out.println("\n");
        ud.deleteUser(7);
        System.out.println("------删除后--------");
        ud.findUsers();

        System.out.println("\n");
        u = new User(3,"UZI","666666");
        ud.updateUser(u);
        System.out.println("------更新后--------");
        ud.findUsers();
    }
}

结果如下:
结果

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值