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;
    }
}
复制代码
工具类只要求会使用即可,不要求记忆书写,但是需要掌握迭代思路
相关推荐
QuZero2 分钟前
JDK7 ConcurrentHashMap principle
java·哈希算法
2301_8145902514 分钟前
Python深度学习入门:TensorFlow 2.0/Keras实战
jvm·数据库·python
独断万古他化19 分钟前
【Java 实战项目】多用户网页版聊天室:消息传输模块 —— 基于 WebSocket 实现实时通信
java·spring boot·后端·websocket·ajax·mybatis
VALENIAN瓦伦尼安教学设备24 分钟前
设备对中不良的危害
数据库·嵌入式硬件·算法
yyt36304584126 分钟前
spring单例bean线程安全问题讨论
java·spring
小兔崽子去哪了36 分钟前
Docker 安装 PostgreSQL
数据库·后端·postgresql
野犬寒鸦40 分钟前
Redis热点key问题解析与实战解决方案(附大厂实际方案讲解)
服务器·数据库·redis·后端·缓存·bootstrap
我是大猴子1 小时前
事务失效的几种情况以及是为什么(详解)
java·开发语言
mldlds1 小时前
Windows安装Redis图文教程
数据库·windows·redis
wertyuytrewm1 小时前
Java面试——Java基础
java·jvm·面试