反射技术将查询结果封装为对象_编写一个基本的连接池来实现连接的复用
反射技术将查询结果封装为对象-------------------------------------------------------------------
通过的ORMTest类的getUser方法,
传入sql语句,及需要封装对象的class.
可复用
ORMTest.java
package com.dwt1220;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
public class ORMTest {
public static void main(String[] args) throws Exception {
User user=getUser("select id as Id, name as Name from user;",User.class);
System.out.println(user);
}
static <T>T getUser(String sql,Class<T> clazz) throws Exception{
Connection conn = null;
PreparedStatement ps = null;//使用PreparedStatement防止SQL注入
ResultSet rs = null;
T obj=null;
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
ResultSetMetaData rsmd=rs.getMetaData();
int count=rsmd.getColumnCount();
String[] colNames=new String[count];
for(int i=1;i<=count;i++){
colNames[i-1]=rsmd.getColumnLabel(i);
}
Method[] ms=clazz.getMethods();
if(rs.next()){
obj=clazz.newInstance();
for(int i=0;i<colNames.length;i++){
String colName=colNames[i];
String methodName="set"+colName;
System.out.println(methodName);
for(Method m:ms){
if(methodName.equals(m.getName())){
m.invoke(obj, rs.getObject(colName));
System.out.println(rs.getObject(colName));
}
}
}
}
} finally {
JdbcUtils.free(rs, ps, conn);
}
return (T) obj;
}
}
编写一个基本的连接池来实现连接的复用------------------------------------------------------------------------
pool类:MyDataSource.java
工具类:JdbcUtils.java
测试类:Base.java
MyDataSource.java
package com.dwt1220;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
public class MyDataSource {
private static String url = "jdbc:mysql://localhost:3306/jdbc";
private static String user = "root";
private static String password = "123456";
private static int initCount=5;
private static int maxCount=10;
private int currentCount=0;
private LinkedList<Connection> connectionsPool = new LinkedList<Connection>();
public Connection createConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
public MyDataSource() {
try {
for (int i = 0; i < initCount; i++) {
this.connectionsPool.addLast(this.createConnection());
this.currentCount++;
}
} catch (SQLException e) {
throw new ExceptionInInitializerError(e);
}
}
public Connection getConnection() throws SQLException{
synchronized (connectionsPool) {
if(this.connectionsPool.size()>0)
return this.connectionsPool.remove();
if(this.currentCount<maxCount){
this.currentCount++;
return this.createConnection();
}
throw new SQLException("已经没有连接");
}
}
public void free(Connection conn){
this.connectionsPool.addLast(conn);
}
}
JdbcUtils.java
package com.dwt1220;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;
public final class JdbcUtils {
public static MyDataSource myDataSource = null;
private JdbcUtils() {
}
static {// 静态代码快,只执行一次。
// 注册驱动
try {
Class.forName("com.mysql.jdbc.Driver");
myDataSource = new MyDataSource();
} catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError(e);
}
}
public static Connection getConnection() throws SQLException {
return myDataSource.getConnection();
}
public static void free(ResultSet rs, Statement st, Connection conn) {
try {
if (rs != null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (st != null)
st.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (conn != null)
myDataSource.free(conn);
}
}
}
}
Base.java
package com.dwt1220;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Base {
public static void main(String[] args) throws Exception {
for(int i=0;i<10;i++){
Connection conn=JdbcUtils.getConnection();
System.out.println(conn);
JdbcUtils.free(null, null, conn);
}
}
}