用反射、注解及DBUtils对Dao层抽取

今天闲着无聊,用反射、注解及DBUtils对Dao层进行了抽取,实现了对基础CRUD的操作,上代码:

接口

package com.fly.utils;

import java.sql.SQLException;
import java.util.List;

public interface BaseDao<T> {

    public T getEntityById(Object id) throws SQLException;
    public List<T> getAllEntities() throws SQLException;
    public List<T> getAllEntitiesForPage(PageBean<T> pageBean) throws SQLException;
    public int deleteEntityById(Object id) throws SQLException;
    public int updateEntity(T t) throws SQLException;
    public int saveEntity(T t) throws SQLException;

}

实现类:

package com.fly.utils;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

public class BaseDaoImpl<T> implements BaseDao<T> {

    private Class classT;
    private Field idField;
    private List<Field> normalFields;

    public BaseDaoImpl() {
        //获取泛型参数类型
        ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
        classT = (Class) type.getActualTypeArguments()[0];

        //通过注解的方式,获取Id字段以及普通字段
        Field[] fields = classT.getDeclaredFields();
        normalFields = new ArrayList<>();
        for (Field field : fields) {
            boolean isId = field.isAnnotationPresent(Id.class);
            boolean isNoneProperty = field.isAnnotationPresent(NoneProperty.class);
            if (isId) {
                idField = field;
            } else if (!isNoneProperty) {
                normalFields.add(field);
            }
        }
    }

    /**
     * 查询单条数据,简单
     */
    @Override
    public T getEntityById(Object id) throws SQLException {
        QueryRunner qr = new QueryRunner();
        String sql = "select * from " + classT.getSimpleName().toLowerCase() + " where " + idField.getName() + " = ?";

        Object[] params = {id};
        T t = qr.query(C3P0Utils.getConnnection(), sql, new BeanHandler<T>(classT), params);
        return t;
    }

    /**
     * 查询所有数据,简单
     */
    @Override
    public List<T> getAllEntities() throws SQLException {
        QueryRunner qr = new QueryRunner();
        String sql = "select * from " + classT.getSimpleName().toLowerCase();
        List<T> list = qr.query(C3P0Utils.getConnnection(), sql, new BeanListHandler<T>(classT));
        return list;
    }
    /**
     * 获取分页数据
     */
    @Override
    public List<T> getAllEntitiesForPage(PageBean<T> pageBean) throws SQLException {
        QueryRunner qr = new QueryRunner();
        String sql = "select * from " + classT.getSimpleName().toLowerCase() + " limit ?,?";
        Object[] params = {pageBean.getStartIndex(), pageBean.getPageSize()};
        List<T> list = qr.query(C3P0Utils.getConnnection(), sql, new BeanListHandler<T>(classT), params);
        return list;
    }


    /**
     * 删除单条数据,简单
     */
    @Override
    public int deleteEntityById(Object id) throws SQLException {
        QueryRunner qr = new QueryRunner();
        String sql = "delete from " + classT.getSimpleName().toLowerCase() + " where " + idField.getName() + " = ?";
        Object[] params = {id};
        int rows = qr.update(C3P0Utils.getConnnection(), sql, params);
        return rows;
    }

    /**
     * 更新单条数据,复杂
     * 通过反射找到所有字段
     * 通过反射获取各字段具体值
     * 组合sql语句
     * 组合参数数组
     */
    @Override
    public int updateEntity(T t) throws SQLException {
        QueryRunner qr = new QueryRunner();
        String sql = "update " + classT.getSimpleName().toLowerCase() + " set ";
        List<Object> paramList = new ArrayList<>();
        for (int i = 0; i < normalFields.size(); i++) {
            paramList.add(getProperty(t, normalFields.get(i)));
            if (i == normalFields.size() - 1) {
                sql += normalFields.get(i).getName() + "=? ";
            } else {
                sql += normalFields.get(i).getName() + "=?,";
            }
        }
        paramList.add(getProperty(t, idField));
        sql += "where " + idField.getName() + "=?";

        Object[] params = paramList.toArray();
        int rows = qr.update(C3P0Utils.getConnnection(), sql, params);
        return rows;
    }

    /**
     * 保存单条数据,复杂
     * 通过反射找到所有字段
     * 通过反射获取各字段具体值
     * 组合sql语句
     * 组合参数数组
     */
    @Override
    public int saveEntity(T t) throws SQLException {
        QueryRunner qr = new QueryRunner();
        String sql = "insert into " + classT.getSimpleName().toLowerCase() + " (" + idField.getName();
        String sql2 = ") values (?";

        List<Object> paramList = new ArrayList<>();
        paramList.add(getProperty(t, idField));

        for (int i = 0; i < normalFields.size(); i++) {
            paramList.add(getProperty(t, normalFields.get(i)));
            sql += "," + normalFields.get(i).getName();
            sql2 += ",?";
        }

        sql += sql2 + ")";
        System.out.println(sql);

        Object[] params = paramList.toArray();
        int rows = qr.update(C3P0Utils.getConnnection(), sql, params);
        return rows;
    }

    /**
     * 通过反射获取字段的值
     */
    private Object getProperty(T t, Field field) {
        String getterName = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
        try {
            Method getter = classT.getMethod(getterName);
            return getter.invoke(t);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return null;
    }

}

还有两个注解:

Id注解

package com.fly.utils;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Id {

}

非字段注解

package com.fly.utils;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NoneProperty {

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值