JDBCUtil工具类

问题分析:

现有DAO代码存在大量冗余代码,可以使用XxxUtil工具类,将代码直接封装成static方法,在需要的时候直接调用。进而简化代码并提高维护性。

简化思路:

(一)JDBCUtils第一版

  • **JdbcUtils**版本1

    思路:将创建JdbcTemplate对象的代码封装在一个static方法中。

    package com.xx.util;
    ​
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.datasource.DriverManagerDataSource;
    ​
    import javax.sql.DataSource;
    ​
    /**
     * JDBC的工具类
     */
    public class JDBCUtils {
        /**
         * 获取一个JDBCTemplate对象
         * @return
         */
        public static JdbcTemplate getJDBCTemplate(){
            String url = "jdbc:mysql://localhost:3306/2304?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai";
            String username = "root";
            String password = "root";
            //创建数据库连接池
            DataSource dataSource=new DriverManagerDataSource(url,username,password);
            //创建JDBCTemplate
            JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
            return jdbcTemplate;
        }
    ​
    }
    

    问题:DataSource是一种可重复使用的重量级资源,如果每次创建新的,会浪费程序性能。

(二)JDBCUtils第二版

  • **JdbcUtils**版本2

    思路:将DataSource初始化代码放在static代码块中,仅在JdbcUtils类加载的时候执行一次。

    public class JDBCUtils2 {
        private static DataSource dataSource;
        static {
            //1 创建DataSource
            String url = "jdbc:mysql://localhost:3306/baizhi?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai";
            String username = "root";
            String password = "root";
            dataSource = new DriverManagerDataSource(url, username, password);
        }
        public static JdbcTemplate getJdbcTemplate() {
            //2 创建JdbcTemplate
            JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
            return jdbcTemplate;
        }
    }
    ​
    

    问题:JDBC连接MySQL的参数硬编码在java代码中,耦合太强,后期维护(开发环境切换为测试环境,最后上线服务修改生产环境)不方便。

(三)JDBCUtils第三版

  • **JdbcUtils**版本3

    思路:将JDBC连接MySQL参数转移到properties配置文件中。

    ① 编写jdbc.properties配置文件(src路径下)

    url=jdbc:mysql://localhost:3306/baizhi?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username=root
    password=root
    
    复制代码

    ② 编写JdbcUtils3

    package com.xx.util;
    ​
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.datasource.DriverManagerDataSource;
    ​
    import javax.sql.DataSource;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.util.Properties;
    ​
    /**
     * JDBC的工具类
     */
    public class JDBCUtils {
        //private:dataSource只在本类中使用,防止外界访问
        //static:方便初始代码块访问+静态属性只会存在一个
        private static DataSource dataSource=null;
    ​
    ​
        static{//静态初始代码块:只会在类加载的时候执行一次
            try(
                    FileInputStream fis=new FileInputStream("src/jdbc.properties")
                    ) {
                //创建Properties集合
                Properties p = new Properties();
                //读取配置文件内容至集合中
                p.load(fis);
                //从集合中读取相应值
                String url = p.getProperty("url");
                String username = p.getProperty("username");
                String password = p.getProperty("password");
                //创建数据库连接池
                dataSource=new DriverManagerDataSource(url,username,password);
    ​
            } catch (Exception e) {
                System.out.println("未知异常!");
                e.printStackTrace();
            }
    ​
        }
        /**
         * 获取一个JDBCTemplate对象
         * @return
         */
        public static JdbcTemplate getJDBCTemplate(){
            //创建JDBCTemplate
            JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
            return jdbcTemplate;
        }
    ​
    }
    ​
    

问题:配置文件的路径和项目结构绑定了,一旦更换项目环境代码将无法直接运行

(四)JDBCUtils第四版

思路:通过Class.getResourceAsStream获取流,路径只与包有关系,与项目结构无关

package com.xx.util;
​
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
​
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;
​
public class JDBCUtils {
    //static: 1.保证静态初始代码块和静态方法中可以访问 2. 确保该连接池在内存中只有一个
    private static DataSource dataSource =null;
​
    static{
        try (
               //将配置文件的路径与项目结构分离
            //将配置文件放置在src下
               InputStream is=JDBCUtils.class.getResourceAsStream("/JDBCUtils.properties")
                ){
            //创建集合
            Properties p = new Properties();
            //将配置文件内容加载进集合
            p.load(is);
            //创建数据库连接池
            dataSource = new DriverManagerDataSource(p.getProperty("url"), p.getProperty("username"), p.getProperty("password"));
​
        } catch (Exception e) {
            //将异常对象再次抛出,交由调用者处理
            throw new RuntimeException(e);
        }
    }
​
    /**
     * 创建并获取一个JDBCTemplate对象
     * static : 方便调用
     */
    public static JdbcTemplate getJDBCTemplate(){
        //创建JDBCTemplate对象并传入数据库连接池
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        return jdbcTemplate;
    }
}
复制代码
工具类只要求会使用即可,不要求记忆书写,但是需要掌握迭代思路
相关推荐
潇湘秦2 分钟前
一文了解Oracle数据库如何连接(1)
数据库·oracle
雅冰石2 分钟前
oracle怎样使用logmnr恢复误删除的数据
数据库·oracle
web前端神器3 分钟前
mongodb给不同的库设置不同的密码进行连接
数据库·mongodb
从以前4 分钟前
Berlandesk 注册系统算法实现与解析
数据库·oracle
Muko_0x7d26 分钟前
Mongodb
数据库·mongodb
Ren_xixi12 分钟前
redis和mysql的区别
数据库·redis·mysql
FF在路上33 分钟前
Knife4j调试实体类传参扁平化模式修改:default-flat-param-object: true
java·开发语言
真的很上进40 分钟前
如何借助 Babel+TS+ESLint 构建现代 JS 工程环境?
java·前端·javascript·css·react.js·vue·html
m0_7482338844 分钟前
SQL语句整理五-StarRocks
数据库·sql
州周1 小时前
Ftp目录整个下载
linux·服务器·数据库