互联网技术IT交流圈

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

2019-01-19  本文已影响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连接池

上一篇下一篇

猜你喜欢

热点阅读