DAO及其子类

BaseDAO.java

/**
 * @ClassName BaseDAO
 * @Description TODO 封装了对于数据表的通用操作
 * @Author LuckyAzrael
 * @Date 2020/12/16 9:49
 * @Version 1.0
 **/
public abstract class BaseDAO<T> {
    private Class<T> clazz = null;
    {
        //获取当前BaseDAO的子类继承的父类中的泛型
        Type genericSuperclass = this.getClass().getGenericSuperclass();
        ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
        Type[] typeArguments = parameterizedType.getActualTypeArguments();
        clazz = (Class<T>) typeArguments[0];
    }
    /**
     * 返回值为int的通用增删改操作(考虑上事务)
     * @Author LuckyAzrael
     * @Date 11:38 2020/12/16
     * @param connection 连接
     * @param sql SQL语句
     * @param args 占位符
     * @return int 更新的行数
     **/
    public int update(Connection connection, String sql, Object... args) {
        PreparedStatement preparedStatement = null;
        try {
            preparedStatement = connection.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                preparedStatement.setObject(i + 1, args[i]);
            }
            return preparedStatement.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeResource(null,preparedStatement);
        }
        return 0;
    }


    /**
     * 通用的查询操作,用于返回数据表中的一条记录(考虑上事务)
     * @Author LuckyAzrael
     * @Date 11:38 2020/12/16
     * @param connection 连接
     * @param sql SQL语句
     * @param args 占位符
     * @return clazz类的对象
     */
    public T getInstance(Connection connection,String sql,Object ...args){
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            preparedStatement = connection.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                preparedStatement.setObject(i + 1,args[i]);
            }
            resultSet = preparedStatement.executeQuery();

            ResultSetMetaData metaData = resultSet.getMetaData();
            int columnCount = metaData.getColumnCount();

            if (resultSet.next()){
                T t = clazz.newInstance();
                for (int i = 0; i < columnCount; i++) {
                    Object columnValue = resultSet.getObject(i + 1);
                    String columnLabel = metaData.getColumnLabel(i + 1);
                    Field field = clazz.getDeclaredField(columnLabel);
                    field.setAccessible(true);
                    field.set(t,columnValue);
                }
                return t;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeResource(null,preparedStatement,resultSet);
        }
        return null;
    }

    /**
     * 通用的查询操作,用于返回数据表中的多条记录(考虑上事务)
     * @Author LuckyAzrael
     * @Date 11:38 2020/12/16
     * @param connection 连接
     * @param sql SQL语句
     * @param args 占位符
     * @return clazz类的集合
     */
    public List<T> getForList(Connection connection, String sql, Object ...args){
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            preparedStatement = connection.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                preparedStatement.setObject(i + 1,args[i]);
            }
            resultSet = preparedStatement.executeQuery();

            ResultSetMetaData metaData = resultSet.getMetaData();
            int columnCount = metaData.getColumnCount();
            ArrayList<T> list = new ArrayList<>();
            while (resultSet.next()){
                T t = clazz.newInstance();
                for (int i = 0; i < columnCount; i++) {
                    Object columnValue = resultSet.getObject(i + 1);
                    String columnLabel = metaData.getColumnLabel(i + 1);
                    Field field = clazz.getDeclaredField(columnLabel);
                    field.setAccessible(true);
                    field.set(t,columnValue);
                }
                list.add(t);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeResource(null,preparedStatement,resultSet);
        }
        return null;
    }

    /**
     * 用于查询特殊值的通用方法(查询结果为单行单列)
     * @Author LuckyAzrael
     * @Date 11:38 2020/12/16
     * @param connection 数据库连接
     * @param sql SQL语句
     * @param args 占位符
     * @param <E> 返回值类型(基本数据类型)
     * @return 基本数据类型的数据
     */
    public <E> E getValue(Connection connection, String sql, Object... args){
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            preparedStatement = connection.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                preparedStatement.setObject(i + 1,args[i]);
            }
            resultSet = preparedStatement.executeQuery();
            if (resultSet.next()){
                return (E) resultSet.getObject(1);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            JDBCUtils.closeResource(null,preparedStatement,resultSet);
        }
        return null;
    }
}

子接口示例

