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;
    }
}
复制代码
工具类只要求会使用即可,不要求记忆书写,但是需要掌握迭代思路
相关推荐
AI你一生一世5 小时前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
云-缩影5 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
ss2736 小时前
为什么PostgreSQL适合AI场景?
数据库·人工智能·postgresql
瑞克-桑切斯6 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
z06.7 小时前
MySQL索引
数据库·mysql
考虑考虑7 小时前
Posrgresql恢复.backup文件
数据库·后端·postgresql
云祺vinchin7 小时前
中小企业备份软件选型从恢复需求到总体成本评估
数据库·数据备份·中小企业备份·容灾备份软件
Zenova EdgeOS7 小时前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
KKKlucifer7 小时前
国内数据安全服务的产品智能化转型:大模型赋能下的技术能力重构分析
大数据·数据库·重构
字节跳动开源8 小时前
OpenViking 上线原生 3D 内容理解模型
数据库·开源