您的位置:首页 > 其它

通用Dao方法

2015-09-19 12:07 441 查看
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;

public class RDao {

/**
* 通过表明获取数据库中表的列明
* @param tableName
* @return
*/
public ArrayList<String> getAllColumn(String tableName){
ArrayList<String> ar = new ArrayList<String>();
Connection  conn = BaseConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
//1=2不成立只能查出来列明
String sql = "select * from "+tableName+" where 1=2";
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();

ResultSetMetaData metedata = rs.getMetaData();
int colum = metedata.getColumnCount();
for (int i=1;i<=colum;i++) {
String columnName = metedata.getColumnName(i);
ar.add(columnName);
}

} catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps, rs);
}

return ar;
}
/**
* 通过元数据获得数据列明,数据类型等
*
* 两者的区别R可以获得SQL语句查询出来的所有的列明
* D只可以获取单表列明以及列的所有的属性
*
* @param tableName
* @return
*/
public ArrayList<String> getAllColumns(String tableName){
ArrayList<String> ar = new ArrayList<String>();
Connection  conn = BaseConnection.getConnection();
ResultSet rs = null;
try {
//数据库元数据对象,就是数据库数据对象
DatabaseMetaData dbm = conn.getMetaData();
rs = dbm.getColumns(null, "%", tableName, "%");
while (rs.next()) {
String columnName = rs.getString("COLUMN_NAME");
String columnType = rs.getString("TYPE_NAME");
String datasize = rs.getString("COLUMN_SIZE");
String digits = rs.getString("DECIMAL_DIGITS");
String nullable = rs.getString("NULLABLE");
ar.add(columnName);
}

} catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, rs);
}

return ar;

}

public boolean insert(Object ob){
boolean b = false;
Connection  conn = BaseConnection.getConnection();
PreparedStatement ps = null;

Class cl = ob.getClass();

Field[] fi = cl.getDeclaredFields();

ArrayList<String >col = getAllColumn(cl.getSimpleName());

StringBuffer sb = new StringBuffer();
StringBuffer sb1 = new StringBuffer();

sb.append("insert into ");
sb.append(cl.getSimpleName());
sb.append("(");
for (int i=1;i<col.size();i++) {
sb.append(col.get(i));
sb1.append("?");
if (i != col.size()-1) {
sb.append(",");
sb1.append(",");
}
}
sb.append(")values(");
sb.append(sb1);
sb.append(")");

try {
ps = conn.prepareStatement(sb.toString());
for (int i=1;i<col.size();i++) {
for (Field ff:fi) {
if (ff.getName().equals(col.get(i))) {
ff.setAccessible(true);
ps.setObject(i, ff.get(ob));
break;

}
}
}

int a = ps.executeUpdate();
if (a > 0) {
b = true;
}

} catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps);
}

return b;
}

//需求是现在有一个表,这个表是一个订单表(订单号,订单时间,订单人)
//                             33  20150101 zhang
//                       从表订单详细表     编号     订单号  商品名 数量
//                                   1    33   ku 2
//                                   2    33   qun 3
//依次订单有好多数据,我们插入数据的时候就是先插入订单表,然后再插入订单详细表,再插入订单详细表的时候你是需要订单表中的订单号的。

public int insertGetKey(Object ob) {

int id = 0;
Connection  conn = BaseConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;

Class cl = ob.getClass();

Field[] fi = cl.getDeclaredFields();

ArrayList<String >col = getAllColumn(cl.getSimpleName());

StringBuffer sb = new StringBuffer();
StringBuffer sb1 = new StringBuffer();

sb.append("insert into ");
sb.append(cl.getSimpleName());
sb.append("(");
for (int i=1;i<col.size();i++) {
sb.append(col.get(i));
sb1.append("?");
if (i != col.size()-1) {
sb.append(",");
sb1.append(",");
}
}
sb.append(")values(");
sb.append(sb1);
sb.append(")");

try {
ps = conn.prepareStatement(sb.toString());
for (int i=1;i<col.size();i++) {
for (Field ff:fi) {
if (ff.getName().equals(col.get(i))) {
ff.setAccessible(true);
ps.setObject(i, ff.get(ob));
break;

}
}
}

int a = ps.executeUpdate();
if (a > 0) {
////获得主键,主键必须是递增,还有必须是添加的方法才能获得主键
rs = ps.getGeneratedKeys();
if (rs.next()) {
id = rs.getInt(1);
}
}

} catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps);
}

return id;

}

//删除自己写根据id删除

