JDBC的封装(下)

JDBC的封装(下)

BaseDao封装

目的:

  1. 完成通用的更新方法,满足insert、update、delete操作。
  2. 完成通用的查询方法,满足select

针对于以上两个目的,我们需要解决的问题如下:

  1. 数据库连接对象的获取 以及资源关闭问题 已解决
  2. PreparedStatement参数赋值过程 以及 查询结果的解析

首先,我们需要知道PreparedStatement预处理?有多少个,参数传入方式和顺序问题。
对于这个地方我们需要了解元数据(中介数据,就是用来描述数据的)MetaData。

数据库元数据
	通过java.sql.Connection获取对应的元数据,Connection对象调用getMetaData()
SQL语句元数据
	通过java.sql.PreparedStatement获取对应的元数据,PreparedStatement对象调用getParameterMetaData()
数据库结果集元数据
	通过java.sql.ResultSet获取对应的元数据,ResultSet对象getMetaData()

其次,我们进行数据展示的时候(查询结果的解析),我们可以可以使用BeanUtils工具类,它提供了对于符合JavaBean规范的实体类进行赋值,取值,拷贝操作的一系列方法,可以自动完成数据类型的转换。

开搞
通用更新方法的实现
public int update(String sql, Object[] parameters) {
	int affectedRows = 0;
    	Connection connection = null;
    	PreparedStatement preparedStatement = null;

	try{
		connection = JdbcUtil.getConnection();
		preparedStatement = connection.prepareStatement(sql);
		//获取sql语句的参数个数
		int parameterCount = preparedStatement.getParameterMetaData().getParameterCount();
		//这说明我sql语句的参数个数和传入的参数在数量上必须一致
		if (parameterCount !=0 && parameters != null && parameterCount == parameters.length){
			for (int i = 0; i < parameters.length; i++) {
				//sql参数的下标是从1开始的
				preparedStatement.setObject(i + 1, parameters[i])
			}
		}
		//执行
		affectedRows = preparedStatement.executeUpdate();
	}catch (SQLException e) {
    		e.printStackTrace();
 	} finally {
    		JdbcUtil.close(connection, preparedStatement);
	}
	return affectedRows;
}

使用的时候

//以更新和删除为例
//更新
User user = new User(20, "小磊哥", "6666");
String sql = "update user set userName = ?, password = ? where id = ?";
Object[] parameters = {user.getUserName(), user.getPassword(), user.getId()};
int update = super.update(sql, parameters);
//1的话就是成功
System.out.println(update);
//删除,这样写也是可以的
int id = 20;
String sql = "delete from user where id = " + id;
int update = super.update(sql, null);
System.out.println(update);
通用查询方法的实现

因为我们要使用BeanUtils,所以说我们需要引入对应的jar包

在这里插入图片描述
之后开搞

public <T> List<T> query(String sql, Object[] parameters, Class<T> cls) {
	ResultSet resultSet = null;
	Connection connection = null;
	PreparedStatement preparedStatement = null;
	
	List<T> list = new ArrayList<>();

	try{
		connection = JdbcUtil.getConnection();
		preparedStatement = connection.prepareStatement(sql);
		
		int parameterCount = preparedStatement.getParameterMetaData().getParameterCount();
		if (parameterCount != 0 && parameters != null && parameterCount == parameters.length) {
   			for (int i = 0; i < parameters.length; i++) {
				preparedStatement.setObject(i + 1, parameters[i]);
			}
		}
		// 执行SQL语句,得到结果集对象
		resultSet = preparedStatement.executeQuery();
		// 结果集元数据
		ResultSetMetaData metaData = resultSet.getMetaData();
		// 字段个数
		int columnCount = metaData.getColumnCount();
		while (resultSet.next()) {
			//反射
			T t = cls.getConstructor().newInstance();
			for (int i = 1; i <= columnCount; i++) {
				// 获取字段名
				String fieldName = metaData.getColumnName(i);
				// 获取对应字段数据
				Object value = resultSet.getObject(fieldName);
				//类t,成员变量名fieldName,值value
				BeanUtils.setProperty(t, fieldName, value);
			}
			list.add(t);
		} catch (SQLException | NoSuchMethodException | InstantiationException| IllegalAccessException | InvocationTargetException e) {
			e.printStackTrace();
		} finally {
    			JdbcUtil.close(connection, preparedStatement, resultSet);
		}
		//判断结果
		return list.size() != 0 ? list : null;
	}
}

使用的时候

String sql = "select * from user";
List<User> list = super.query(sql, null, User.class);
if (list != null) {
    for (User user : list) {
        System.out.println(user);
    }
} else {
    System.out.println("Not Found!");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值