反射技术将查询结果封装为对象_编写一个基本的连接池来实现连接的复用
反射技术将查询结果封装为对象-------------------------------------------------------------------
通过的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); } } }