3.JDBC最终重构

一.DBCP连接池

DBCP连接池是Apache提供的,性能不错

  1. 导入三个包
commons-dbcp2-2.1.1.jar
commons-pool2-2.4.2.jar
commons-logging-1.2.jar

image

代码演示

DBCP工具类 DbcpUtil

//Dbcp连接池
public class DbcpUtil {
	//数据源
	private static DataSource  ds;
	//静态代码块
	static {
		InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
		Properties p = new Properties();
		try {
			p.load(in);
			ds = BasicDataSourceFactory.createDataSource(p);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	public static DataSource getDataSource(){
		return ds;
	}
	public static void close(Connection connection, Statement statement, ResultSet resultSet) {
		// 5)释
		try {
			if (connection != null) {
				connection.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if (statement != null) {
				statement.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if (resultSet != null) {
				resultSet.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

DBCP测试类DbcpTest

// 测试
public class DbcpTest {
	StudentDAOImpl sImpl = new StudentDAOImpl();

	// 插入
	@Test
	public void testInsert() {
		// SQL语句
		String sql = "insert into t_student(name, age) value(?,?);";
		Connection connection = null;
		PreparedStatement statement = null;
		// 1)加
		try {
			connection = DbcpUtil.getDataSource().getConnection();
			// 3)语
			statement = connection.prepareStatement(sql);
			// 4)执
			statement.setString(1, "洞妖洞妖");
			statement.setInt(2, 1122);
			statement.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 5)释
			DbcpUtil.close(connection, statement, null);
		}

	}

	// 删除
	@Test
	public void testDelete() {
		// sql语句
		String sql = "delete from t_student where id = ?";
		Connection connection = null;
		PreparedStatement statement = null;
		// 1)加
		try {
			connection = DbcpUtil.getDataSource().getConnection();

			// 3)语
			statement = connection.prepareStatement(sql);
			statement.setLong(1, 13L);
			// 4)执
			statement.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 5)释
			DbcpUtil.close(connection, statement, null);
		}
	}

	// 更新
	@Test
	public void testUpdate() {
		// sql
		String sql = "update t_student set name = ?, age = ? where id = ?";
		Connection connection = null;
		PreparedStatement statement = null;
		// 1)加
		try {
			connection = DbcpUtil.getDataSource().getConnection();
			// 3)语
			statement = connection.prepareStatement(sql);
			// 4)执
			statement.setString(1, "深蓝色");
			statement.setInt(2, 23);
			statement.setLong(3, 14L);
			statement.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 5)释
			DbcpUtil.close(connection, statement, null);
		}
	}

	@Test
	public void testQuery() {
		// sql
		String sql = "select * from t_student where id = ?";
		Student student = null;
		Connection connection = null;
		PreparedStatement statement = null;
		ResultSet resultSet = null;
		// 1)加
		try {
			connection = DbcpUtil.getDataSource().getConnection();
			// 3)语
			statement = connection.prepareStatement(sql);
			statement.setLong(1, 15L);
			// 4)执
			resultSet = statement.executeQuery();
			while (resultSet.next()) {
				student = new Student(resultSet.getLong("id"), resultSet.getString("name"), resultSet.getInt("age"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 5)释
			DbcpUtil.close(connection, statement, resultSet);
		}
		System.out.println(student);
	}

	@Test
	public void testQueryAll() {
		List<Student> list = new ArrayList<>();
		// sql语句
		String sql = "select * from t_student";
		Connection connection = null;
		PreparedStatement statement = null;
		ResultSet resultSet = null;
		// 1 )加
		try {
			connection = DbcpUtil.getDataSource().getConnection();
			// 3)语
			statement = connection.prepareStatement(sql);
			// 4)执
			resultSet = statement.executeQuery(sql);
			// 操作
			while (resultSet.next()) {
				// 添加到list
				Student student = new Student(resultSet.getLong("id"), resultSet.getString("name"),
						resultSet.getInt("age"));
				list.add(student);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DbcpUtil.close(connection, statement, resultSet);
		}
		for (Student student : list) {
			System.out.println(student);
		}
	}

}

二.Duird连接池

druid:是阿里巴巴研发出来的号称Java语言领域性能最高的连接池.

wiki地址:https://github.com/alibaba/druid/wiki

导入一个druid包

image

代码演示

Druid工具类 DruidUtil

//Druid
public class DruidUtil {
	private static DataSource dataSource;
	
	static {
		InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
		Properties p = new Properties();
		try {
			p.load(in);
			dataSource = DruidDataSourceFactory.createDataSource(p);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	private DruidUtil() {
		
	}
	public static DataSource getDataSource() {
		return dataSource;
	}
	//close
	public static void close(Connection con,PreparedStatement ps,ResultSet rs) {
		try {
			if (con != null) {
				con.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if (ps != null) {
				ps.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if (rs != null) {
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
}

Druid测试类

//Druid Test
public class DruidTest {
	StudentDAOImpl sImpl = new StudentDAOImpl();

	// 插入
	@Test
	public void testInsert() {
		// SQL语句
		String sql = "insert into t_student(name, age) value(?,?);";
		Connection connection = null;
		PreparedStatement statement = null;
		// 1)加
		try {
			connection = DruidUtil.getDataSource().getConnection();
			// 3)语
			statement = connection.prepareStatement(sql);
			// 4)执
			statement.setString(1, "洞妖洞妖");
			statement.setInt(2, 1122);
			statement.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 5)释
			DruidUtil.close(connection, statement, null);
		}

	}

	// 删除
	@Test
	public void testDelete() {
		// sql语句
		String sql = "delete from t_student where id = ?";
		Connection connection = null;
		PreparedStatement statement = null;
		// 1)加
		try {
			connection = DruidUtil.getDataSource().getConnection();

			// 3)语
			statement = connection.prepareStatement(sql);
			statement.setLong(1, 13L);
			// 4)执
			statement.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 5)释
			DruidUtil.close(connection, statement, null);
		}
	}

	// 更新
	@Test
	public void testUpdate() {
		// sql
		String sql = "update t_student set name = ?, age = ? where id = ?";
		Connection connection = null;
		PreparedStatement statement = null;
		// 1)加
		try {
			connection = DruidUtil.getDataSource().getConnection();
			// 3)语
			statement = connection.prepareStatement(sql);
			// 4)执
			statement.setString(1, "深蓝色");
			statement.setInt(2, 23);
			statement.setLong(3, 14L);
			statement.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 5)释
			DruidUtil.close(connection, statement, null);
		}
	}

	@Test
	public void testQuery() {
		// sql
		String sql = "select * from t_student where id = ?";
		Student student = null;
		Connection connection = null;
		PreparedStatement statement = null;
		ResultSet resultSet = null;
		// 1)加
		try {
			connection = DruidUtil.getDataSource().getConnection();
			// 3)语
			statement = connection.prepareStatement(sql);
			statement.setLong(1, 15L);
			// 4)执
			resultSet = statement.executeQuery();
			while (resultSet.next()) {
				student = new Student(resultSet.getLong("id"), resultSet.getString("name"), resultSet.getInt("age"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 5)释
			DruidUtil.close(connection, statement, resultSet);
		}
		System.out.println(student);
	}

	@Test
	public void testQueryAll() {
		List<Student> list = new ArrayList<>();
		// sql语句
		String sql = "select * from t_student";
		Connection connection = null;
		PreparedStatement statement = null;
		ResultSet resultSet = null;
		// 1 )加
		try {
			connection = DruidUtil.getDataSource().getConnection();
			// 3)语
			statement = connection.prepareStatement(sql);
			// 4)执
			resultSet = statement.executeQuery(sql);
			// 操作
			while (resultSet.next()) {
				// 添加到list
				Student student = new Student(resultSet.getLong("id"), resultSet.getString("name"),
						resultSet.getInt("age"));
				list.add(student);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DruidUtil.close(connection, statement, resultSet);
		}
		for (Student student : list) {
			System.out.println(student);
		}
	}
}

三.JDBC最终重构

image

StudentDAOImpl DAO实现类

// DAO实现类
public class StudentDAOImpl implements IBeanDAO<Student> {
	// 插入
	public void insert(Student student) {
		String sql = "insert t_student(name,age) values(?,?)";
		DruidTempla.dml(sql, student.getName(),student.getAge());

	}

	public void delete(Long id) {
		String sql = "delete from t_student where id = ?";
		DruidTempla.dml(sql, id);
	}

	public void update(Student student) {
		String sql = "update t_student set name = ?, age = ? where id = ?";
		DruidTempla.dml(sql, student.getName(),student.getAge(),student.getId());
	}

	public Object query(Long id) {
		String sql = "select * from t_student where id = ?";
		List<Student> list = DruidTempla.dql(sql, new BeanResultHandler<>(Student.class), id);
		return list.size() > 0 ? list.get(0) : null;
	}

	@Override
	public List<Student> queryAll() {
		String sql = "select * from t_student";
		List<Student> list = DruidTempla.dql(sql, new BeanResultHandler<>(Student.class));
		return list.size() > 0 ? list : null;
	}

}

IBeanDAO接口

//DAO接口
public interface IBeanDAO<T> {
	/**
	 * 增
	 * @param student
	 */
	void insert(T t);
	/**
	 * 删
	 * @param id
	 */
	void delete(Long id);
	/**
	 * 改
	 * @param student
	 */
	void update(T t);
	/**
	 * 查
	 * @param id
	 * @return
	 */
	Object query(Long id);
	/**
	 * 查全部
	 * @return
	 */
	List<T> queryAll();
}

Student实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
	private Long id;
	private String name;
	private Integer age;
}

通用处理结果类

/**
 * 通用处理结果类
 * @author Administrator
 *
 * @param <T>
 */
public class BeanResultHandler<T> implements IResultHandler<List<T>> {
	private Class<T> clz;
	public BeanResultHandler(Class<T> clz){
		this.clz = clz;
	}
	/**
	 * 
	 * @param ResultSet rs
	 * @return List<T>
	 */
	public List<T> resultHandler(ResultSet rs) {
		//1)通过内省获得属性描述器
		List<T> list = new ArrayList<>();
		try {
			BeanInfo info = Introspector.getBeanInfo(clz,Object.class);
			PropertyDescriptor[] pds = info.getPropertyDescriptors();
			//2)遍历结果集
			while (rs.next()) {
				T t = clz.newInstance();
				//3)遍历属性描述器 设置值
				for (PropertyDescriptor pd :pds) {
					pd.getWriteMethod().invoke(t, rs.getObject(pd.getName()));
				}
				list.add(t);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list.size() > 0 ? list : null;
	}

}

处理结果接口 IResultHandler

/**
 * 处理结果接口
 * @author Administrator
 *
 */
public interface IResultHandler <T>{
	/**
	 * 
	 * @param ResultSet rs
	 * @return T
	 */
	T resultHandler(ResultSet rs);
}

DAO测试类 StudentDAOTest

/**
 * DAO测试类
 * @author Administrator
 *
 */
public class StudentDAOTest {
	IBeanDAO<Student> dao = new StudentDAOImpl();
	@Test
	public void testInsert() {
		Student student = new Student(null,"非常龙",17);
		dao.insert(student);
	}

	@Test
	public void testDelete() {
		dao.delete(15L);
	}

	@Test
	public void testUpdate() {
		Student student = new Student(16L,"真.红眼黑龙",17);
		dao.update(student);
	}

	@Test
	public void testQuery() {
		Object student = dao.query(24L);
		System.out.println(student);
	}

	@Test
	public void testQueryAll() {
		List<Student> list = dao.queryAll();
		for (Object object : list) {
			System.out.println(object);
		}
	}

}

DML和DQL模板 DruidTempla类

/**
 * DML和DQL模板
 * @author Administrator
 *
 */
public class DruidTempla {
	private DruidTempla() {
	};

	/**
	 * DML操作
	 * @param sql
	 * @param objects
	 */
	public static void dml(String sql, Object... objects) {
		// 1)获取Connection
		Connection connection = null;
		PreparedStatement ps = null;
		try {
			connection = DruidUtil.getDataSource().getConnection();
			// 2)获取PerparedSatement对象
			ps = connection.prepareStatement(sql);
			// 设置参数
			for (int i = 0; i < objects.length; i++) {
				ps.setObject(i + 1, objects[i]);
			}
			// 执行
			ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DruidUtil.close(connection, ps, null);
		}

	}

	public static <T> T dql(String sql,IResultHandler<T> rh,Object...objects) {
		// 1)获取Connection
		Connection connection = null;
		PreparedStatement ps = null;
		T t = null;
		try {
			connection = DruidUtil.getDataSource().getConnection();
			// 2)获取PerparedSatement对象
			ps = connection.prepareStatement(sql);
			// 设置参数
			for (int i = 0; i < objects.length; i++) {
				ps.setObject(i + 1, objects[i]);
			}
			// 执行
			ResultSet rs = ps.executeQuery();
			t = rh.resultHandler(rs);			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DruidUtil.close(connection, ps, null);
		}
		return t;
	}
}

Druid工具类

// Druid工具类
public class DruidUtil {
	private static DataSource ds;
	static {
		InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
		Properties p = new Properties();
		try {
			p.load(in);
			ds = DruidDataSourceFactory.createDataSource(p);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 获取DataSource
	 * @return DataSource
	 */
	public static DataSource getDataSource() {
		return ds;
	}

	/**
	 * 关闭资源
	 * @param Connection con
	 * @param PreparedStatement ps
	 * @param ResultSet rs
	 */
	public static void close(Connection con, PreparedStatement ps, ResultSet rs) {
		// 关闭
		try {
			if (con != null) {
				con.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if (ps != null) {
				ps.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if (rs != null) {
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值