为了账号安全,请及时绑定邮箱和手机立即绑定

通过自动回复机器人学Mybatis---加强版

难度中级
时长 2小时43分
学习人数
综合评分9.77
214人评价 查看评价
9.9 内容实用
9.7 简洁易懂
9.7 逻辑清晰
  • 其他相关代码: @Message.xml <select id=”queryMessageListByPage” parameterType=”java.util.Map” resultMap=”MessageResult”> select <include refid=”columns”></include> from MESSAGE <where> <if test=”message.command != null and !”“.equals(message.command.trim())”> and COMMAND=#{message.command} </if> <if test=”message.description != null and !”“.equals(message.description.trim())”> and DESCRIPTION like ‘%’ #{message.description} ‘%’ </if> </where> order by ID </select> @Configuration.xml <plugins> <!— <plugin interceptor=”com.imooc.interceptor.PageInterceptor” ></plugin> 如果不需要初始化参数(setProperties()),则直接这条语句即可 —> <plugin interceptor=”com.imooc.interceptor.PageInterceptor”> <property name=”test” value=”abc”></property> </plugin> </plugins> Ps:一个拦截器对应一个<plugin>。
    查看全部
    0 采集 收起 来源:拦截器总结

    2018-03-22

  • 通过BoundSql获得原始的sql语句之后,再次使用的是BoundSql的getParameterObject()来获取配置文件中的参数,因为得到的参数是一个map,调用对象的get方法得到Page对象,得到page对象之后就可以拼接分页sql了。metaObject.setValue(“delegate.boundSql.sql”,pageSql)修改原本不可以修改的值,修改原来的属性值为新的sql。 mybatis通过Invocation这个参数的proceed()方法交回主权,这个方法的源码 return method.invoke(target,args)
    查看全部
  • 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
    查看全部
  • 由于mappedstatement是statementhandler的protect属性,不是同包也不是子类,所以无法正常获取该属性,可以采用反射来获取。见截图。
    查看全部
  • 实现拦截器需要实现三个方法:①intercept(Invocation invacation) ② plugin(Object target)方法参数就是被拦截的对象target,返回的就是满足条件的代理类,Plugin.wrap(target,this):this也就是自定义拦截器实例,通过获取注解得到要拦截的类型,比较target的类型与this获取的要拦截的类型是不是一致,如果满足条件就获取代理对象,并执行intercept方法,没有获取代理对象的将直接返回,不会经过intercept方法。
    查看全部
  • 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,然后在塞回去,让程序继续执行,这样就成功了。
    查看全部
  • 在获取sql语句时候进行拦截
    查看全部
  • 分页查询的过程:当页面提交一个查询的页码到servlet,servlet接收到这个参数之后,先创建一个page对象,将请求的页码设置到page的currentPage属性中,然后将这个对象交给service层,调用Dao层,根据当前的查询条件查询出总条数,设置到totalnumber上,Page类根据这两个参数计算出总页数以及分页查询时所需要的查询起始页dbIndex以及每页显示多少条记录dbNumber,然后将这两个参数传给Dao层,Dao将这些参数传递给配置文件,配置文件根据传入参数执行sql语句,将查询结果返回,Page对象也一层一层的返回到页面上,页面就可以根据page 对象显示总条数、当前页以及总页数。当通过url直接访问页面或者第一次访问页面时,直接进servlet,默认查询第一页也就是把page对象的currentpage属性设置为1,然后把page对象传递给service层,调用dao查询总条数,调用IMessage接口的count方法,返回查询的总记录数,service将这个值设置到totalNumber属性中,在调用setTotalNumber()方法时,方法会自动调用count()方法,去计算总页数以及分页需要的参数(Message 和page),然后将page对象传递给Dao层。Dao将查询结果返回,知道在页面上显示信息。
    查看全部
  • 明明知道 jquery.min.js 这个的代码是没问题的,但在myeclipse中还是会出现一个红色叉叉的错误. 网上找到的方法是设置myeclipse忽略这个错误. jquery.min.js -> 鼠标右键 -> MyEclipse -> manage validation -> 左面点击 -> Excluded resources -> 找到jquery.min.js -> 打上钩 -> apply
    查看全部
    0 采集 收起 来源:接口式编程

    2018-03-22

  • 接口式编程
    查看全部
    0 采集 收起 来源:接口式编程

    2016-06-22

  • 作业留给孙悟空 1.先定义一个接口代替案例中的IMessage接口,定义一个接口方法,参数类型返回值类型随意,注意实现invoke()方法的时候遵循定义的返回值类型,然后创建相应类型的对象返回即可。 2.然后再创建一个类实现了InvocationHandler接口的,然后再实现invoke()方法,通过反射打印出被代理的接口名以及方法名即可 3.创建一个sqlSession类代替mybatis 中的SqlSession接口。在这里也写一个getMapper()方法,这个方法主要做两件事,①根据接口与代理类创建一个代理实例;②根据泛型,将代理实例强制转换 4.然后在main方法中创建一个sqlsession对象,去调用getMapper方法,传递一个自定义接口的class做参数,再用自定义接口类型承接这个值,然后在用这个对象去调用接口的方法。
    查看全部
  • mybatis代理工厂以及执行sqlSession执行方法全过程源码分析
    查看全部
  • 接口方法与配置文件中sql语句对应上的关键源码
    查看全部
  • 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//调用代理实例的处理程序) --} 解决了三个问题: ①为什么只定义了一个接口,没有具体实现的情况下,接口方法可以被调用,因为动态代理。 ②为什么sqlSession.getMapper(.class)可以根据传入的参数,返回一个对应的类型,因为泛型。 ③Mybatis加载文件时,利用namespace加载了一个class,然后把这个class与代码中传入接口的class进行匹配,方法执行所需要的信息就是来自于已经匹配成功的配置文件中,当结果与配置文件对应上后,调用接口的方法执行sql语句。
    查看全部
  • 最终结论 imessage.queryMessageList(parameter)===>sqlSession.selectList(namespace.id,parameter)
    查看全部

举报

0/150
提交
取消
课程须知
本课程的前导课程为《通过自动回复机器人学 Mybatis ---基础版》, 课程中案例的关联性极强,所以学习本课程唯一的条件就是学习过《通过自动回复机器人学 Mybatis ---基础版》
老师告诉你能学到什么?
1、 Mybatis 的接口式编程 2、实现分页查询 3、通过拦截器实现分页共通来了解 Mybatis 的拦截器 4、通过如何用数组做参数来了解 Mybatis 对类型的处理 5、 Mybatis 如何实现 jdbc 的 addBatch ,即批量插入

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!