美文网首页互联网技术IT交流圈
关于JAVA你必须知道的那些事(九):数据库连接利器JDBC介绍

关于JAVA你必须知道的那些事(九):数据库连接利器JDBC介绍

作者: 啃饼小白 | 来源:发表于2019-01-19 08:34 被阅读25次

    jdbc全称java database connectivity.是java程序与数据库连接的一种机制。

    jdbc的过程:
    1、搭建开发环境
    2、编写程序,在程序中加载数据库驱动
    3、建立连接
    4、创建用于向数据库发送sql语句的Statement对象
    5、从代表结果集的ResultSet中取出数据
    6、断开与数据库的链接,并释放相关的资源

    DriverManager:驱动管理类
    主要作用:
    1、注册驱动

        DriverManager.registerDriver(new Driver());   //会导致驱动注册两次
        Class.forName("com.test.jdbc.demo1.JdbcTest1");   //实际上使用这种方式
    

    2、获得连接
    Connection getConnection(String url,String username,String password);
    url的写法:jdbc:mysql://localhost:3306/jdbc
    jdbc:协议
    mysql:子协议
    localhost:主机号
    3306:端口号
    注意如果为本地ip地址,则可以简写为:jdbc:mysql:///jdbc

    jdbc工具类的书写

    package com.test.jdbc.utils;
    
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.*;
    import java.util.Properties;
    
    /****
     * JDBC的工具类
     * @author lenovo
     * */
    public class JdbcUtils {
        private static final String driverClass;
        private static final String url;
        private static final String username;
        private static final String password;
    
    //没有配置文件jdbc.properties时的代码
        static {
            driverClass = "com.mysql.jdbc.Driver";
            url = "jdbc:mysql://localhost:3306/jdbctest";
            username = "root";
            password = "root";
        }
    
    
        /**
         * 注册驱动的方法
         **/
        public static void loadDriver() throws ClassNotFoundException {
            Class.forName(driverClass);
        }
    
    
        /***
         *
         *获得连接的方法
         * */
        public static Connection getConnection() throws Exception {
            loadDriver();  //这里必须要调用上面的注册驱动方法
            Connection connection = DriverManager.getConnection(url, username, password);
            return connection;
        }
    
    
        /***
         *第一种资源方式释放Connection、Statement:适用于增加、删除、修改操作
         *
         * */
        public static void ReleaseSource(Connection connection, Statement statement) {
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                connection = null;
            }
    
    
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                statement = null;
            }
        }
    
        /***
         *第二种资源方式释放Connection、Statement、ResultSet:适用于查询操作
         *
         * */
        public static void ReleaseSource(Connection connection, Statement statement, ResultSet resultSet) {
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                connection = null;
            }
    
    
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                statement = null;
            }
    
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                resultSet = null;
            }
    
        }
    
    }
    
    

    下面是具有了jdbc.propreties属性的代码:

    package com.test.jdbc.utils;
    
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.*;
    import java.util.Properties;
    
    /****
     * JDBC的工具类
     * @author lenovo
     * */
    public class JdbcUtils {
        private static final String driverClass;
        private static final String url;
        private static final String username;
        private static final String password;
        
    
    
        //有配置文件jdbc.properties时的代码
        static {
            //加载属性文件并解析
            Properties props = new Properties();
            //如何获得属性文件的输入流?
            //通常情况下使用类的加载器的方式进行获取
            InputStream is = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
            try {
                props.load(is);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            driverClass =props.getProperty("driverClass");
            url =props.getProperty("url");
            username =props.getProperty("username");
            password =props.getProperty("password");
        }
    
        /**
         * 注册驱动的方法
         **/
        public static void loadDriver() throws ClassNotFoundException {
            Class.forName(driverClass);
        }
    
    
        /***
         *
         *获得连接的方法
         * */
        public static Connection getConnection() throws Exception {
            loadDriver();  //这里必须要调用上面的注册驱动方法
            Connection connection = DriverManager.getConnection(url, username, password);
            return connection;
        }
    
    
        /***
         *第一种资源方式释放Connection、Statement:适用于增加、删除、修改操作
         *
         * */
        public static void ReleaseSource(Connection connection, Statement statement) {
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                connection = null;
            }
    
    
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                statement = null;
            }
        }
    
        /***
         *第二种资源方式释放Connection、Statement、ResultSet:适用于查询操作
         *
         * */
        public static void ReleaseSource(Connection connection, Statement statement, ResultSet resultSet) {
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                connection = null;
            }
    
    
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                statement = null;
            }
    
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                resultSet = null;
            }
    
        }
    }
    
    

    其中jdbc.propreties文件里面的代码是:

    driverClass = com.mysql.jdbc.Driver
    url = jdbc:mysql://localhost:3306/jdbctest
    username = root
    password = root
    

    Statement的使用

    它的使用和我们后面所说的preparedStatement的使用有点不相同,而且我们优先后面的那种方式,因为不会产生sql注入的危险。

    preparedStatement的使用

    @Test
        /***
         * 保存数据到数据库,其实就是插入操作
         * */
        public void demo1() {
            Connection connection = null;
            PreparedStatement preparedStatement = null;
    
            try {
                //注册驱动和获取连接
                connection = JdbcUtils.getConnection();
                //创建sql语句
                String sql = "insert into user values(null,?,?,?)";
                //预处理sql语句
                preparedStatement = connection.prepareStatement(sql);
                //设置参数
                preparedStatement.setString(1, "xxx");
                preparedStatement.setString(2, "0000");
                preparedStatement.setString(3, "boyer");
                //执行sql语句
                int i = preparedStatement.executeUpdate();
                if (i > 0) {
                    System.out.println("数据插入成功");
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                JdbcUtils.ReleaseSource(connection, preparedStatement);
            }
        }
    

    在增删改查四个操作里面,我们先来简单连接四个过程的代码:

    //保存数据到数据库,其实就是插入操作
                //注册驱动和获取连接
                connection = JdbcUtils.getConnection();
                //创建sql语句
                String sql = "insert into user values(null,?,?,?)";
                //预处理sql语句
                preparedStatement = connection.prepareStatement(sql);
                //设置参数
                preparedStatement.setString(1, "xxx");
                preparedStatement.setString(2, "0000");
                preparedStatement.setString(3, "boyer");
                //执行sql语句
                int i = preparedStatement.executeUpdate();
                if (i > 0) {
                    System.out.println("数据插入成功");
                }
    
    
    //修改数据库中的数据
                 //注册驱动与获取连接
                connection = JdbcUtils.getConnection();
                //创建sql语句
                String sql = "update user set username =?,password =?,name=? where uid =?";
                //预处理sql语句
                preparedStatement = connection.prepareStatement(sql);
                //设置参数
                preparedStatement.setString(1, "eee");
                preparedStatement.setString(2, "555");
                preparedStatement.setString(3, "lichee");
                preparedStatement.setInt(4, 7);
                //执行sql语句
                int i = preparedStatement.executeUpdate();
                if (i > 0) {
                    System.out.println("数据修改成功!");
                }
    
    //删除数据库中的数据
    //注册驱动与获取连接
                connection =JdbcUtils.getConnection();
                //创建sql语句
                String sql ="delete from user where uid =?";
                //预处理sql
                preparedStatement =connection.prepareStatement(sql);
                //设置参数
                preparedStatement.setInt(1,6);
                //执行sql语句
                int i = preparedStatement.executeUpdate();
                if(i>0){
                    System.out.println("数据删除成功!");
                }
    
    
    //查询数据库中的全部数据
          //注册驱动和获取连接
                connection =JdbcUtils.getConnection();
                //创建sql语句
                String sql = "select * from user";
                //预处理sql语句
                preparedStatement = connection.prepareStatement(sql);
                //设置参数
               //执行sql语句
               resultSet = preparedStatement.executeQuery();
               while (resultSet.next()){
                   System.out.println("uid:"+resultSet.getInt("uid")+"\nusername:"+resultSet.getString("username")+"\npassword:"+resultSet.getString("password")+"\nname:"+resultSet.getString("name"));
               }
    
    
    //查询数据库中的一条数据
     //注册驱动和获取连接
                connection =JdbcUtils.getConnection();
                //创建sql语句
                String sql ="select * from user where uid =?";
                //预处理sql语句
                preparedStatement =connection.prepareStatement(sql);
                //设置参数
                preparedStatement.setInt(1,1);
                //执行sql语句
               resultSet = preparedStatement.executeQuery();
               //判断结果集中的数据
                while (resultSet.next()){
                    System.out.println("uid:"+resultSet.getInt("uid")+"\nusername:"+resultSet.getString("username")+"\npassword:"+resultSet.getString("password")+"\nname:"+resultSet.getString("name"));
                }
    
    

    也就是说增加,修改,删除都是使用executeUpdate函数,而且返回的是int类型的受影响的行数,然后我们就可以使用:

     int i = preparedStatement.executeUpdate();
                if(i>0){
                    System.out.println("数据删除成功!");
                }
    

    只有查询使用的是executeQuery函数,而且返回的是resultSet类型的结果集,然后使用:

    resultSet = preparedStatement.executeQuery();
               //判断结果集中的数据
                while (resultSet.next()){
                    System.out.println("uid:"+resultSet.getInt("uid")+"\nusername:"+resultSet.getString("username")+"\npassword:"+resultSet.getString("password")+"\nname:"+resultSet.getString("name"));
                }
    

    连接池

    连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。

    C3P0连接池

    相关文章

      网友评论

        本文标题:关于JAVA你必须知道的那些事(九):数据库连接利器JDBC介绍

        本文链接:https://www.haomeiwen.com/subject/ignaqqtx.html