问题分析:
现有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;
}
}
工具类只要求会使用即可,不要求记忆书写,但是需要掌握迭代思路