-
SqlSession.selectList容易出错查看全部
-
总结下自己的理解,大体上就是mybatis在运行前获取配置文件中命名空间对应的接口,并生成代理工程map集合。当用户把对应接口传入时候,从工厂集合中找到对应的代理工厂,从代理工厂中生成代理类的实例返回给用户调用。
而代理类里面实现接口方法是靠一个很巧妙的方法,他先获取调用方法名和类名,把类名+方法名就是对应配置文件里面的对应sql语句。然后代理方法就判断这个sql是什么类型的(查找、增加、删除),并用sqlSession对应方法调用该sql语句,最后把返回值返回给用户。
查看全部 -
过程过程啊
查看全部 -
mybatis拦截器需要具备的功能:
1、拦截需要拦截的操作
2、完成一种具体的功能
3、工作完成后将完成结果移交
查看全部 -
接口式编程作业:
查看全部 -
解决接口式编程的几个问题:
1、没有实现类的接口为什么能执行定义的方法?
通过动态代理的方式。
2、mybatis如何知道调用的哪条sql语句?(MapperProxy.invoke()==sqlqSession.selectList())
3、用接口接返回的对象不报错(IMessage iMessage = Proxy.neProxyInstance())?
泛型在起作用,mybatis在返回对象时已经做了强制类型转换,无需自己手动转换
查看全部 -
mybatis接口式编程:
如果没有使用接口式编程,需要在dao层手动调用SqlSession的方法直接访问xml文件。
接口式编程则不然,建立一个对应xml的接口,通过SqlSession.getMapper()方法进行实例化,可以直接使用该接口的方法。
接口式编程主要结合spring一起使用,数据源管理将由spring托管,db层将消失,SqlSessin将托管给spring,组织对象的代码移交给service层,通过SqlSession实现接口式编程的代码由spring实现,dao层消失,接口将成为正式的dao层,dao层只有接口文件和配置文件。
查看全部 -
查看一个接口的所有实现类:选中接口名,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 Sql配置文件的namespace名称对应接口的权限类名. Sql配置文件中对应的sql语句的标签的id对应接口的方法名. 接口中方法的参数对应sql语句标签的parameterType类型. 调用接口:通过sqlSession.getMapper(接口.class)获取到接口的引用(并没有实例化接口,方法也没有被实现,但是却可以调用接口中的方法,是因为有动态代理),再调用接口中的方法即可. public List<Command> getCommand(){ SqlSession sqlSession=Util.getSqlSession(); ICommand com=sqlSession.getMapper(ICommand.class); List<Command> list=com.getCommand(); return list; }
查看全部 -
这三个方法的执行顺序
setProperties(Properties properties)拿到属性值
plugin(Object target)对要拦截对象进行过滤
intercept(Invocation invocation)执行拦截
查看全部 -
而以这种形式配置,就可以通过这个方法拿到属性值
private String test;
@Override
public void setProperties(Properties properties) {
this.test = properties.getProperty("test");
// TODO Auto-generated method stub
}
查看全部 -
当在配置文件中这样配置plugins标签时
<plugins>
<plugin interceptor="com.kingback.interceptor.PageInterceptor" />
</plugins>
拦截器中的setProperties()方法没用
查看全部 -
需要了解什么
查看全部 -
拦截器注意事项
查看全部 -
拦截器要做什么
查看全部
举报