通用框架编写

知识点

1. 反射:类在运行期间,把类中成员抽取为其他类的过程就是反射。
2. 应用场景: 设计框架。
3. 反射类Class的获取方式:[1]类名.class [2]Class.forName("类路径")[3]对象.getClass()
4. Class类中常用的方法:
    [1]获取类的实例 clazz.newInstance()
    [2]获取类上的注解对象: clazz.getAnnotation(注解.class)
    [3]获取类的名称: clazz.getSimpleName()
5. Method类对象的获取: 
    [1]clazz.getMethods():获取本类以及父类中所有Public修饰的方法
    [2]clazz.getMethod("方法名",Class...参数类型):获取本类以及父类中指定的public修饰的方法
    [3]clazz.getDeclaredMethods():获取本类中所有的方法
    [4]clazz.getDeclaredMethod("方法名",Class...参数类型):获取本类中指定的方法
6. Method类中常用的方法。
    [1]method.invoke(Object o,参数值):执行该方法
    [2]method.getName():获取方法名
    [3]method.getAnnotation(注解.class):获取方法上的注解
7. Field对象的获取   
    [1]clazz.getFields():获取本类以及父类中所有Public修饰的属性
    [2]clazz.getField("属性名"):获取本类以及父类中指定的public修饰的属性
    [3]clazz.getDeclaredFields():获取本类中所有的属性
    [4]clazz.getDeclaredField("属性名"):获取本类中指定的属性
8. 常用的方法:
    [1]field.setAccessible(true):设置允许访问私有成员
    [2]field.set(Object o,值):为属性赋值
    [3]field.getAnnotation(注解.class):获取属性上的注解
    [4]field.getName():获取属性名

通用添加

通用添加功能:sql语句  insert into 表名(列名...) values(值...)
public int insert(T t) throws Exception{
    StringBuffer sql = new StringBuffer("insert into ");//创建sql数组
    Class<?> aClass = t.getClass();//获取反射类class
    String simpleName = aClass.getSimpleName();//获取类的名称
    TableName annotation = aClass.getAnnotation(TableName.class);//获取类上的注解对象
    if (annotation!=null){
        simpleName=annotation.value();
    }
    sql.append(simpleName);
    ArrayList<Object> objects = new ArrayList<>();//创建一个储存对象
    ArrayList<Object> objects1 = new ArrayList<>();
    Field[] declaredFields = aClass.getDeclaredFields();//获取本类中的所有属性
    for (Field field:declaredFields){
        field.setAccessible(true);//设计允许访问私有成员
        String name = field.getName();//获取属性名
        TableId annotation1 = field.getAnnotation(TableId.class);//获取属性上的注解
        TableField annotation2 = field.getAnnotation(TableField.class);
        if (annotation1!=null){
            continue;
        }
        if (annotation2!=null){
            name=annotation2.value();
        }
        Object o = field.get(t);
        objects.add(name);
        objects1.add("'"+o+"'");
    }
    //组合完整sql语句
    String replace = objects.toString().replace("[", "(").replace("]", ")");
    String replace1 = objects1.toString().replace("[", "(").replace("]", ")");
    sql.append(replace+" values "+replace1);
    //运行sql语句
    Connection connection = DbUtil.getConnection();
    PreparedStatement preparedStatement = connection.prepareStatement(sql.toString());
    int i = preparedStatement.executeUpdate();
    return i;
}

通用修改

通用update语句  update 数据表名称 set 数据列=新数据值,.... where 主键

