import javax.naming.spi.DirStateFactory;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class DBHelper {
// private static final String DRIVER = "com.mysql.jdbc.Driver";
// private static final String URL = "jdbc:mysql://101.12.102.10:3306/test";
//private static final String USER = "root";
//private static final String PASSWORD = "123456";

private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://rm-2ze66k2qxc95j13nl.mysql.rds.aliyuncs.com:3306/longfor_mdm";
private static final String USER = "wydb003_rw";
private static final String PASSWORD = "vzXYZ5h3MiDntZDtuCFE";

private static DBHelper ins;

public static DBHelper ins() {
if (ins == null) {
ins = new DBHelper();
}
return ins;
}


/**
* 连接数据库
*
* @return 链接数据库对象
*/
public Connection getConnection() {
Connection conn = null;
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
conn = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}

/**
* 释放相应的资源
*
* @param rs
* @param pstmt
* @param conn
*/
public void closeAll(ResultSet rs, PreparedStatement pstmt, Connection conn) {
try {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

/**
* 此方法可以完成增删改所有的操作
*
* @param sql
* @param params
* @return true or false
*/
public boolean excuteUpdate(String sql, List<Object> params) {
int res = 0;//受影响的行数
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);//装载sql语句
if (params != null) {
//加入有?占位符,在执行之前把?占位符替换掉
for (int i = 0; i < params.size(); i++) {
pstmt.setObject(i + 1, params.get(i));
}
}
res = pstmt.executeUpdate();

} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
closeAll(rs, pstmt, conn);
}
return res > 0 ? true : false;
}

/**
* 使用泛型方法和反射机制进行封装
*
* @param sql
* @param params
* @param cls
* @return
*/
public <T> List<T> executeQuery(String sql, List<Object> params, Class<T> cls) throws Exception {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
System.out.println("123");

List<T> data = new ArrayList<T>();
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);//装载sql语句
if (params != null) {
//加入有?占位符,在执行之前把?占位符替换掉
for (int i = 0; i < params.size(); i++) {
pstmt.setObject(i + 1, params.get(i));
}
}
rs = pstmt.executeQuery();
System.out.println("456");

//把查询出来的记录封装成对应的实体类对象
ResultSetMetaData rsd = rs.getMetaData();//获得列对象,通过此对象可以得到表的结构,包括,列名,列的个数,列的数据类型
while (rs.next()) {
T m = cls.newInstance();
for (int i = 0; i < rsd.getColumnCount(); i++) {
String col_name = rsd.getColumnName(i + 1);//获得列名
Object value = rs.getObject(col_name);//获得列所对应的值
col_name=col_name.toLowerCase();


Field field = cls.getDeclaredField(col_name);
field.setAccessible(true);//给私有属性设置可访问权
field.set(m, value);//给对象的私有属性赋值
}
data.add(m);
}

} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
closeAll(rs, pstmt, conn);
}
return data;
}


public ResultSet executeQuerySql(String sql) {
DirStateFactory.Result result = null;
ResultSet rst = null;
PreparedStatement pst = null;
Connection con=this.getConnection();
try {

pst = this.getConnection().prepareStatement(sql);

rst = pst.executeQuery();


} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// closeAll(rst, pst, con);
}
return rst;
}
}