开发中在不用数据库的情况下操作数据库,比如说对数据库的增删改查,每次都重新撸一遍重复的代码,那样就会很麻烦,这里就给安利一个很简单的工具类来对数据库进行读写操作,当然并不能涵盖所有的功能,说了,只是很简单的操作数据库,当然你可以直接使用框架来操作,那样更好。。。
话不多说,直接上代码。。。
public class DBOperate<T> {
private static Connection connection = null;
private static PreparedStatement statement = null;
private static ResultSet query = null;
private static ResultSetMetaData metaData = null;
/**
* 增删改 操作
* @param sql
* @param params
* @return
*/
public static int operateDB(String sql,Object...params){
int value = -1;
try {
connection = DBManager.getConnection();
connection.setAutoCommit(false);
statement = connection.prepareStatement(sql);
for(int i = 0;i<params.length;i++){
statement.setObject(i+1, params[i]);
}
System.out.println(sql);
value = statement.executeUpdate();
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
if(connection!=null){
try {
connection.rollback();
connection.setAutoCommit(true);
} catch (SQLException e1) {
e1.printStackTrace();
}
}
} finally {
DBManager.closeAll(statement,connection);
}
return value;
}
/**
* 获取集合
* @param sql
* @param clazz
* @param params
* @return
*/
public List<T> getList(String sql,Class<T> clazz,Object...params){
List<T> list = new ArrayList<>();
try {
connection = DBManager.getConnection();
statement = connection.prepareStatement(sql);
for(int i = 0;i<params.length;i++){
statement.setObject(i+1, params[i]);
}
query = statement.executeQuery();
metaData = query.getMetaData();
int column = metaData.getColumnCount();
while(query.next()){
T t = clazz.newInstance();
for(int i = 1;i<=column;i++){
String name = metaData.getColumnName(i);
Object value = query.getObject(i);
Field field = clazz.getDeclaredField(name);
field.setAccessible(true);
field.set(t, value);
}
list.add(t);
}
} catch (SQLException | InstantiationException | IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} finally {
DBManager.closeAll(query,statement,connection);
}
return list;
}
/**
* 获取对象
* @param sql
* @param clazz
* @param params
* @return
*/
public T getInstance(String sql,Class<T> clazz,Object...params){
try {
connection = DBManager.getConnection();
statement = connection.prepareStatement(sql);
for(int i = 0;i<params.length;i++){
statement.setObject(i+1,params[i]);
}
query = statement.executeQuery();
metaData = query.getMetaData();
int column = metaData.getColumnCount();
if(query.next()){
T t = clazz.newInstance();
for(int i = 1;i<=column;i++){
String name = metaData.getColumnName(i);
Object value = query.getObject(i);
Field field = clazz.getDeclaredField(name);
field.setAccessible(true);
field.set(t, value);
}
return t;
}
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}finally {
DBManager.closeAll(statement,connection);
}
return null;
}
}
这里面会有DBManager类,主要就是连接数据库和关闭的,可以自行补全。
很简单,简单使用反射的方法来给每一个属性赋值,然后返回就行。。。
当我们要使用的时候就可以这样:
public class StudentDaoImpl extends DBOperator<Student> {
public List<Student> getList() {
String sql = "select * from student";
return super.getList(sql, Student.class);
}
public Student getStudentById(int id) {
String sql = "select * from student where id=?";
return super.getInstance(sql, GoodsInfo.class, id);
}
}
Over。
写的不好,欢迎指正,不喜勿喷!!!