代码如下:
用法是:传入一个类名 ,sql语句,参数是可变的
用法是:传入一个类名 ,sql语句,参数是可变的
package org.ywq.common.utils;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.ywq.entity.User;
/**
* @author ai5qiangshao E-mail:ai5qiangshao@163.com
* @version 创建时间:Aug 22, 2009 5:44:43 PM
* @Package org.ywq.common.utils
* @Description 类说明
*/
public class DBUtis<T> {
private PreparedStatement psmt;
private Connection conn;
public DBUtis() {
this.getConnection();
}
public Connection getConnection() {
Connection conn = null;
String className = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/hibernate";
try {
Class.forName(className);
conn = DriverManager.getConnection(url, "root", "root");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
public static void main(String[] args) throws Exception {
DBUtis<User> db = new DBUtis<User>();
List<User> usList = db.executeQuery(User.class,
"select * from user limit 10");
for (User user : usList) {
System.out.println(user.getUname());
}
DBUtis<User> db2 = new DBUtis<User>();
User u = db2.executeQueryByPk(User.class,
"select * from user where uid=?", 33);
System.out.println(u.getUname());
}
public List<T> executeQuery(Class<T> clazz, String sql, Object... params) {
List<T> list = new ArrayList<T>();
ResultSet rs = null;
try {
this.preparedStatement(sql, params);
rs = this.psmt.executeQuery();
while (rs.next()) {
ResultSetMetaData table = rs.getMetaData();
T o = clazz.newInstance();
invokeSetter(clazz, rs, table, o);
list.add(o);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
close(rs);
}
return list;
}
/***************************************************************************
* 根据主键查询
*
* @param clazz
* @param sql
* @param params
* 查询参数
* @return
*/
public T executeQueryByPk(Class<T> clazz, String sql, Object... params) {
T o = null;
ResultSet rs = null;
try {
this.preparedStatement(sql, params);
rs = this.psmt.executeQuery();
o = null;
if (rs.next()) {
ResultSetMetaData table = rs.getMetaData();
o = clazz.newInstance();
invokeSetter(clazz, rs, table, o);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
this.close(rs);
}
return o;
}
public Integer exucuteUpdate(String sql, Object... params) {
Integer result = 0;
try {
this.preparedStatement(sql, params);
result = this.psmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
this.close();
}
return result;
}
private void close(ResultSet rs) {
try {
if (rs != null)
rs.close();
if (this.psmt != null)
psmt.close();
if (this.conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
private void close() {
this.close(null);
}
private void preparedStatement(String sql, Object... params)
throws SQLException {
this.psmt = this.getConnection().prepareStatement(sql);
setParams(params);
}
private void setParams(Object[] params) throws SQLException {
if (params != null) {
for (int i = 0; i < params.length; i++) {
this.psmt.setObject(i + 1, params[i]);
}
}
}
/***************************************************************************
* 核心代码
*
* @param clazz
* @param rs
* @param table
* //表结构
* @param o
* @throws Exception
*/
private void invokeSetter(Class<?> clazz, ResultSet rs,
ResultSetMetaData table, Object o) throws Exception {
for (int i = 0; i < table.getColumnCount(); i++) {
String column = table.getColumnName(i + 1);
String setter = "set" + column.substring(0, 1).toUpperCase()
+ column.substring(1);
String getter = "get" + column.substring(0, 1).toUpperCase()
+ column.substring(1);
Method getterM = clazz.getDeclaredMethod(getter);
Method setterM = clazz.getDeclaredMethod(setter,
new Class[] { getterM.getReturnType() });
setterM.invoke(o, rs.getObject(column));
}
}
}