public boolean deleteById(Class cl,int id) {

boolean b = false;

Object ob = null;
Connection  conn = BaseConnection.getConnection();
PreparedStatement ps = null;

Field[] fi = cl.getDeclaredFields();
//获得表中的所有列
ArrayList<String> col = getAllColumns(cl.getSimpleName());

StringBuffer sb = new StringBuffer();
sb.append("delete ");

sb.append("from ");
sb.append(cl.getSimpleName());
sb.append("where");
sb.append(col.get(0));
sb.append("?");

try {
ps = conn.prepareStatement(sb.toString());
ps.setInt(1, id);
int a = ps.executeUpdate();

if (a>0) {
b = true;
}

} catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps);
}

return b;

}

/**
* 这个方法是不需要的,没有意义,直接忘记,还获取不到值
* @param ob
* @return
*/
public int updateGetKey(Object ob){
int id = 0;
Connection  conn = BaseConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
Class cl = ob.getClass();

Field[] fi = cl.getDeclaredFields();

ArrayList<String >col = getAllColumn(cl.getSimpleName());

StringBuffer sb = new StringBuffer();

sb.append("update ");
sb.append(cl.getSimpleName());
sb.append(" set");

for (int i=1;i<col.size();i++) {
sb.append(col.get(i));
sb.append("?");
if (i != col.size()-1) {
sb.append(",");

}
}

sb.append(" where");
sb.append(col.get(0));
sb.append("=?");

try {
ps = conn.prepareStatement(sb.toString());
for (int i=1;i<col.size();i++) {
for (Field ff:fi) {
if (ff.getName().equals(col.get(i))) {
ff.setAccessible(true);
ps.setObject(i, ff.get(ob));
break;

}
}
}

fi[0].setAccessible(true);
ps.setObject(col.size(), fi[0].get(ob));
int a = ps.executeUpdate();
if (a > 0) {
//获得主键,主键必须是递增,还有必须是添加的方法才能获得主键
rs = ps.getGeneratedKeys();
if (rs.next()) {
id = rs.getInt(1);
}
}

} catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps);
}

return id;
}

public boolean update(Object ob){
boolean b = false;
Connection  conn = BaseConnection.getConnection();
PreparedStatement ps = null;

Class cl = ob.getClass();

Field[] fi = cl.getDeclaredFields();

ArrayList<String >col = getAllColumn(cl.getSimpleName());

StringBuffer sb = new StringBuffer();

sb.append("update ");
sb.append(cl.getSimpleName());
sb.append(" set");

for (int i=1;i<col.size();i++) {
sb.append(col.get(i));
sb.append("?");
if (i != col.size()-1) {
sb.append(",");

}
}

sb.append(" where");
sb.append(col.get(0));
sb.append("=?");

try {
ps = conn.prepareStatement(sb.toString());
for (int i=1;i<col.size();i++) {
for (Field ff:fi) {
if (ff.getName().equals(col.get(i))) {
ff.setAccessible(true);
ps.setObject(i, ff.get(ob));
break;

}
}
}

fi[0].setAccessible(true);
ps.setObject(col.size(), fi[0].get(ob));
int a = ps.executeUpdate();
if (a > 0) {
b = true;
}

} catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps);
}

return b;
}

/**
*
* @param cl
* @param name 数据库中的列明
* @param value
* @return
*/
public ArrayList getListByLike(Class cl,String name,Object value) {

ArrayList ar = new ArrayList();
Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
Field[] fi = cl.getDeclaredFields();
ArrayList<String> col = getAllColumns(cl.getName());
StringBuffer sb = new StringBuffer();
sb.append("select ");
for (int i=0;i<col.size();i++) {
sb.append(col.get(i));
if (i != col.size()-1) {
sb.append(",");
}
}

sb.append(" from");
sb.append(cl.getSimpleName());
sb.append(" where ");
sb.append(name);
sb.append(" like '%");
sb.append(value);
sb.append("%'");
//like 语句不支持占位符

try {
ps = conn.prepareStatement(sb.toString());

rs = ps.executeQuery();

while (rs.next()) {
Object obj = cl.newInstance();
for (String str:col) {
for (Field ff:fi) {
if (str.equals(ff.getName())) {
ff.setAccessible(true);
ff.set(obj, rs.getObject(ff.getName()));
break;
}
}
}

ar.add(obj);

}

} catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps, rs);
}

return ar;

}

