解决用户手动调用的问题,让用户使用更加的便捷
    我们可以设计方法将sql语句放在注解中,为了解决用户手动调用的问题,可以采用代理模式去找人帮他完成这个调用的过程dialing模式
    使用代理对象之前,代理对象代替的那个人是谁,替那个人做了什么
    代理的那个人需要被创建成接口
    怎么创建代理对象
    代理对象 = Proxy.newProxyInstance();
    public T getMapper(Class clazz){
    return(T)Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, new InvocationHandler() {
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    这个方法就是代理对象具体该做的方法
    代替 帮助原来的DAO做事情的
    原来的DAO调用SqlSession对象去做事
    proxy就是这个代理对象
    method被代理的那个方法(要方法上面注解里的Sql)
    args被代理的那个方法的参数(存储的是Sql上的那些所需的值)

    1. 1.获取被代理的那个方法上面的注解<br /> Annotation an = method.getAnnotations()[0];//an是一个注解对象<br /> 2.获取这个注解的类型----->决定一会儿找SqlSession的哪个方法<br /> Class type = an.annotationType();//@Insert @Delete<br /> 3.获取这个注解里面的SQL<br /> Method valueMethod = type.getDeclaredMethod("value");<br /> 4.执行注解对象里的那个value方法<br /> String sql = (String)valueMethod.invoke(an);<br /> 5.对args做一个简单的处理 基础类型 map domain 没有<br /> Object param = args==null?null:args[0];判断的目的是找寻SqlSession方法时判断重载的(具体执行哪个方法<br /> 6.根据type注解的类型判断该调用sqlSession中的哪个方法<br /> if(type == Insert.class){<br /> SqlSession.this.insert(sql,param);<br /> }else if(type == Delete.class){<br /> SqlSession.this.delete(sql,param);<br /> }else if(type == Update.class){<br /> SqlSession.this.update(sql,param);<br /> }else if(type == Select.class){<br /> 根据注解名字无法确定单条 多条<br /> 解析method方法的返回值<br /> 获取method返回值类型<br /> Class methodReturnTypeClass = method.getReturnType();<br /> if(methodReturnTypeClass==List.class){//多条<br /> ¥¥解析methodReturnTypeClass里面的那个泛型类<br /> ¥¥获取的是方法返回值的具体类型(java.util.List<domain.Atm>)<br /> Type returnType = method.getGenericReturnType();<br /> ¥¥将returnType还原成可以被操作的<br /> ParameterizedTypeImpl realReturnType = (ParameterizedTypeImpl)returnType;<br /> ¥¥操作返回值类型中的泛型类<br /> Type[] patternTypes = realReturnType.getActualTypeArguments();//获取是泛型类<br /> ¥¥ 获取数组中的第一个类domain.Atm<br /> Type patternType = patternTypes[0];<br /> ¥¥强制类型转换成Class<br /> Class patternClass = (Class)patternType;<br /> return SqlSession.this.selectList(sql,param,patternClass);<br /> }else{单条<br /> return SqlSession.this.selectOne(sql,param,methodReturnTypeClass);<br /> }<br /> }<br /> return null;<br /> }<br /> });<br />}<br />总结:<br />了解代理对象的使用,多多复习本次框架的封装