//使用jdk动态代理来为dao接口生成代理对象并返回<br> Object proxyInstance = Proxy.newProxyInstance(DefaultSqlSession.class.getClassLoader(), new Class[]{mapperClass}, new InvocationHandler() {<br> public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {<br><br> //获取方法名, 也就是id<br> String methodName = method.getName();<br><br> //获取方法对应的类的全限定名<br> String className = method.getDeclaringClass().getName();<br><br> String statementId = className + "." + methodName;<br><br> //获得返回值类型<br> Type genericReturnType = method.getGenericReturnType();<br> //判断是否进行了泛型类型参数化<br> if (genericReturnType instanceof ParameterizedType){<br> List<Object> objects = selectList(statementId, args);<br> return objects;<br> }<br> return selectOne(statementId,args);<br> }<br> });
public <E> List<E> selectList(String statementid, Object... params) throws Exception {<br><br> //将要去完成simpleExecutor里的query方法的调用<br> SimpleExecutor simpleExecutor = new SimpleExecutor();<br> MappedStatement mappedStatement = configuration.getMappedStatementMap().get(statementid);<br> List<Object> list = simpleExecutor.query(configuration, mappedStatement, params);<br><br> return (List<E>) list;<br> }
<br> //1. 注册驱动, 获取连接<br> Connection connection = configuration.getDataSource().getConnection();<br><br> //2. 获取sql语句<br> String sql = mappedStatement.getSql();<br> BoundSql boundSql = getBoundSql(sql);<br><br> //3.获取预处理对象preparedStatement<br> PreparedStatement preparedStatement = connection.prepareStatement(boundSql.getSqlText());<br><br> //4. 设置参数 获取参数的全限定名, 然后获取对应的class<br> String parameterType = mappedStatement.getParameterType();<br> Class<?> parameterTypeClass = getClassType(parameterType);<br><br> List<ParameterMapping> parameterMappingList = boundSql.getParameterMappingList();<br> for (int i = 0; i < parameterMappingList.size(); i++) {<br> Field declaredField = parameterTypeClass.getDeclaredField(parameterMappingList.get(i).getContent());<br> //暴力访问<br> declaredField.setAccessible(true);<br> Object o = declaredField.get(params[0]);<br><br> preparedStatement.setObject(i + 1, o);<br><br> }<br><br> //5. 执行sql<br> ResultSet resultSet = preparedStatement.executeQuery();<br><br> //6. 封装返回结果集<br> String resultType = mappedStatement.getResultType();<br> Class<?> resultTypeClass = getResultType(resultType);<br> ArrayList<Object> objects = new ArrayList();<br><br> while (resultSet.next()) {<br> Object o = resultTypeClass.newInstance();<br> ResultSetMetaData metaData = resultSet.getMetaData();<br> for (int i = 1; i <= metaData.getColumnCount(); i++) {<br> //字段名<br> String columnName = metaData.getColumnName(i);<br> //字段值<br> Object value = resultSet.getObject(columnName);<br><br> //使用内省和反射完成封装<br> PropertyDescriptor propertyDescriptor = new PropertyDescriptor(columnName, resultTypeClass); //获取类对应参数的读写方法的对象<br> Method writeMethod = propertyDescriptor.getWriteMethod();<br> writeMethod.invoke(o, value);<br> }<br> objects.add(o);<br> }<br>