/**
* 该方法用于所有的查询
* 注意:尽量保证链接表中数据 除了主外键关联的外,尽量不要使用重复的表列名
* @param 查询出来的数据放到那个类中 实体类中
* @param sql 查询的sql语句
* @param obs 所有的条件
* @return
*/
public ArrayList getListBySqlX(Class cl,String sql,Object[]obs){
Connection conn = BaseConnection.getConnection();
ArrayList ar = new ArrayList();
PreparedStatement ps = null;
ResultSet rs = null;
Field[] fi = cl.getDeclaredFields();

ArrayList<String> col = new ArrayList<String>();
try {
ps = conn.prepareStatement(sql);

//获得数据表中的列
ResultSetMetaData metaData = rs.getMetaData();
int column = metaData.getColumnCount();
for (int i=1;i<=column;i++) {
String columnName = metaData.getColumnName(i);
col.add(columnName);
}
for (int i=0;i<obs.length;i++) {
ps.setObject(i+1, obs[i]);
}
rs = ps.executeQuery();
while (rs.next()) {
Object ob = cl.newInstance();
for (String str:col) {
for (Field ff:fi) {
if (str.equals(ff.getName())) {
ff.setAccessible(true);
ff.set(ob, rs.getObject(ff.getName()));
break;
}
}
}
ar.add(ob);
}

} catch (Exception e) {
// TODO: handle exception
}finally{
BaseConnection.close(conn, ps, rs);
}
return ar;
}

public ArrayList getListBySome(Class cl,String name,Object value) {

ArrayList ar = new ArrayList();

Connection  conn = BaseConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;

Field[] fi = cl.getDeclaredFields();
//获得表中的所有列
ArrayList<String> col = getAllColumns(cl.getSimpleName());

StringBuffer sb = new StringBuffer();
sb.append("select ");
for (int i=0;i<col.size();i++) {
sb.append(col.get(i));
if (i != col.size()-1) {
sb.append(",");
}
}
sb.append("from ");
sb.append(cl.getSimpleName());
sb.append(" where ");
sb.append(name);
sb.append(" =? ");

try {
ps = conn.prepareStatement(sb.toString());
ps.setObject(1, value);
rs = ps.executeQuery();

while (rs.next()) {
Object obj = cl.newInstance();
for (String str:col) {
for (Field ff:fi) {
if (str.equals(ff.getName())) {
ff.setAccessible(true);
ff.set(obj, rs.getObject(ff.getName()));
break;
}
}
}

ar.add(obj);

}

} catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps, rs);
}

return ar;

}

public Object getObById(Class cl,int id){

Object ob = null;
Connection  conn = BaseConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;

Field[] fi = cl.getDeclaredFields();
//获得表中的所有列
ArrayList<String> col = getAllColumns(cl.getSimpleName());

StringBuffer sb = new StringBuffer();
sb.append("select ");
for (int i=0;i<col.size();i++) {
sb.append(col.get(i));
if (i != col.size()-1) {
sb.append(",");
}
}
sb.append("from ");
sb.append(cl.getSimpleName());
sb.append("where");
sb.append(col.get(0));
sb.append("?");

try {
ps = conn.prepareStatement(sb.toString());
ps.setInt(1, id);
rs = ps.executeQuery();

while (rs.next()) {
Object obj = cl.newInstance();
for (String str:col) {
for (Field ff:fi) {
if (str.equals(ff.getName())) {
ff.setAccessible(true);
ff.set(obj, rs.getObject(ff.getName()));
break;
}
}
}

}

} catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps, rs);
}

return ob;

}

public ArrayList getList(Class cl){
ArrayList ar = new ArrayList();
Connection  conn = BaseConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;

Field[] fi = cl.getDeclaredFields();
//获得表中的所有列
ArrayList<String> col = getAllColumns(cl.getSimpleName());

StringBuffer sb = new StringBuffer();

sb.append("select");
for (int i=0;i<col.size();i++) {
sb.append(col.get(i));
if (i != col.size()-1) {
sb.append(",");
}
}

sb.append("from");

sb.append(cl.getSimpleName());

try {
ps = conn.prepareStatement(sb.toString());
rs = ps.executeQuery();

while (rs.next()) {
Object obj = cl.newInstance();
for (String str:col) {
for (Field ff:fi) {
if (str.equals(ff.getName())) {
ff.setAccessible(true);
ff.set(obj, rs.getObject(ff.getName()));
break;
}
}
}
ar.add(obj);

}

} catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps, rs);
}

return ar;
}

public static void main(String[] args) {

}

}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: