01.JDBC的高级使用——ConnectionFactory

JDBC的高级使用——ConnectionFactory

ConnectionFactory:连接工厂

ConnectionFactory的作用

  • 利用工厂模式提升代码的重用性

  • 封装注册数据库的驱动和获得数据库的连接

  • 利用配置文件减少硬编码,便于维护

ConnectionFactory的开发

  • 配置文件jdbcinfo.properties

    该后缀类型的文件存储的是键值对数据,一行一个键值对,前面是键中间是等号后面是值,键和值和等号中间不要有空格

    • mysql.driver=com.mysql.jdbc.Driver
    • mysql.url=jdbc:mysql://localhost:3306/mydb?useSSL=true
    mysql.driver=com.mysql.jdbc.Driver
    mysql.url=jdbc:mysql://localhost:3306/bookstore?useSSL=true
    mysql.user=root
    mysql.password=123456
  • 配置文件信息的获取

    这里使用的是相对路径,把配置文件和连接工厂放在同一路径下,获取到的是一个输入流(InputStream)。

    • ConnectionFactory.class.getResourceAsStream(“jdbcinfo.properties”);
  • 数据库连接Connection的获得

    • public static Connection getConnection();

使用示例

jdbcinfo.properties

mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/learning?useSSL=true
mysql.user=root
mysql.password=123456

ConnectionFactory.java

package com.li.jdbc.advanced;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

import com.mysql.jdbc.ConnectionGroupManager;

public class ConnectionFactory {
    private static String DRIVER;
    private static String URL;
    private static String USER;
    private static String PASSWORD;

    /* 静态代码块,加载时只被执行一次 */
    static {
        /* Properties存储的是键值对的map */
        Properties props = new Properties();
        InputStream is = ConnectionFactory.class.getResourceAsStream("jdbcinfo.properties");

        try {
            /*读取流的信息,加载到类里面*/
            props.load(is);
            DRIVER=props.getProperty("mysql.driver");
            URL=props.getProperty("mysql.url");
            USER=props.getProperty("mysql.user");
            PASSWORD=props.getProperty("mysql.password");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() {
        Connection conn=null;
        try {
            Class.forName(DRIVER);
            conn=DriverManager.getConnection(URL, USER, PASSWORD);
        } catch (Exception e) {
        }
        return conn;
    }

    /*作为测试的main方法*/
    public static void main(String[] args) {
        System.out.println(ConnectionFactory.getConnection());
    }
}

DBUtils.java

package com.li.jdbc.advanced;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/*释放资源*/

public class DBUtils {
    public static void close(Connection conn) {
        if(conn!=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void close(Statement stmt) {
        if(stmt!=null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void close(ResultSet rs) {
        if(rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

Student.java(数据库实体类)

/*......*/

StudentJDBC.java

package com.li.jdbc.advanced;

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

import com.li.pojo.Student;

/*对数据库的CRUD操作*/

public class StudentJDBC {

    /* 插入 */
    public void save(Student stu) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        /* 通过连接工厂获取连接对象 */
        conn = ConnectionFactory.getConnection();

        try {
            String insertSQL = "insert into student values(?,?,?,?,?)";
            pstmt = conn.prepareStatement(insertSQL);
            pstmt.setInt(1, stu.getId());
            pstmt.setString(2, stu.getName());
            pstmt.setString(3, stu.getAddress());
            pstmt.setString(4, stu.getGender());
            pstmt.setInt(5, stu.getAge());

            int rows = pstmt.executeUpdate();
            System.out.println("成功插入记录:" + rows + "条");
        } catch (SQLException e) {
            e.printStackTrace();
            /* 如果操作出现问题,将事务回滚 */
            try {
                conn.rollback();
            } catch (SQLException e1) {
            }
        } finally {
            DBUtils.close(conn);
            DBUtils.close(pstmt);
            DBUtils.close(rs);
        }
    }

    /* 删除 */
    public void delete(Integer id) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        /* 通过连接工厂获取连接对象 */
        conn = ConnectionFactory.getConnection();

        try {
            String insertSQL = "delete from student where id=?";
            pstmt = conn.prepareStatement(insertSQL);
            pstmt.setInt(1, id);
            int rows = pstmt.executeUpdate();
            System.out.println("成功删除记录:" + rows + "条");
        } catch (SQLException e) {
            e.printStackTrace();
            /* 如果操作出现问题,将事务回滚 */
            try {
                conn.rollback();
            } catch (SQLException e1) {
            }
        } finally {
            DBUtils.close(conn);
            DBUtils.close(pstmt);
        }
    }

    /* 更新 */
    /* 查找单个 */
    /* 查找所有,返回List集合,List */
}

你可能感兴趣的:(数据库,Java)