-
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}})(分别表示接口、方法、参数)查看全部
-
在为Mybatis配置文件的sql标签传递参数时,sql语句的参数定义在dao方法的参数中. 然后在Mybatis的sql语句标签中使用parameterType或者parameterMap来定义传递的参数是什么类型. 然后在sql标签中直接使用#{dao方法参数名}获取参数值. 如果是map类型.则使用#{key}. 如果是model类型,则直接使用#{属性名} 如果参数不止一个,则应该把参数封装到map类型中即可. parameterMap一般用于调用存储过程时使用. parameterMap指定参数关联对象.然后配置文件中配置该关联对象: <parameterMap id="t" type=""> <parameter property="map的key" mode="IN/OUT(存储过程参数类型)" jdbcType=""/> //表示map中的某个属性名的值,对应存储过程的IN/OUT参数. </parameterMap> <insert id="" parameterMap="t" statementType="CALLABLE"> call 存储过程(?,?,?...) </insert> 然后在serviceImp中配置该map然后作为dao方法的参数.查看全部
-
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). 直接调用接口的方法就能够找到对应配置文件的对应标签,是根据动态代理的原理.查看全部
-
在使用拦截器开发分页的时候,拦截器的参数(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语句的id,注意metaObject的getValue()方法,ognl取值的顺序,否则什么也娶不到。查看全部
-
mybatis作业查看全部
-
mybatis接口式编程原理查看全部
-
mybatis parameterType数组查看全部
-
mybatis代理工厂以及执行sqlSession执行方法全过程源码分析查看全部
-
四个部分查看全部
-
本章的最终源码是利用拦截器实现分页。对于分页的简单实现,需要修改QueryService.java类中代码。增加语句"page.count();"获取limit两个参数dbIndex,dbNumber。否则页面加载不了数据,代码调试时会发现limit的两个参数为0。查看全部
-
拦截确定对象的类中的参数与映射文件中的对应。所有属性均与配置文件中的属性对应。 通过mybatis中的mateobject类的.forObject()的就可以将statement处理器进行包装,其返回的对象还是mateobject类类型,但是这个时候,对象中就已经包含了配置文件中执行sql语句相关的所有属性。查看全部
-
调用sqlsession.getMapper(定义的接口.class),就可以获得接口。然后就可以调用接口的方法了。查看全部
-
好过分查看全部
举报
0/150
提交
取消