新人开发-JAVA 泛型CRUD-测试时 空指针。
接口baseDao
实现BaseDaoImpl
实体类
测试类 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 字段在测试类里面有。字数限制就没贴。
然后测试的时候显示空指针
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 字段在测试类里面有。字数限制就没贴。
然后测试的时候显示空指针
...全文
相关推荐
通用DAO
每次写sql语句的时候都非常恼火,这种体力活还真不是人干的,没一点技术含量,自己终于研究了半天的java反射机制,利用它写了这个通用的dao,终于省去了好多的功夫.
Java泛型DAO设计模式详解与实践
数据访问对象(Data Access Object,简称DAO)是软件设计模式中的一种,用于将低级数据访问层与高级业务逻辑层分离的一种抽象。DAO模式通常通过封装数据库操作(如CRUD:创建、读取、更新、删除),以简化业务逻辑层的代码。DAO通常包含了与数据库交互所需的所有方法,它能将数据源的变化对业务逻辑层的影响降到最低,增强系统的可维护性和可扩展性。在Java中,DAO通常通过接口与实现类来定义,使得具体的数据访问逻辑与业务逻辑代码分离,从而提高了代码的可维护性。
Java深入解析篇六之泛型
泛型(Generics)是 JDK 5(2004年,JSR-14)引入的核心特性,本质是参数化类型(Parameterized Types)——将类型作为参数传递给类、接口或方法,实现编译期类型安全检查与代码复用。 痛点: 1.4 泛型的核心价值 价值 说明 类型安全 将 ClassCastException 从运行时提前到编译期 消除强转 代码更简洁、可读性更强 代码复用 一套算法/容器适配多种类型 框架基石 集合框架、Spring、ORM、函数式编程的核心机制 1.5 J
AddressBookCollection
地址簿集
DBHelp
NULL 博文链接:https://lk617238688.iteye.com/blog/859955


