黑马程序员技术交流社区

标题: JDBCUtils封装方法详解。 [打印本页]

作者: 15736709271    时间: 2016-8-27 22:15
标题: JDBCUtils封装方法详解。
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,是操作数据库的规范。我在写代码时使用的是mysql。
那么在开始介绍方法之前呢,首先,我们要有一个数据库,以及连接数据库的驱动,相信这些大家都已经掌握了,那么接下来就给大家介绍一下本人封装JDBCUtils的方法。
配置文件:在项目src文件夹下新建.properties结尾的配置文件,并写入以下内容
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/reflect
user=root
password=026457
这里driver指的是数据库驱动类的路径,在你导入mysql-connector-java-5.1.37-bin的jar包之后,在这个包中相应的路径下(com.mysql.jdbc)可以找到Driver这个类。url代表的是你的数据库,前面jdbc:mysql://的格式是固定的,localhost指的是数据库所在计算机的IP地址,3306是数据库采用的接口(数据库默认一般是3306,也有特殊情况。),后面的reflect是数据库名,我mysql数据库里面有一个叫做reflect的数据库,这里需要改成你需要连接的数据库名。user是你安装数据库时使用的用户名,默认的是root,安装时是没有修改的。password是连接数据库的密码。
JDBCUtils类代码:
[AppleScript] 纯文本查看 复制代码
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtils {
       
        private static String driver;                //数据库驱动,在配置文件中读取。
        private static String url;                        //指向你自己的数据库。
        private static String user;                        //连接数据库的账号
        private static String password;                //连接数据库的密码
        private static Statement statement;        //用于接收sql语句执行平台
        private static Connection conn;                //用于接收数据库连接对象
        private static ResultSet rs;                //用于接收结果集

        static {
                //创建Properties对象
                Properties prop = new Properties();
                try {
                        //读取配置文件,获取配置信息。
                        prop.load(new BufferedReader(new FileReader("src/mysql.properties")));
                        driver = prop.getProperty("driver");
                        url = prop.getProperty("url");
                        user = prop.getProperty("user");
                        password = prop.getProperty("password");
                        //注册驱动
                        Class.forName(driver);
                } catch (FileNotFoundException e) {
                        System.out.println("找不到配置文件.");
                        e.printStackTrace();
                } catch (ClassNotFoundException e) {
                        System.out.println("找不到驱动.");
                        e.printStackTrace();
                } catch (IOException e) {
                        System.out.println("读取数据库配置文件错误");
                        e.printStackTrace();
                }
        }
       
       
        /**
         * 获取数据库连接
         * @return Connection连接对象
         */
        public static Connection getConnection() {
                try {
                        conn = DriverManager.getConnection(url, user, password);
                        return conn;
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                return null;
        }
       
       
        /**
         * 执行sql语句并返回结果集
         * @param sql 要执行的sql语句
         * @return ResultSet结果集
         */
        public static ResultSet executeQuery(String sql) {
                try {
                        statement = getConnection().createStatement();
                        rs = statement.executeQuery(sql);
                        return rs;
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                return null;
        }
       
       
        /**
         * 执行增、删、改sql语句
         * @param sql 要执行的sql语句
         * @return 数据库中受影响的行数
         */
        public static int executeUpdate(String sql) {
                try {
                        statement = getConnection().createStatement();
                        int count = statement.executeUpdate(sql);
                        return count;
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                return 0;
        }
       
       
        /**
         * 获取预编译对象
         * @param sql  预编译对象要编译的sql语句
         * @return PreparedStatement预编译对象
         */
        public static PreparedStatement getPreparedStatement(String sql) {
                try {
                        return getConnection().prepareStatement(sql);
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                return null;
        }
       
        /**
         * 关闭连接
         */
        public static void close() {
                if(rs!=null) {
                        try {
                                rs.close();
                        } catch (SQLException e) {
                                e.printStackTrace();
                        }
                        rs = null;
                }
                if(statement!=null) {
                        try {
                                statement.close();
                        } catch (SQLException e) {
                                e.printStackTrace();
                        }
                        statement = null;
                }
                if(conn!=null) {
                        try {
                                conn.close();
                        } catch (SQLException e) {
                                e.printStackTrace();
                        }
                        conn = null;
                }
        }
}

在这个JDBCUtils里面,我把注册驱动的动作封装到了静态代码块里面,不用每次获取数据库连接对象都要注册一遍,封装了getConnection()、executeQuery(String sql)、executeUpdate(String sql)、getPreparedStatement(String sql)和close()5个方法,其中getConnection()返回的是数据库连接对象,方便我们获取数据库连接对象。executeQuery(String sql)在使用的时候可以自动获取数据库连接对象,并执行sql语句,返回结果集,我们只需要直接操作结果集就可以了。executeUpdate(String sql)跟executeQuery(String sql)方法区别就在于返回值类型不同,其他基本类似。getPreparedStatement(String sql)可以直接自动获取PreparedStatement预编译对象,并通过它自己的setXXX()方法完成sql语句的预编译,同时PreparedStatement还可以有效地处理sql注入的问题,提高了数据库的安全性。close()用于关闭结果集、sql语句执行平台和连接,在关闭的同时将它们的值赋值为null,方便下次调用。
以下是测试类代码(只测试了三个方法,其他方法读者可以自行测试):
[AppleScript] 纯文本查看 复制代码
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import cn.itcast.utils.JDBCUtils;

public class JDBCUtilsTest {

        public static void main(String[] args) throws SQLException {
               
                //JDBCUtils.executeQuery(String sql)测试
                String sql1 = "select * from table01;";
                ResultSet rs1 = JDBCUtils.executeQuery(sql1);
                while(rs1.next()) {
                        System.out.println(rs1.getObject(1));
                }
                JDBCUtils.close();
               
                //JDBCUtils.getPreparedStatement(String sql)测试
                String sql2 = "select * from table01 where id=?;";
                PreparedStatement ps = JDBCUtils.getPreparedStatement(sql2);
                ps.setInt(1, 1);
                ResultSet rs2 = ps.executeQuery();
                while(rs2.next()) {
                        System.out.println(rs2.getObject("name"));
                }
                JDBCUtils.close();
        }
}


以上便是本人封装的JDBCUtils工具了,希望可以帮到你们。

作者: 15736709271    时间: 2016-8-27 22:17
求加精。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2