-
课后作业:查看全部
-
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)查看全部
-
调用invoke()方法时,是如何知道要执行的sql语句是什么样子的嘞?查看全部
-
没有实现类的接口,为什么能执行定义的方法?(自行查看mybatis源码) 主要是通过动态代理来实现的 具体细节如下图查看全部
-
解析配置文件中sql语句的全过程--XMLStatementBuilder下的parseStatementNode()方法解析。查看全部
-
mapper.xml配置文件解析的全过程查看全部
-
解析指定的mapperr的esource资源具体的实现代码截图查看全部
-
如何通过主配置文件读取<mappers>下的<mapper>中的resource资源路径:截图为具体源码查看全部
-
将配置文件中的<congfiguration>节点传递给XMLConfigBuilder的parseConfiguration(XNode)方法来解析,截图是parseConfiguration解析mybatis配置文件的全过程,阅读源码的方式递归阅读。查看全部
-
在jdbc中批量插入可以遍历循环一次次插入边执行,这样效率很不好,所以使用addBatch(),然后执行executeBatch(),那么在mybatis中如何实现批量插入的呢?mybatis是要自己在配置文件配置sql语句,所以根据mysql数据库的insert语句拼接出相应的sql,insert into 表名 values(数据1,数据2…),(数据1,数据2…),…即可,所以传入的参数是list,最后forEach标签循环出来数据拼接sql语句 ————————<foreach collection=”lsit” item=”item” separator="," > —————————(#{item.content},#{item.commandId}) ---------------</foreach>查看全部
-
先注册,在写实现查看全部
-
@PageInterceptor.java相关代码——(中): if(id.matches(”.+ByPage$”)){ BoundSql boundSql=statementHandler.getBoundSql(); //原始的SQL语句,但是当中的#{}改为? String sql=boundSql.getSql(); //查询总条数的SQL语句 String countSql=”select count(*) from (”+sql+”)a”; Connection conn=(Connection) invocation.getArgs()[0]; PreparedStatement countStatement= conn.prepareStatement(countSql); /** * 解决当中的#{}改为?后的参数传递问题 */ ParameterHandler parameterHandler=(ParameterHandler) metaObject.getValue(”delegate.parameterHandler”); parameterHandler.setParameters(countStatement); ResultSet rs=countStatement.executeQuery(); //获取的是Dao层中的“parameter”参数 Map<?, ?> parameter=(Map<?, ?>) boundSql.getParameterObject(); Page page=(Page) parameter.get(”page”); if(rs.next()){//因为只有一条数据,所以不需要while循环 page.setTotalNumber(rs.getInt(1)); } //改造后带分页查询的SQL语句 String pageSql=sql+” limit “+page.getDbIndex()+”,”+page.getDbNumber(); metaObject.setValue(”delegate.boundSql.sql”, pageSql); } return invocation.proceed(); }查看全部
-
@PageInterceptor.java相关代码——(下): @Override public Object plugin(Object target) { System.out.println(test); return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { this.test=properties.getProperty(”test”); } } Ps1:执行顺序:setProperties—>plugin—>[intercept] Ps2:若因为某些原因获取不到想要调用的方法等,可以利用反射思想获取。 Ps3: 两个特殊的符号’^’和’$’。他们的作用是分别指出一个字符串的开始和结束。例子如下: “^The”:表示所有以”The”开始的字符串(”There”,”The cat”等); “of despair$”:表示所以以”of despair”结尾的字符串; “^abc$”:表示开始和结尾都是”abc”的字符串——呵呵,只有”abc”自己了; “notice”:表示任何包含”notice”的字符串。 附:”ab+”:表示一个字符串有一个a后面跟着至少一个b或者更多。查看全部
-
@PageInterceptor.java相关代码——(上): @Intercepts({ @Signature(args = { Connection.class }, method = “prepare”, type = StatementHandler.class) }) public class PageInterceptor<V, K> implements Interceptor { private String test; @Override public Object intercept(Invocation invocation) throws Throwable { /** * 注解里写的参数封装成invocation,通过invocation获取,最后记得invocation.proceed()返回以上操作的代理对象并继续执行。 */ //getTarget():return Plugin.wrap(target, this); StatementHandler statementHandler=(StatementHandler) invocation.getTarget(); //通过反射获取对象 MetaObject metaObject=MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory()); //通过RoutingStatementHandler中的delegate匹配对应的BaseStatementHandler MappedStatement mappedStatement=(MappedStatement) metaObject.getValue(”delegate.mappedStatement”); //配置文件中SQL语句的ID String id=mappedStatement.getId();查看全部
举报
0/150
提交
取消