JDBC 封装(含新知识点)

JDBC的封装


    问题:


        在数据库操作方法中关于驱动加载和数据库连接对象的代码是重复的.
        会造成修改数据源特别麻烦.
    解决1:
        
            将jdbc参数在功能类中提取为全局变量
    问题2:


        如果使用解决方式1解决后,修改了数据源则必须重启程序.而开发过程中尽量要求,在不重启程序的情况下完成对
        代码的参数的修改.
    解决2:


        将jdbc参数存储到properties属性配置文件中,封装工具类进行获取.
    知识点:
        properties文件是专门用来存储属性配置的文件,格式要求必须是键值对,以=号隔开.一行一组键值对,并且不能使用分号结尾.
        可以使用Properties对象来进行读取该文件的内容.        
    使用:
        创建java工具类
        创建jdbc参数静态变量
        创建静态代码块(在类加载的时候就会编译
            创建properties对象
            获取properties文件流对象
            加载属性配置文件
            获取jdbc参数并赋值给静态变量
            加载驱动
        创建获取Connection对象的静态方法
        创建获取PreparedStatement对象的静态方法
        创建获取Statement对象的静态方法
        创建关闭资源静态方法
        创建增删改的封装方法--executeDML

分析: 为什么这种方案可以解决这个问题呢?原因就是当我们放在服务器上时,类是可以被多次加载的,而 所以我们将数据源字符放在properties文件中,以达到无需重启程序就可以实现数据源的更换。

注意:Java中的日期类型和数据库中的日期类型不同,它们之间要交互需要进行强制类型转换

格式:

(java.sql.date)Java日期对象;

示例代码:

注意:需要在src下声明存储了jdbc参数的properties文件(db.properties):
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=scott
password=oracle

public class JdbcUtil {
	private static String driver;
	private static String url;
	private static String username;
	private static String password;
	//静态代码块(在类加载的时候编译)
	static{
		//创建properties对象获取属性文件的内容
		Properties p=new Properties();
		//获取属性文件的读取流对象(会自动在bin文件夹下寻找文件)
		InputStream is=JdbcUtil.class.getResourceAsStream("/db.properties");
		try {
			//加载属性配置文件
			p.load(is);
			//获取jdbc参数
			driver=p.getProperty("driver");
			url=p.getProperty("url");
			username=p.getProperty("username");
			password=p.getProperty("password");
			//加载驱动
			Class.forName(driver);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	//获取Connection对象
	public static Connection getConnection(){
		Connection conn=null;
		try {
			 conn=DriverManager.getConnection(url, username, password);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conn;
		
	}
	
	//封装获取PreparedStatement对象
	public static PreparedStatement getPreparedStatement(String sql,Connection conn){
		
		PreparedStatement ps=null;
		try {
			ps =conn.prepareStatement(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return ps;
		
	}
	
	//封装获取Statement对象
	public static Statement getStatement(Connection conn){
		Statement stmt=null;
		try {
			stmt = conn.createStatement();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return stmt;
		
	}
	
	//关闭资源
	public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
		try {
			rs.close();
		} catch (Exception e) {
			
		}
		try {
			stmt.close();
		} catch (SQLException e) {
			
		}
		try {
			conn.close();
		} catch (SQLException e) {
			
		}
	}
	
	//封装DML(用到了不定参数)
	public static int executeDML(String sql,Object...objs){
		//创建连接对象
		Connection conn=getConnection();
		//创建sql命令对象
		PreparedStatement ps=JdbcUtil.getPreparedStatement(sql, conn);
		//给占位符赋值
			try {
				conn.setAutoCommit(false);
				for(int i=0;i<objs.length;i++){
					ps.setObject(i+1, objs[i]);
				}
				int i=ps.executeUpdate();
				conn.commit();
				return i;
			} catch (Exception e) {
					try {
						conn.rollback();
					} catch (SQLException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
			}finally{
				//关闭资源
				JdbcUtil.closeAll(null, ps, conn);
			}
			//返回结果
			return -1;
	}
}


 

猜你喜欢

转载自blog.csdn.net/mengxianglong123/article/details/89160132
今日推荐