新人开发-JAVA 泛型CRUD-测试时 空指针。

qq_34052254 2017-01-05 02:22:38
接口baseDao

import java.util.List;

public interface BaseDao<T> {
public abstract void add(T t);
public abstract void delete(T t);
public abstract void update(T t);
public abstract T select(T t);
public abstract List<T>findAll();
}

实现BaseDaoImpl


import javax.jnlp.BasicService;
import java.lang.reflect.*;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import static oracle.net.aso.C00.t;

/**
* Created by Administrator on 2017/1/4.
*/
public class BaseDaoImpl<T> implements BaseDao<T> {

/** 操作常量 */
public static final String SQL_INSERT = "insert";
public static final String SQL_UPDATE = "update";
public static final String SQL_DELETE = "delete";
public static final String SQL_SELECT = "select";
public static final String SQL_SELECTALL = "select";

public Class<T> EntityClass; // 获取实体类

public PreparedStatement statement;

public String sql;

public Object argType[];

public ResultSet rs;

@SuppressWarnings("unchecked")
public BaseDaoImpl() {

/**
* 传递User就是 com.example.daoimp.BaseDaoImp<com.example.bean.User>
* 传递Shop就是 com.example.daoimp.BaseDaoImp<com.example.bean.Shop>
* */
// ParameterizedType type = (ParameterizedType) getClass()
// .getGenericSuperclass();

/**
* 这里如果传递的是User.那么就是class com.example.bean.User
* 如果传递的是Shop. 那么就是class com.example.bean.Shop
* */
// EntityClass = (Class<T>) GenericsUtils.getSuperClassGenricType().getActualTypeArguments()[0];
Class<T> EntityClass = GenericsUtils.getSuperClassGenricType(BasicService.class, 0);
}

@Override
public void add(T t) {
// TODO Auto-generated method stub
sql = this.getSql(SQL_INSERT); //获取sql.
// 赋值.
try {
argType = setArgs(t, SQL_INSERT);
statement = JdbcUtils.getPreparedStatement(sql); //实例化PreparedStatement.
//为sql语句赋值.
statement = JdbcUtils.setPreparedStatementParam(statement,
argType);
statement.executeUpdate(); //执行语句.
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JdbcUtils.release(statement, null); //释放资源.
}
}

@Override
public void delete(T t) {
// TODO Auto-generated method stub
sql = this.getSql(SQL_DELETE);
try {
argType = this.setArgs(t, SQL_DELETE);
statement = JdbcUtils.getPreparedStatement(sql);
statement = JdbcUtils.setPreparedStatementParam(statement,
argType);
statement.executeUpdate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JdbcUtils.release(statement, null);
}
}

@Override
public void update(T t) {
// TODO Auto-generated method stub
sql = this.getSql(SQL_UPDATE);
try {
argType = setArgs(t, SQL_UPDATE);
statement = JdbcUtils.getPreparedStatement(sql);
statement = JdbcUtils.setPreparedStatementParam(statement,
argType);
statement.executeUpdate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JdbcUtils.release(statement, null);
}
}

@Override
public T select(T t) {
// TODO Auto-generated method stub
sql = this.getSql(SQL_SELECT);
T obj = null;
try {
argType = setArgs(t, SQL_SELECT);
statement = JdbcUtils.getPreparedStatement(sql);
statement = JdbcUtils.setPreparedStatementParam(statement,
argType);
rs = statement.executeQuery();
Field fields[] = EntityClass.getDeclaredFields();
while (rs.next()) {
obj = EntityClass.newInstance();
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
fields[i].set(obj, rs.getObject(fields[i].getName()));
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;

}
@Override
public List<T> findAll() {
// TODO Auto-generated method stub
sql = this.getSql(SQL_SELECTALL);
List<T>list = new ArrayList<T>();
T obj,t = null;
try {
argType = setArgs(t, SQL_SELECT);
statement = JdbcUtils.getPreparedStatement(sql);
statement = JdbcUtils.setPreparedStatementParam(statement,
argType);
rs = statement.executeQuery();
Field fields[] = EntityClass.getDeclaredFields();
while (rs.next()) {
obj = EntityClass.newInstance();
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
fields[i].set(obj, rs.getObject(fields[i].getName()));
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}

// sql拼接函数 形如 : insert into User(id,username,password,email,grade) values(?,?,?,?,?)
private String getSql(String operator) {

StringBuffer sql = new StringBuffer();
// 通过反射获取实体类中的所有变量
Field fields[] = EntityClass.getDeclaredFields();

// 插入操作
if (operator.equals(SQL_INSERT)) {
sql.append("insert into " + EntityClass.getSimpleName());
sql.append("(");
for (int i = 0; fields != null && i < fields.length; i++) {
fields[i].setAccessible(true); //这句话必须要有,否则会抛出异常.
String column = fields[i].getName();
sql.append(column).append(",");
}
sql = sql.deleteCharAt(sql.length() - 1);
sql.append(") values (");
for (int i = 0; fields != null && i < fields.length; i++) {
sql.append("?,");
}
sql.deleteCharAt(sql.length() - 1);
// 是否需要添加分号
sql.append(")");
} else if (operator.equals(SQL_UPDATE)) {
sql.append("update " + EntityClass.getSimpleName() + " set ");
for (int i = 0; fields != null && i < fields.length; i++) {
fields[i].setAccessible(true);
String column = fields[i].getName();
if (column.equals("id")) {
continue;
}
sql.append(column).append("=").append("?,");
}
sql.deleteCharAt(sql.length() - 1);
sql.append(" where id=?");
} else if (operator.equals(SQL_DELETE)) {
sql.append("delete from " + EntityClass.getSimpleName()
+ " where id=?");
} else if (operator.equals(SQL_SELECT)) {
sql.append("select * from " + EntityClass.getSimpleName()
+ " where id=?");
}else if (operator.equals(SQL_SELECTALL)) {
sql.append("select * from " + EntityClass.getSimpleName()
);
}
return sql.toString();
}

// 获取参数.
private Object[] setArgs(T entity, String operator)
throws IllegalArgumentException, IllegalAccessException {

Field fields[] = EntityClass.getDeclaredFields();
if (operator.equals(SQL_INSERT)) {

Object obj[] = new Object[fields.length];
for (int i = 0; obj != null && i < fields.length; i++) {
fields[i].setAccessible(true);
obj[i] = fields[i].get(entity);
}
return obj;

} else if (operator.equals(SQL_UPDATE)) {

Object Tempobj[] = new Object[fields.length];
for (int i = 0; Tempobj != null && i < fields.length; i++) {
fields[i].setAccessible(true);
Tempobj[i] = fields[i].get(entity);
}

Object obj[] = new Object[fields.length];
System.arraycopy(Tempobj, 1, obj, 0, Tempobj.length - 1);
obj[obj.length - 1] = Tempobj[0];
return obj;

} else if (operator.equals(SQL_DELETE)) {

Object obj[] = new Object[1];
fields[0].setAccessible(true);
obj[0] = fields[0].get(entity);
return obj;
} else if (operator.equals(SQL_SELECT)) {

Object obj[] = new Object[1];
fields[0].setAccessible(true);
obj[0] = fields[0].get(entity);
return obj;
}else if (operator.equals(SQL_SELECTALL)){
Object obj[] = new Object[1];
fields[0].setAccessible(true);
obj[0] = fields[0].get(entity);
return obj;
}
return null;
}

}

实体类


测试类 Test
public class Test {
/**
* @param args
*/
public static void main(String args[]) throws SQLException {
// TODO Auto-generated method stub

List<Layer_tbl>list = null;
BaseDaoImpl imp = new BaseDaoImpl();
list = imp.findAll();
for(Layer_tbl layer_tbl:list){
System.out.println(layer_tbl.getLayerKeyID_grp()+" "+layer_tbl.getLayerId_grp()+" "+layer_tbl.getLayerElementID_grp()+" "+layer_tbl.getLayerPid_grp()+" "+layer_tbl.getProjectId_grp());
}

}
}
实体类Layer_tbl 字段在测试类里面有。字数限制就没贴。
然后测试的时候显示空指针
...全文
176 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_34052254 2017-01-05
  • 打赏
  • 举报
回复
引用 12 楼 qnmdcsdn 的回复:
[quote=引用 10 楼 qq_34052254 的回复:]
[quote=引用 7 楼 qnmdcsdn 的回复:]
打断点看下fields得到值没

而且在测试 添加新数据的方法时 也报错了-_-.[/quote]

很明显,这是sql拼错了,打印出来看看[/quote]


EntityClass没拿到 然后field 取不到值 然后sql语句也没取对
qq_34052254 2017-01-05
  • 打赏
  • 举报
回复
引用 12 楼 qnmdcsdn 的回复:
[quote=引用 10 楼 qq_34052254 的回复:] [quote=引用 7 楼 qnmdcsdn 的回复:] 打断点看下fields得到值没
而且在测试 添加新数据的方法时 也报错了-_-.[/quote] 很明显,这是sql拼错了,打印出来看看[/quote]这个SQL出错时因为OBJECT没拿到值。
qq_34052254 2017-01-05
  • 打赏
  • 举报
回复
引用 7 楼 qnmdcsdn 的回复:
打断点看下fields得到值没
没拿到值 好像是Entityclass开始就没拿到类。所以后面后面再sql执行的时候Object都没有赋值。 sql语句 比如说 全部展示 还是"select * from Object"
  • 打赏
  • 举报
回复
引用 10 楼 qq_34052254 的回复:
[quote=引用 7 楼 qnmdcsdn 的回复:] 打断点看下fields得到值没
而且在测试 添加新数据的方法时 也报错了-_-.[/quote] 很明显,这是sql拼错了,打印出来看看
qq_34052254 2017-01-05
  • 打赏
  • 举报
回复
引用 9 楼 qnmdcsdn 的回复:
[quote=引用 8 楼 qq_34052254 的回复:] [quote=引用 7 楼 qnmdcsdn 的回复:] 打断点看下fields得到值没
在哪打断点-_- 萌新刚学到框架。还没打过断点做测试[/quote] Field fields[] = EntityClass.getDeclaredFields(); 刚上来就玩这,玩的有点大啊,打到上边那一行[/quote] 还好吧。因为代码的意思和逻辑我都能看明白。而且这属于基础的泛型吧。想通过这个做一个通用的CRUD以后就不用再自己敲了
qq_34052254 2017-01-05
  • 打赏
  • 举报
回复
引用 7 楼 qnmdcsdn 的回复:
打断点看下fields得到值没

而且在测试 添加新数据的方法时 也报错了-_-.
  • 打赏
  • 举报
回复
引用 8 楼 qq_34052254 的回复:
[quote=引用 7 楼 qnmdcsdn 的回复:] 打断点看下fields得到值没
在哪打断点-_- 萌新刚学到框架。还没打过断点做测试[/quote] Field fields[] = EntityClass.getDeclaredFields(); 刚上来就玩这,玩的有点大啊,打到上边那一行
qq_34052254 2017-01-05
  • 打赏
  • 举报
回复
引用 7 楼 qnmdcsdn 的回复:
打断点看下fields得到值没
在哪打断点-_- 萌新刚学到框架。还没打过断点做测试
  • 打赏
  • 举报
回复
打断点看下fields得到值没
qq_34052254 2017-01-05
  • 打赏
  • 举报
回复
引用 5 楼 qnmdcsdn 的回复:
// EntityClass = (Class<T>) GenericsUtils.getSuperClassGenricType().getActualTypeArguments()[0];
Class<T> EntityClass = GenericsUtils.getSuperClassGenricType(BasicService.class, 0);

标红的去掉
又出现了下标越界的问题。。其实我不太懂这个方法
  • 打赏
  • 举报
回复
// EntityClass = (Class<T>) GenericsUtils.getSuperClassGenricType().getActualTypeArguments()[0]; Class<T> EntityClass = GenericsUtils.getSuperClassGenricType(BasicService.class, 0); 标红的去掉
qq_34052254 2017-01-05
  • 打赏
  • 举报
回复
引用 2 楼 qnmdcsdn 的回复:
空指针报到哪一行了

qq_34052254 2017-01-05
  • 打赏
  • 举报
回复
这个泛型CRUD是网上查找的。最开始的时候是获取类转型错误。用了工具类之后报了空指针。 使用的事maven 和SPring MVC
  • 打赏
  • 举报
回复
空指针报到哪一行了
qq_34052254 2017-01-05
  • 打赏
  • 举报
回复
反射工具类

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * Created by Administrator on 2017/1/4.
 */
public class GenericsUtils {
    /**
           * 通过反射,获得定义Class时声明的父类的范型参数的类型.
          * 如public BookManager extends GenricManager<Book>
          *
           * @param clazz The class to introspect
           * @return the first generic declaration, or <code>Object.class</code> if cannot be determined
     */
     public static Class getSuperClassGenricType(Class clazz) {
                return getSuperClassGenricType(clazz, 0);
            }

             /**
      * 通过反射,获得定义Class时声明的父类的范型参数的类型.
      * 如public BookManager extends GenricManager<Book>
              *     *
       * @param clazz clazz The class to introspect
       * @param index the Index of the generic ddeclaration,start from 0.
      */
             public static Class getSuperClassGenricType(Class clazz, int index) throws IndexOutOfBoundsException {

                 Type genType = clazz.getGenericSuperclass();

                if (!(genType instanceof ParameterizedType)) {
                         return Object.class;
                     }

                 Type[] params = ((ParameterizedType) genType).getActualTypeArguments();

                 if (index >= params.length || index < 0) {
                       return Object.class;
                    }
                 if (!(params[index] instanceof Class)) {
                        return Object.class;
                     }
                 return (Class) params[index];
            }
}
实体类

public class Layer_tbl {
    public int layerKeyID_grp;
    public int projectId_grp;
    public int layerPid_grp;
    public String layerElementID_grp;
    public String layerId_grp;

    public Layer_tbl(int layerKeyID_grp, int projectId_grp, int layerPid_grp, String layerElementID_grp, String layerId_grp) {
        this.layerKeyID_grp = layerKeyID_grp;
        this.projectId_grp = projectId_grp;
        this.layerPid_grp = layerPid_grp;
        this.layerElementID_grp = layerElementID_grp;
        this.layerId_grp = layerId_grp;
    }

    public Layer_tbl() {
    }

    public int getLayerKeyID_grp() {
        return layerKeyID_grp;
    }

    public void setLayerKeyID_grp(int layerKeyID_grp) {
        this.layerKeyID_grp = layerKeyID_grp;
    }

    public int getProjectId_grp() {
        return projectId_grp;
    }

    public void setProjectId_grp(int projectId_grp) {
        this.projectId_grp = projectId_grp;
    }

    public int getLayerPid_grp() {
        return layerPid_grp;
    }

    public void setLayerPid_grp(int layerPid_grp) {
        this.layerPid_grp = layerPid_grp;
    }

    public String getLayerElementID_grp() {
        return layerElementID_grp;
    }

    public void setLayerElementID_grp(String layerElementID_grp) {
        this.layerElementID_grp = layerElementID_grp;
    }

    public String getLayerId_grp() {
        return layerId_grp;
    }

    public void setLayerId_grp(String layerId_grp) {
        this.layerId_grp = layerId_grp;
    }
}

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