
这个接口中只有两个方法:
getParameterObject 方法用于读取参数。
setParameters用于对ParameterHandler的参数赋值。
参数处理器对象时在创建StatementHandler对象时同时被创建的,由configuration对象负责创建。
创建时传入三个对象:mappedStatement(执行SQL对应的配置信息)、parameterObject、boundSql。
注意:一个BoundSql对象,代表了SQL语句的一次执行,而SqlSource对象的责任就是根据传入的参数对象动态计算出这个BoundSql,也就是说Mapper文件中的节点的计算是由SqlSource对象完成的。SqlSource最常用是实现类是DynamicSqlSource。
看看上述的实参10是如何添加到对应的SQL语句中的
在MyBatis中,使用动态代理模式,当dao.findByDeptNo(10)将要执行的时候,会被JVM进行拦截交给MyBatis中的代理实现类MapperProxy中的invoke方法。
最后交给ParameterHandler中setParameter方法,将参数交给对应占位符。
读取ParameterObject参数对象,然后用typeHandler对参数进行设置,而typeHandler里面需要对jdbcType和javaType进行处理,设置参数。所以使用TypeHandler的时候完全可以控制如何设置SQL参数。
ResultSetHandler接口主要负责两件事:
你需要了解sql语句的拼接和一般字符串的拼接的异同.例如:在sql脚本语句中,字符串用单引号'',这些在C#语句中拼接"sql语句"字符串时需要注意.
你可以在vs.net中写一个用字符串拼接的sql语句,最后把它赋值给一个字符串对象.然后用断点调试区查看生成的sql语句的结果,一般sql语句较长,验证的方式都是把这段sql语句copy到sql sever的脚本文件(.sql)中去执行一下,就知道是否正确了.当然也有先在sql server 中调试好拼接字符串后再copy到程序代码中去修改的.具体方式不定.
(以上是介绍的拼接sql语句方法,不过这种方式的安全性不高,常见的sql注入式攻击就是利用的拼接sql语句的缺陷.)
你还可以考虑使用带参数的存储过程来实现,这个就需要了解存储过程的一些知识了,具体的方法我就不介绍了,关于带参数的存储过程,网上有很多例子参考.
MappedStatement维护了一条<select|update|delete|insert>节点的封装
比如Mapper.xml中一个<select />节点
转换成Java类就是一个MappedStatement
使用Configuration的getMappedStatement方法来获取MappedStatement对象
获取的方式key的组成为 命名空间+id
负责根据用户传递的parameterObject, 动态地生成SQL语句 ,将信息封装到BoundSql对象中,并返回
表示动态生成的SQL语句以及相应的参数信息
当调用SqlSource的getBoundSql方法,传入的就是parameterMappings相对应的参数,最终生成BoundSql对象,有了BoundSql就可以执行sql语句了
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)