public int update(T t) throws Exception{
    //创建新数组
    StringBuffer sql = new StringBuffer("update ");
    //获取反射类
    Class<?> aClass = t.getClass();
    //获取类名称
    String simpleName = aClass.getSimpleName();
    //获取类注释对象
    TableName annotation = aClass.getAnnotation(TableName.class);
    if (annotation!=null){
        simpleName=annotation.value();
    }
    sql.append(simpleName+" set ");
    String where=" where ";
    //获取类所有属性
    Field[] declaredFields = aClass.getDeclaredFields();
    for (Field field:declaredFields){
        //允许访问私有成员
        field.setAccessible(true);
        //获取属性名
        String name = field.getName();
        //获取属性注解
        TableField annotation1 = field.getAnnotation(TableField.class);
        TableId annotation2 = field.getAnnotation(TableId.class);
        //获取类中的值
        Object o = field.get(t);
        if (annotation1!=null){
            name=annotation1.value();
        }
        if (annotation2!=null){
            String value = annotation2.value();
            where+=value+"='"+o+"'";
            continue;
        }
        sql.append(name+"='"+o+"',");
    }
    //删去数组中最后一个“,”标点后添加数组
    sql.deleteCharAt(sql.length()-1).append(where);
    Connection connection = DbUtil.getConnection();
    PreparedStatement preparedStatement = connection.prepareStatement(sql.toString());
    System.out.println(sql);
    int i = preparedStatement.executeUpdate();
    return i;
}

通用查询(id)

public T selectById(Object id) throws Exception{
    StringBuffer sql=new StringBuffer("select * from ");
    //获取表名
    String tableName=clazz.getSimpleName();
    TableName annotation = clazz.getAnnotation(TableName.class);
    if(annotation!=null){
        tableName=annotation.value();
    }
    sql.append(tableName+" where ");
    //获取主键列名
    Field[] declaredFields = clazz.getDeclaredFields();
    for (Field field:declaredFields){
        TableId tableId = field.getAnnotation(TableId.class);
        if(tableId!=null){
            sql.append(tableId.value()+"="+id);
            break;
        }
    }

    //执行sql语句
    Connection conn = DbUtil.getConnection();
    PreparedStatement ps = conn.prepareStatement(sql.toString());
    ResultSet rs = ps.executeQuery();
    //封装数据到实体类
    while(rs.next()){
        T t=clazz.newInstance();
        for (Field field:declaredFields){
            field.setAccessible(true);
            TableField tableField = field.getAnnotation(TableField.class);
            TableId tableId = field.getAnnotation(TableId.class);
            //获取属性名
            String name = field.getName();
            if(tableId!=null){
                name=tableId.value();
            }
            if(tableField!=null){
                name=tableField.value();
            }
            //获取数据库中指定列的值
            Object v = rs.getObject(name);
            //为指定对象的属性赋值
            field.set(t,v);
            System.out.println(v);
        }
        System.out.println(t);
        return t;
    }
    return null;
}

通用查询(全部)

public List<T> selectAll()throws Exception{
    List<T> list=new ArrayList<>();
    StringBuffer sql=new StringBuffer("select * from ");
    //获取表名
    String tableName=clazz.getSimpleName();
    TableName annotation = clazz.getAnnotation(TableName.class);
    if(annotation!=null){
        tableName=annotation.value();
    }
    sql.append(tableName);
    //执行sql语句
    Connection conn = DbUtil.getConnection();
    PreparedStatement ps = conn.prepareStatement(sql.toString());
    ResultSet rs = ps.executeQuery();
    Field[] declaredFields = clazz.getDeclaredFields();
    //封装数据
    while (rs.next()){
        T t=clazz.newInstance();
        //为实体类的属性赋值
        for (Field field:declaredFields){
            field.setAccessible(true);
            TableField tableField = field.getAnnotation(TableField.class);
            TableId tableId = field.getAnnotation(TableId.class);
            //获取属性名
            String name = field.getName();
            if(tableId!=null){
                name=tableId.value();
            }
            if(tableField!=null){
                name=tableField.value();
            }
            //获取数据库中指定列的值
            Object v = rs.getObject(name);
            //为指定对象的属性赋值
            field.set(t,v);
        }
        list.add(t);
    }
    System.out.println(list);
    return list;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值