/**
 * @InterfaceName CustomerDAO
 * @Description TODO 此接口用于规范针对customers表的常用操作
 * @Author LuckyAzrael
 * @Date 2020/12/16 10:11
 * @Version 1.0
 **/
public interface CustomerDAO {
    /**
     * 将customer对象添加到数据库中
     * @Author LuckyAzrael
     * @Date 11:41 2020/12/16
     * @param connection 数据库连接
     * @param customer 要添加的数据
     */
    void insert(Connection connection, Customer customer);
    /**
     * 根据指定的id,删除表中的一条记录
     * @Author LuckyAzrael
     * @Date 11:42 2020/12/16
     * @param connection 数据库连接
     * @param id
     */
    void deleteById(Connection connection,int id);
    /**
     * 修改表中的一条记录
     * @Author  LuckyAzrael
     * @Date 10:20 2020/12/16
     * @param connection 数据库连接
     * @param customer 修改后的数据
     **/
    void update(Connection connection,Customer customer);
    /**
     * 根据指定id查询得到对应的Customer对象
     * @Author LuckyAzrael
     * @Date 14:32 2020/12/16
     * @param connection 数据库连接
     * @param id
     * @return Customer 查询的Customer对象
     */
    Customer getCustomerById(Connection connection,int id);

    /**
     * 查询customers表中的所有数据构成的集合
     * @Author LuckyAzrael
     * @Date 14:34 2020/12/16
     * @param connection 数据库连接
     * @return Customer集合
     */
    List<Customer> getAll(Connection connection);
    /**
     * 返回数据表中数据的条目数
     * @Author LuckyAzrael
     * @Date 14:36 2020/12/16
     * @param connection 数据库连接
     * @return Long 数据的条目数
     */
    Long getCount(Connection connection);
    /**
     * 返回数据表中最大的生日
     * @Author LuckyAzrael
     * @Date 14:38 2020/12/16
     * @param connection 数据库连接
     * @return Date 数据表中最大的生日
     */
    Date getMaxBirth(Connection connection);
}

实现类示例

/**
 * @ClassName CustomerDAOImpl
 * @Description TODO
 * @Author LuckyAzrael
 * @Date 2020/12/16 14:41
 * @Version 1.0
 **/
public class CustomerDAOImpl extends BaseDAO<Customer> implements CustomerDAO {
    @Override
    public void insert(Connection connection, Customer customer) {
        String sql = "insert into customers(name,email,birth)values(?,?,?)";
        int update = update(connection, sql,customer.getName(),customer.getEmail(),customer.getBirth());
    }
    @Override
    public void deleteById(Connection connection, int id) {
        String sql = "delete from customers where id = ?";
        update(connection,sql,id);
    }
    @Override
    public void update(Connection connection, Customer customer) {
        String sql = "update customers set name = ?,email = ?,birth = ? where id = ?";
  		update(connection,sql,customer.getName(),customer.getEmail(),customer.getBirth(),customer.getId());
    }
    @Override
    public Customer getCustomerById(Connection connection, int id) {
        String sql = "select id,name,email,birth from customers where id = ?";
        Customer customer = getInstance(connection,sql,id);
        return customer;
    }
    @Override
    public List<Customer> getAll(Connection connection) {
        String sql = "select id,name,email,birth from customers";
        List<Customer> list = getForList(connection,sql);
        return list;
    }
    @Override
    public Long getCount(Connection connection) {
        String sql = "select count(*) from customers";
        return getValue(connection, sql);
    }
    @Override
    public Date getMaxBirth(Connection connection) {
        String sql = "select max(birth) from customers ";
        return getValue(connection,sql);
    }
}

总结:考虑到事务以后的数据库操作

1.获取数据库的连接

Connection connection = JDBCUtils.getConnection(); //方式1:手动获取连接 方式2:数据库连接池
connection.setAutoCommit(false); //体现事务

2.如下的多个DML操作,作为一个事务出现:

操作1:需要使用通用的增删改查操作
操作2:需要使用通用的增删改查操作
操作3:需要使用通用的增删改查操作
conn.commit();
通用的增删改查操作如何实现?
方式1:手动使用PreparedStatement实现
方式2:使用dbutils.jar中QueryRunner类

3.如果出现异常,则:

conn.rollback();

4.关闭资源

JDBCUtils.closeResource(..,...,...);
方式1:手动关闭资源
方式2:DbUtils类的关闭方法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值