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;
    }
}
复制代码
工具类只要求会使用即可,不要求记忆书写,但是需要掌握迭代思路
相关推荐
安当加密1 分钟前
TDE透明加密:精准管控数据库文件的读取、复制与权限,实现全方位版权保护
数据库·oracle
川石课堂软件测试1 分钟前
技术分享|JMeter接口与性能测试实战
数据库·功能测试·测试工具·jmeter·单元测试·postman·prometheus
2301_814809862 分钟前
C++如何验证YAML语法格式是否正确_try-catch解析校验用法【实战】.txt
jvm·数据库·python
人道领域3 分钟前
【LeetCode刷题日记】225.用队列实现栈--三招实现栈操作(多种思维)
java·开发语言·算法·leetcode·面试
zhangchaoxies3 分钟前
mysql如何开启慢查询日志_mysql性能监控环境配置
jvm·数据库·python
Mr_pyx4 分钟前
【告别for循环】Java Stream 流式编程精通:从入门到源码级的性能优化
java·开发语言·性能优化
tjc199010054 分钟前
Python数据分析如何识别异常值_IQR四分位距检测法实战
jvm·数据库·python
:1215 分钟前
java基础--数组
java·开发语言
2401_871696525 分钟前
CSS如何通过JS修改CSS变量_使用setProperty动态更新样式
jvm·数据库·python
吕源林7 分钟前
php怎么调用OPPO AI图像超分_php如何将低分辨率图放大不失真
jvm·数据库·python