-
在使用拦截器开发分页的时候,拦截器的参数(Invocation)中保存了拦截器所拦截的所有对象,根据方法签名,这里仅仅只是对statementHandler中的关键信息进行处理,原理就是使用分页的sql替换拦截到的原始sql,拦截对象类型是StatementHandler,由方法签名决定的,StatementHandler将对配置文件中的sql语句进行处理(sql语句在MappedStatement中),但是在StatementHandler中,所有的对象属性均为受保护的以及私有的,首先想到的是通过反射读写信息,幸好Mybatis已经有一个类MetaObject,有个方法 MetaObject.forObject(statementHandler,__,__)可以对注解的拦截方法签名所对应的对象进行包装,这样我们得到的是被包装的statementHandler,它可以通过getValue("delegate.mappedStatement")方法,得到想要任何属性;当我们得到原始sql并拼接page参数的时候,通过原始sql对象的BoundSql.getParameterObject()便可以拿到page参数,这样分页sql就可以拼接完成了,但是还需要给page对象设置总页数,总页数是个难点,需要在原始的sql语句上拼接 select count(*),这里的问题在于sql是否能执行以及如何执行,需要connection对象,而此对象就是方法签名的参数,可以通过invocation.getArgs()[0]获得,然后通过connection.prepareStatement(countSql)将拼接好的sql语句进行预编译,并执行,就可以获得结果,由于此结果是统计总数的,只有一条记录,将此记录转换为int类型,并赋值给page对象。查看全部
-
使用BoundSql的getParameterObject()的方法,里面的入参就是正常调用Mapper的方法,获取查询结果对象的的参数,这里就是Map<String,Object>parameter,通过BoundSql的getParameterObject()的方法,可以获得入参对象,由于这个对象是一个map,封装了xml配置文件中执行sql语句时候的参数,所以可以这个对象获得分页查询limit关键字所需要的(起始页)和(每页显示记录数)parameter.getKey();查看全部
-
@SQL语句里的limit使用方法 SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了上面这样一个功能。 LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。 mysql> SELECT * FROM table LIMIT 5,10; //检索记录行6-15 //为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last. //如果只给定一个参数,它表示返回最大的记录行数目: mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行 //换句话说,LIMIT n 等价于 LIMIT 0,n。 案例: SELECT * FROM table LIMIT 0,5;//0、1、2、3、4 SELECT * FROM table LIMIT 5,5;//5、6、7、8、9 SELECT * FROM table LIMIT 10,5;//10、11、12、13、14查看全部
-
动态代理,接口没有实现类.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);查看全部
-
动态代理:接口没有实现类的方法也能执行之一查看全部
-
接口式编程,通过定义接口来规范调用方法的参数、返回值等,防止人为的输入错误和配置文件冲突 需要将接口的路径配置到namespace中,然后通过sqlSession.getMapper(接口类.class).接口方法; 不需要自定义类去实现接口方法查看全部
-
代码分离查看全部
-
mybatis优缺点查看全部
-
sql查看全部
-
学习方法查看全部
-
模拟过程查看全部
-
动态代理过程查看全部
-
接口是编程原理查看全部
-
面向接口编程---源码详细步骤查看全部
-
面向接口编程---对应关系查看全部
举报
0/150
提交
取消