-
接口式编程规避XML配置名字出错风险。Spring利用此机制:1)数据源配置托管给Spring;2)sqlSession托管给Spring;3)组织对象(查询参数)工作移交给Service;4)接口由Spring自动实现。 最终只剩下接口与Mapper.xml查看全部
-
为了规避namespace.与sql关联的id,传入的参数,返回值这种写法容易出错的毛病, 采用接口试编程。 mybatis接口式编程的步骤: 1.创建一个接口 2.统一命名空间【接口所在类的全线类名作为xml文件的namespace】 2.想要为哪条SQL语句代言,就在接口中定义和id相同名的方法 3.SQL语句的返回值类型就是接口的返回值类型查看全部
-
批量新增查看全部
-
通过拦截器实现分页的思路:在获取sql语句前拦截查看全部
-
1242查看全部
-
mybatis的拦截器实现分页(动态代理) 拦截sql语句来实现分页 1.拦截什么样的对象(以page作为参数传入;page对象) 2.拦截对象什么行为 3.什么时候拦截 (在prepareStatement的时候拦截) (源码) 1.RoutingStatementHandler 2.通过RoutingStatementHandler对象的属性delegate找到statement实现类BaseStatementHandler 3.通过BaseStatementHandler类的反射得到对象的MappedStatement对象 4.通过MappedStatement的属性getID得到配置文件sql语句的ID 5.通过BaseStatementHandler属性的到原始sql语句 6.拼接分页sql( 1.需要查询总数的sql 2.通过拦截Connection对象得到PrepareStatement对象 3.得到对应的参数 4.把参数设到prepareStatement对象里的?(该?号在配置文件以#{}形式存在,mybatis会把它转为?号) 5.执行噶sql语句 6.得到总数 ) 7.把属性值为新的sql查看全部
-
mybatis获取statement其实是在statementHandler中,这是一个处理接口,有个prepare方法,返回Statement,这个方法是在BaseStatementHandler中实现的,statement是在instantiateStatement这个方法中获取的,这个方法是一个抽象方法,看它的PrepareStatementHandler实现,在这里边看到了connection.prepareStatement(sql,PreparedStatement.),也就是和JDBC类似的代码了,这就是分页拦截器要拦截的位置了。如何实现拦截呢?mybatis提供了相应的注解:@Intercept({@Signnature(type=StatementHandler.class),method=“prepare”,args={Connection.class}}) ①type指向要连接的接口class,这里指向StatementHandler.class, ②Method指向要拦截的方法,这里是prepare ③args[]拦截的方法的参数类型,这里是Connection.class 这样就准确描述了要拦截StatementHandler接口下的prepare方法。目标确定,接下来就可以做手脚了,在PrepareStatementHandler拿到sql语句之前将这个sql语句改装成我们的分页sql,然后在塞回去,让程序继续执行,这样就成功了。查看全部
-
实现拦截器需要实现三个方法:①intercept(Invocation invacation) ② plugin(Object target)方法参数就是被拦截的对象target,返回的就是满足条件的代理类,Plugin.wrap(target,this):this也就是自定义拦截器实例,通过获取注解得到要拦截的类型,比较target的类型与this获取的要拦截的类型是不是一致,如果满足条件就获取代理对象,并执行intercept方法,没有获取代理对象的将直接返回,不会经过intercept方法。查看全部
-
@list.jsp部分代码 <div class='page fix'> 共 <b>${page.totalNumber}</b> 条 <c:if test="${page.currentPage != 1}"> <a href="javascript:changeCurrentPage('1')" class='first'>首页</a> <a href="javascript:changeCurrentPage('${page.currentPage-1}')" class='pre'>上一页</a> </c:if> 当前第<span>${page.currentPage}/${page.totalPage}</span>页 <c:if test="${page.currentPage != page.totalPage}"> <a href="javascript:changeCurrentPage('${page.currentPage+1}')" class='next'>下一页</a> <a href="javascript:changeCurrentPage('${page.totalPage}')" class='last'>末页</a> </c:if> 跳至 <input id="currentPageText" type='text' value='${page.currentPage }' class='allInput w28' /> 页 <a href='javascript:changeCurrentPage($(' #currentPageText').val()') class='go'>GO</a> </div> <!--js代码--> /** * 修改当前页码,调用后台重新查询 */ function changeCurrentPage(currentPage){ $("#currentPage").val(currentPage); $("#mainForm").submit(); }查看全部
-
面向接口编程---源码详细步骤 加载配置信息... 通过配置信息加载一个代理工厂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语句。查看全部
-
接口代言配置文件里的SQL语句步骤: 0.创建一个接口 1.首先统一命名空间【这里的命名空间地址是接口所在的位置作为xml文件的namespace】 2.想要为哪条SQL语句代言,就在接口中定义和id相对应(同名)的方法 3.SQL语句的返回值类型就是接口的返回值类型 通过mybaits获取接口 同时接口不能实例化! 通过sqlSession获取接口 Message message = new Message(); IMessage imessage = sqlSession.getMapper(IMessage.class); List<message> messageList = imessage.queryMessageList(message);查看全部
-
动态代理,接口没有实现类,Mybatis为接口提供实现类,即用Proxy.newProxyInstance()创建代理实例,返回类型为Object,利用泛型强制转换:IMessage imessage = sqlSession.getMapper(IMessage.class); 1、代理实例调用接口方法时,并不会执行,而是触发 MapperProxy.invoke()方法,其中包含 sqlSession.selectList(namespace.id,parameter); 2、至于为什么会包含,因为接口方法与(加载Mybatis的)配置信息对应得上,即 接口名.方法 = namespace.id 最终得到结论:imessage.queryMessageList(parameter)==sqlSession.selectList(namespace.id,parameter);查看全部
-
面向接口编程---源码详细步骤 加载配置信息... 通过配置信息加载一个代理工厂Map: 这个Map存放的是接口Class与对应的代理工厂 通过接口的Class从代理工厂取出对应的代理工厂 通过代理工厂实例化一个代理类 用这个代理类将代理实例返回出去 通过接口与method获取对应的配置文件信息: 接口名.方法名==namspace.id 通过配置文件中的信息获取SQL语句类型 根据SQL语句类型调用sqlSession对应的增删改查方法 当SQL语句类型是查询时: 根据返回值类型是List,Map,Object 分别调用selectList,selectMap,selectObject方法 3查看全部
-
接口代言配置文件里的SQL语句步骤: 0.创建一个接口 1.首先统一命名空间【这里的命名空间地址是接口所在的位置作为xml文件的namespace】 2.想要为哪条SQL语句代言,就在接口中定义和id相对应(同名)的方法 3.SQL语句的返回值类型就是接口的返回值类型 通过mybaits获取接口 同时接口不能实例化! 通过sqlSession获取接口 Message message = new Message(); IMessage imessage = sqlSession.getMapper(IMessage.class); List<message> messageList = imessage.queryMessageList(message);查看全部
举报
0/150
提交
取消