研究JDBC使用的优化过程

JDBC最初始的使用

  • 配置文件书写参数
文件名:jdbc.properties     路径:IDEA中resources下
内容:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///travel
jdbc.username=root
jdbc.password=root
initialSize=5
maxActive=10
maxWait=3000
  • 提取utils
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JDBCUtils1 {
    private static String driver;
    private static String url;
    private static String username;
    private static String password;
    static {
        //读取资源文件,获取参数
        Properties pro = new Properties();
        //用类加载的方式,将文件转为输入流
        InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
        try {
            //加载文件
            pro.load(is);
            //给属性赋值
            driver = pro.getProperty("jdbc.driver");
            url=pro.getProperty("jdbc.url");
            username=pro.getProperty("jdbc.username");
            password=pro.getProperty("jdbc.password");
            //注册驱动
            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连接
     * @return
     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,username,password);
    }

    /**
     * 关闭资源,包含结果集
     */
    public static void close(ResultSet rs, Statement st,Connection conn) {
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(st!=null){
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 关闭资源,不包含结果集
     */
    public static void close(Statement st,Connection conn){
        close(null,st,conn);
    }
}
  • 测试方法
@Test
    public void test1(){
        Connection conn = null;
        PreparedStatement pstmt=null;
        ResultSet rs = null;
        User user = null;
        try {
            conn = JDBCUtils1.getConnection();
            String sql = "select * from tab_user where uid=?";
            //预编译sql语句
            pstmt = conn.prepareStatement(sql);
            //给占位符赋值
            pstmt.setInt(1,10);
            user = new User();
            //执行sql语句,获得结果集
            rs = pstmt.executeQuery();
            while(rs.next()){
                user.setName(rs.getString("username"));
                user.setUid(rs.getInt("uid"));
                user.setEmail(rs.getString("email"));
            }
            System.out.println(user);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils1.close(rs,pstmt,conn);
        }
    }

由于频繁的申请和释放数据库连接资源,影响数据库性能,所以引用数据库连接池技术

  • 配置文件书写参数
文件名:druid.properties     路径:IDEA中resources下
内容:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///travel
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000
  • 提取utils
import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class MyJDBCUtils {
    //数据库连接池对象(数据源)
    private static DataSource ds;

    static {

        InputStream is =  MyJDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
        Properties pro = new Properties();
        try {
            pro.load(is);
            //使用工厂方法,获取数据源
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    /**
     * 关闭方法
     * @param statement
     * @param conn
     */
    public static void close(Statement statement,Connection conn){
        close(null,statement,conn);
    }


    /**
     * 关闭连接方法
     * @param rs
     * @param statement
     * @param conn
     * @throws SQLException
     */
    public static void close(ResultSet rs,Statement statement,Connection conn) {
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 获取数据源
     */
    public static DataSource getDataSource(){
        return ds;
    }
}
  • 测试方法
/**
     * 由于频繁申请和关闭资源,影响数据库效率,所以改用连接池    使用druid连接池
     */
    @Test
    public void test2(){
        Connection conn = null;
        PreparedStatement pstmt=null;
        ResultSet rs = null;
        User user = null;
        try {
            conn = MyJDBCUtils.getConnection();
            String sql = "select * from tab_user where uid=?";
            pstmt = conn.prepareStatement(sql);
            user = new User();
            pstmt.setInt(1,10);
            rs=pstmt.executeQuery();
            while(rs.next()){
                user.setName(rs.getString("username"));
                user.setUid(rs.getInt("uid"));
                user.setEmail(rs.getString("email"));
            }
            System.out.println(user);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            MyJDBCUtils.close(rs,pstmt,conn);
        }
    }

我们会发现,在提取了工具类之后,dao层代码依旧繁重,其原因在于对结果集的封装处理过于繁琐,这里我使用spring的JdbcTemplate

  • 配置文件书写参数(同上一例子)
文件名:druid.properties     路径:IDEA中resources下
内容:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///travel
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000

提取utils(同上一例子)

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class MyJDBCUtils {
    //数据库连接池对象(数据源)
    private static DataSource ds;

    static {

        InputStream is =  MyJDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
        Properties pro = new Properties();
        try {
            pro.load(is);
            //使用工厂方法,获取数据源
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    /**
     * 关闭方法
     * @param statement
     * @param conn
     */
    public static void close(Statement statement,Connection conn){
        close(null,statement,conn);
    }


    /**
     * 关闭连接方法
     * @param rs
     * @param statement
     * @param conn
     * @throws SQLException
     */
    public static void close(ResultSet rs,Statement statement,Connection conn) {
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 获取数据源
     */
    public static DataSource getDataSource(){
        return ds;
    }
}
  • 测试方法
/**
     * 使用JDBCTemplete简化数据封装
     */
    @Test
    public void test3(){
        JdbcTemplate template = new JdbcTemplate(MyJDBCUtils.getDataSource());
        User user = null;
        try {
            String sql = "select * from tab_user where uid=?";
            user = template.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),10);
        }catch (Exception e){

        }
        System.out.println(user);
    }

猜你喜欢

转载自blog.csdn.net/weixin_38503726/article/details/86144484