Luo Hao

Java数据库(2)改造jdbc工具类

rehoni / 2020-06-20


增删改

可以设置一个Object数组,用来占位Preparement的sql里的那些?,数组的长度就是预插入的值的数量,数组里的值就是可以录入到Preparestatement的值。

//我们发现,增删改只有SQL语句和传入的参数是不知道的而已,所以让调用该方法的人传递进来
    //由于传递进来的参数是各种类型的,而且数目是不确定的,所以使用Object[]
    public static void update(String sql, Object[] objects) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            connection = getConnection();
            preparedStatement = connection.prepareStatement(sql);
            //根据传递进来的参数,设置SQL占位符的值
            for (int i = 0; i < objects.length; i++) {
                preparedStatement.setObject(i + 1, objects[i]);
            }
            //执行SQL语句
            preparedStatement.executeUpdate();
       	 } catch (Exception e) {
            e.printStackTrace();
        }
    }

查询

注意这里可以定义一个接口,对select的结果集进行操作,但是不知道需要具体进行操作,调用接口的实现类,接口就可以调用实现的方法。

/*
        1:对于查询语句来说,我们不知道对结果集进行什么操作【常用的就是把数据封装成一个Bean对象,封装成一个List集合】
        2:我们可以定义一个接口,让调用者把接口的实现类传递进来
        3:这样接口调用的方法就是调用者传递进来实现类的方法。【策略模式】
    */
    //这个方法的返回值是任意类型的,所以定义为Object。
    public static Object query(String sql, Object[] objects, ResultSetHandler rsh) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            connection = getConnection();
            preparedStatement = connection.prepareStatement(sql);
            //根据传递进来的参数,设置SQL占位符的值
            if (objects != null) {
                for (int i = 0; i < objects.length; i++) {
                    preparedStatement.setObject(i + 1, objects[i]);
                }
            }
            resultSet = preparedStatement.executeQuery();
            //调用调用者传递进来实现类的方法,对结果集进行操作
            return rsh.hanlder(resultSet);
        }
    }

接口

 /*
    * 定义对结果集操作的接口,调用者想要对结果集进行什么操作,只要实现这个接口即可
    * */
    public interface ResultSetHandler {
         Object hanlder(ResultSet resultSet);
    }

实现示例

//接口实现类,对结果集封装成一个Bean对象
public class BeanHandler implements ResultSetHandler {
    //要封装成一个Bean对象,首先要知道Bean是什么,这个也是调用者传递进来的。
    private Class clazz;
    public BeanHandler(Class clazz) {
        this.clazz = clazz;
    }
    @Override
    public Object hanlder(ResultSet resultSet) {
        try {
            //创建传进对象的实例化
            Object bean = clazz.newInstance();
            if (resultSet.next()) {
                //拿到结果集元数据
                ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
                for (int i = 0; i < resultSetMetaData.getColumnCount(); i++) {
                    //获取到每列的列名
                    String columnName = resultSetMetaData.getColumnName(i+1);
                    //获取到每列的数据
                    String columnData = resultSet.getString(i+1);
                    //设置Bean属性
                    Field field = clazz.getDeclaredField(columnName);
                    field.setAccessible(true);
                    field.set(bean,columnData);
                }
                //返回Bean对象
                return bean;
            }
        }
    }
}