JDBC总结——JDBC工具类


JDBC工具类

一、JDBC工具类概述

1、定义JDBC工具类的目的

每次使用JDBC的时候都要书写冗长的代码段,不符合复用的理念,于是要单独写一个类,将通用的JDBC操作写到一个类中,便于重复使用和精简代码。

2、封装的操作

	 1)properties配置文件 封装获取链接 释放资源提高代码复用性

	 2)类加载时加载驱动

	 3)ThreadLocal 控制事务

	 4)连接池 提高资源利用率

	 5)rowmapper封装 减少代码冗余

	 6)template封装 减少dao层代码冗余

二、JDBC工具类的封装

1、dbcp.properties

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybase?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
username=root
password=123
initialSize=10
maxActive=50
maxIdle=20
minIdle=5
maxWait=60000
connectionProperties=useUnicode=true;characterEncoding=utf-8
defaultAutoCommit=true
defaultTransactionIsolation=READ_COMMITTED

2、JdbcUtil3.java

import java.io.*;
import java.sql.*;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;
/**
 * 类说明:
 * 	用于加载驱动获取链接,然后返回结果集
 */
public class JdbcUtil3 {
	//声明连接池
	static DataSource pool = null;
	//创建properties
	static Properties pro = new Properties();
	//创建ThreadLocal<Connection>,可以为同一个线程保存同一个连接,为不同的线程保存不同的连接。
	private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
	//加载驱动
	static{
		InputStream is = null;
		try{
			is = JdbcUtil1.class.getResourceAsStream("/conf/dbcp.properties");
			//加载文件
			pro.load(is);
			//Class.froName(pro.getProperty("driverClassName"));
			//创建连接池
			pool = BasicDataSourceFactory.createDataSource(pro);
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try {
				is.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	//获取链接
	public static Connection getConnection() throws Exception{
		Connection conn = tl.get();
		if(conn==null){
			String url = pro.getProperty("url");
			String user = pro.getProperty("username");
			String password = pro.getProperty("password");
			//从连接池中获取链接
			//conn = DriverManager.getConnection(url, user, password);
			conn = pool.getConnection();
			//将链接保存到当前线程
			tl.set(conn);
		}
		return conn;
	}
																							
	//释放资源/关闭链接
	public static void release(ResultSet rs,PreparedStatement pstm,Connection conn) throws Exception{
		if(rs!=null){
			rs.close();
		}
		if(pstm!=null){
			pstm.close();
		}
		if(conn!=null){
			conn.close();
			tl.remove();	//将链接从当前线程移除
		}
	}
}

3、JdbcTemplate.java

import java.sql.*;
import java.util.*;

import rowmapper.RowMapper;
/**
 * 类说明:
 * 	用于封装增删查改操作
 */
public class JdbcTemplate<T> {
	
	static Connection conn = null;
	static PreparedStatement pstm = null;
	static ResultSet rs = null;
	
	/*
	 * 查询方法
	 * 查询结果1条T queryForObject(sql,object..args,RowMapper rm)
	 * 查询结果多条List<T> queryForList(sql,object...args,RowMapper rm);
	 */
	
	public T queryForObject(String sql,RowMapper<T> rm,Object...args){
		T t = null;
		try {
			conn = JdbcUtil3.getConnection();
			pstm = conn.prepareStatement(sql);
			if(args.length!=0){
				for(int i=0;i<args.length;i++){
					pstm.setObject(i+1, args[i]);
				}
			}
			rs = pstm.executeQuery();
			if(rs.next()){
				t = rm.mappreRow(rs);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println("数据库链接出现问题");
		}finally{
			try {
				JdbcUtil3.release(rs, pstm, conn);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				System.out.println("释放资源出现问题");
			}
		}
		return t;
	}
	
	//查询多条
	public List<T> queryForList(String sql, RowMapper<T> rm, Object...args){
		List<T>  list = null;
		try {
			conn = JdbcUtil3.getConnection();
			pstm = conn.prepareStatement(sql);
			if(args.length!=0){
				for(int i=0;i<args.length;i++){
					pstm.setObject(i+1, args[i]);
				}
			}
			rs = pstm.executeQuery();
			list = new ArrayList();
			while(rs.next()){
				T t = rm.mappreRow(rs);
				list.add(t);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println("数据库链接出现问题");
		}finally{
			try {
				JdbcUtil3.release(rs, pstm, conn);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				System.out.println("释放资源出现问题");
			}
		}
		return list;	
	}
	
	
	/* 
	 * 操作方法
	 * void update(sql, object...args)
	 */
	
	//更改操作
	public void update(String sql,Object...args){
		try {
			conn = JdbcUtil3.getConnection();
			System.out.println("template:"+conn);
			pstm = conn.prepareStatement(sql);
			//args的长度如果不是0,说明有参数,有参数就说明sql是个半成品
			if(args.length!=0){
				for(int i=0;i<args.length;i++){
					pstm.setObject(i+1, args[i]);
				}
			}
			pstm.executeUpdate();
		} catch (Exception e) {
			System.out.println("数据库发生异常");
		}finally{
			try{
				JdbcUtil3.release(null, pstm, conn);
			} catch (Exception e){
				System.out.println("释放资源出现问题");
			}
		}
	}
}
发布了22 篇原创文章 · 获赞 14 · 访问量 1172

猜你喜欢

转载自blog.csdn.net/weixin_44157233/article/details/104331091
今日推荐