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;
    }
}
复制代码
工具类只要求会使用即可,不要求记忆书写,但是需要掌握迭代思路
相关推荐
曳渔16 分钟前
Java-数据结构-二叉树-习题(三)  ̄へ ̄
java·开发语言·数据结构·算法·链表
大王只是带我巡了个山18 分钟前
优化 OR 条件过多导致的查询超时
数据库·mysql·join·or 优化·or 超时·查询超时
shark-chili27 分钟前
数据结构与算法-Trie树添加与搜索
java·数据结构·算法·leetcode
白乐天_n29 分钟前
FRIDA-JSAPI:Java使用
java·jsapi·frida
无奇不有 不置可否40 分钟前
JVM基础篇学习笔记
java·jvm
gma9991 小时前
MySQL程序
数据库·mysql
神秘的土鸡1 小时前
Linux中Docker容器构建MariaDB数据库教程
linux·运维·服务器·数据库·docker·mariadb
汪公子4921 小时前
使用k8s搭建mariadb+nginx+wordpress
数据库·nginx·mariadb
Java__攻城狮1 小时前
navicat无法连接远程mysql数据库1130报错的解决方法
数据库·mysql
爬山算法1 小时前
Oracle(129) 如何使用闪回归档(Flashback Archive)?
数据库·oracle