-
面向接口编程---源码详细步骤 加载配置信息... 通过配置信息加载一个代理工厂Map: 这个Map存放的是接口Class与对应的代理工厂 通过接口的Class从代理工厂取出对应的代理工厂 通过代理工厂实例化一个代理类 用这个代理类将代理实例返回出去 通过接口与method获取对应的配置文件信息: 接口名.方法名==namspace.id 通过配置文件中的信息获取SQL语句类型 根据SQL语句类型调用sqlSession对应的增删改查方法 当SQL语句类型是查询时: 根据返回值类型是List,Map,Object 分别调用selectList,selectMap,selectObject方法查看全部
-
查看一个接口的所有实现类:选中接口名,Ctrl+T 或者选中该接口名,按F4,即 Open Type Hierarchy IMessage imessage=sqlSession.getMapper(IMessage.class);//获取到的就是代理实例 messageList =imessage.queryMessageList(parameter);//代理实例执行接口方法时,就会触发调用处理程序,也就是第三个参数对象的invoke()方法,MapperProxy是实现了InvocationHandler接口的 MapperProxyFactory.newInstance(MapperProxy<T> mapperProxy){ --return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader()//通过接口获取类加载器,new Class[]{mapperInterface}//代理类实现的接口数组,mapperProxy//调用代理实例的处理程序) --} 解决了三个问题: 1、为什么只定义了一个接口,没有实现类的情况下,接口方法可以被调用,因为动态代理。 2、为什么sqlSession.getMapper(.class)可以根据传入的参数,返回一个对应的类型,因为泛型。 3、Mybatis加载文件时,利用namespace加载了一个class,然后把这个class与代码中传入接口的class进行匹配,方法执行所需要的信息就是来自于已经匹配成功的配置文件中,当结果与配置文件对应上后,调用接口的方法执行sql语句。查看全部
-
大顶堆查看全部
-
来龙去脉查看全部
-
Mybatis中接口式编程原理: 接口式编程: 条件:Mybatis的配置文件的namespace要设置为接口全限类名,接口的方法名对应配置文件语句标签的id. 如果不使用spring整合Mybatis,则调用时需要通过SqlSession.getMapper(接口.class)方法获取接口的引用(已有指向),因为接口是没有实现类的,无法实例化.然后再调用接口的方法. Imessage imessage=sqlSession.getMapper(Imessage.class); imessage.selectByPK(String indexid); 如果使用spring整合,则SqlSession交由spring管理. 直接使用@Autowired注解实例化接口的引用(spring会设置). 调用时直接根据接口的引用调用方法. 实际中:通常把dao接口的实现类直接与Mybatis的配置文件相关联,在ServiceImpl中声明dao的引用,使用spring的自动装配注解标识,然后直接调用dao接口的方法,Mybatis就会根据对应的接口名(即namespace)去到对应的配置文件去寻找对应的方法(即标签id). 直接调用接口的方法就能够找到对应配置文件的对应标签,是根据动态代理的原理.查看全部
-
/*动态代理,接口没有实现类.Mybatis为接口提供实现类,即用Proxy.newProxyInstance()创建代理实例,返回类型为Object,利用泛型强制转换*/ IMessage imessage = sqlSession.getMapper(IMessage.class); /*代理实例调用接口方法时,并不会执行,而是触发 MapperProxy.invoke(),其中包含sqlSession.selectList(namespace.id,parameter)*/ /*至于为什么会包含,因为接口方法与(加载Mybatis的)配置信息对应得上,即 接口名.方法=namespace.id*/ messageList = imessage.queryMessageList(message);查看全部
-
1、配置文件数据源会托管给Spring管理,DB层消失。 2、DAO sqlSession会托管给Spring,组织 3、组织对象应给让service层来做 4、通过sqlSession调用接口编程统统由Spring来实现,整个DAO层会消失 5、Imessage小三上位,才是真正的DAO层,最后整个DAO层就是接口文件和配置文件查看全部
-
接口式编程mybatis Sql配置文件的namespace名称对应接口的权限类名. Sql配置文件中对应的sql语句的标签的id对应接口的方法名. 接口中方法的参数对应sql语句标签的parameterType类型. 调用接口:通过sqlSession.getMapper(接口.class)获取到接口的引用(并没有实例化接口,方法也没有被实现,但是却可以调用接口中的方法,是因为有动态代理),再调用接口中的方法即可.查看全部
-
111查看全部
-
过程啊查看全部
-
xxx查看全部
-
接口式编程mybatis Sql配置文件的namespace名称对应接口的权限类名. Sql配置文件中对应的sql语句的标签的id对应接口的方法名. 接口中方法的参数对应sql语句标签的parameterType类型. 调用接口:通过sqlSession.getMapper(接口.class)获取到接口的引用(并没有实例化接口,方法也没有被实现,但是却可以调用接口中的方法,是因为有动态代理),再调用接口中的方法即可.查看全部
-
查看一个接口的所有实现类:选中接口名,Ctrl+T 或者选中该接口名,按F4,即 Open Type Hierarchy IMessage imessage=sqlSession.getMapper(IMessage.class);//获取到的就是代理实例 messageList =imessage.queryMessageList(parameter);//代理实例执行接口方法时,就会触发调用处理程序,也就是第三个参数对象的invoke()方法,MapperProxy是实现了InvocationHandler接口的 MapperProxyFactory.newInstance(MapperProxy<T> mapperProxy){ --return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader()//通过接口获取类加载器,new Class[]{mapperInterface}//代理类实现的接口数组,mapperProxy//调用代理实例的处理程序) --} 解决了三个问题: 1、为什么只定义了一个接口,没有实现类的情况下,接口方法可以被调用,因为动态代理。 2、为什么sqlSession.getMapper(.class)可以根据传入的参数,返回一个对应的类型,因为泛型。 3、Mybatis加载文件时,利用namespace加载了一个class,然后把这个class与代码中传入接口的class进行匹配,方法执行所需要的信息就是来自于已经匹配成功的配置文件中,当结果与配置文件对应上后,调用接口的方法执行sql语句。查看全部
-
/*动态代理,接口没有实现类.Mybatis为接口提供实现类,即用Proxy.newProxyInstance()创建代理实例,返回类型为Object,利用泛型强制转换*/ IMessage imessage = sqlSession.getMapper(IMessage.class); /*代理实例调用接口方法时,并不会执行,而是触发 MapperProxy.invoke(),其中包含sqlSession.selectList(namespace.id,parameter)*/ /*至于为什么会包含,因为接口方法与(加载Mybatis的)配置信息对应得上,即 接口名.方法=namespace.id*/ messageList = imessage.queryMessageList(message);查看全部
-
批量新增查看全部
举报
0/150
提交
取消