「java查找mapper」java查找指定字符出现的次数

博主:adminadmin 2022-12-19 18:00:07 64

今天给各位分享java查找mapper的知识,其中也会对java查找指定字符出现的次数进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

JAVA 生成mapper映射找不到方法,求解答

扫描xml文件的路径不对,你xml放在了mapping文件夹,你这里写的是mapper,看你目录结构  你这个文件夹里放的是java文件 俗称的dao层

MyBatisCodeHelper快速生成实体类和mapper方法

首先,需要在idea中配置数据源:

右键点击想要快速生成对象的表,点击小红鸟开始生成

点击定制列,更改生成字段的类型,一般将byte改为integer

小技巧:

在mapper.java中,输入selectAllBy****(字段名),可以自动生成符合查找逻辑的SQL

按下alt+回车即可自动生成

mybatis java类通过什么找到mapper

定义一个MapInterceptor用于拦截对应的结果集返回一个Map。 其代码如下所示: @Intercepts(@Signature(method="handleResultSets", type=ResultSetHandler.class, args={Statement.class})) public class MapInterceptor implements Interceptor...

如何通过接口查找对应的mapper.xml及方

在使用mybatis的时候,有一种方式是

BookMapper bookMapper = SqlSession().getMapper(BookMapper.class)

获取接口,然后调用接口的方法。只要方法名和对应的mapper.xml中的id名字相同,就可以执行sql。

那么接口是如何与mapper.xml对应的呢?

首先看下,在getMapper()方法是如何操作的。

在DefaultSqlSession.java中调用了configuration.getMapper()

public T T getMapper(ClassT type) {

return configuration.TgetMapper(type, this);

}

在Configuration.java中调用了mapperRegistry.getMapper(type, sqlSession);

public T T getMapper(ClassT type, SqlSession sqlSession) {

return mapperRegistry.getMapper(type, sqlSession);

}

下面重点来了,在MapperRegistry.java中实现了动态代理

public T T getMapper(ClassT type, SqlSession sqlSession) {

final MapperProxyFactoryT mapperProxyFactory = (MapperProxyFactoryT) knownMappers.get(type);

if (mapperProxyFactory == null)

throw new BindingException("Type " + type + " is not known to the MapperRegistry.");

try {

return mapperProxyFactory.newInstance(sqlSession);

} catch (Exception e) {

throw new BindingException("Error getting mapper instance. Cause: " + e, e);

}

}

这个函数分两部分来看,首先是从map集合中获取接口代理,map集合的来源,第二部分获取代理后实例化,获取接口的方法,执行sql。

对于第一部分:集合的来源。

这个MapperRegistry.java中有个方法是addMappers();共有两个重载。

public void addMappers(String packageName, Class? superType) {

ResolverUtilClass? resolverUtil = new ResolverUtilClass?();

//通过包名,查找该包下所有的接口进行遍历,放入集合中

resolverUtil.find(new ResolverUtil.IsA(superType), packageName);

SetClass? extends Class? mapperSet = resolverUtil.getClasses();

for (Class? mapperClass : mapperSet) {

addMapper(mapperClass);

}

}

//解析包名下的接口

public void addMappers(String packageName) {

addMappers(packageName, Object.class);

}

往上追溯该方法的调用是在SqlSessionFactory.build();时对配置文件的解析,其中对节点mappers的解析,这里先不赘述,

mapperElement(root.evalNode("mappers"));

private void mapperElement(XNode parent) throws Exception {

if (parent != null) {

for (XNode child : parent.getChildren()) {

//使用package节点进行解析配置

if ("package".equals(child.getName())) {

String mapperPackage = child.getStringAttribute("name");

//注册包下的接口

configuration.addMappers(mapperPackage);

} else {

//使用mapper节点

String resource = child.getStringAttribute("resource");

String url = child.getStringAttribute("url");

String mapperClass = child.getStringAttribute("class");

if (resource != null url == null mapperClass == null) {

ErrorContext.instance().resource(resource);

InputStream inputStream = Resources.getResourceAsStream(resource);

XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments());

mapperParser.parse();

} else if (resource == null url != null mapperClass == null) {

ErrorContext.instance().resource(url);

InputStream inputStream = Resources.getUrlAsStream(url);

XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, url, configuration.getSqlFragments());

mapperParser.parse();

} else if (resource == null url == null mapperClass != null) {

Class? mapperInterface = Resources.classForName(mapperClass);

configuration.addMapper(mapperInterface);

} else {

throw new BuilderException("A mapper element may only specify a url, resource or class, but not more than one.");

}

}

}

}

}

这是调用addMapper()的顺序。

同时在改方法中还有一个方法很重要

public T void addMapper(ClassT type) {

if (type.isInterface()) {

if (hasMapper(type)) {

throw new BindingException("Type " + type + " is already known to the MapperRegistry.");

}

boolean loadCompleted = false;

try {

knownMappers.put(type, new MapperProxyFactoryT(type));

//根据接口名寻找同包下同名的xml或者mapper的namespace是该接口的xml

//找到对用的xml后进行解析mapper节点里面的节点

MapperAnnotationBuilder parser = new MapperAnnotationBuilder(config, type);

parser.parse();

loadCompleted = true;

} finally {

if (!loadCompleted) {

knownMappers.remove(type);

}

}

}

}

这是通过接口的全路径来查找对应的xml。这里有两种方式解析,也就是我们平常xml文件放置位置的两种写法。

第一种是不加namespace,把xml文件放在和接口相同的路径下,同时xml的名字与接口名字相同,如接口名为Student.java,xml文件为Student.xml。在相同的包下。这种当时可以不加namespace.

第二种是加namespace,通过namespace来查找对应的xml.

到这就是接口名和xml的全部注册流程。

下面再说下第二部分就是通过动态代理获取接口名字来对应xml中的id。

主要有两个类MapperProxyFactory.java和MapperProxy.java

对于MapperProxyFactory.java

public class MapperProxyFactoryT {

private final ClassT mapperInterface;

private MapMethod, MapperMethod methodCache = new ConcurrentHashMapMethod, MapperMethod();

//构造函数,获取接口类

public MapperProxyFactory(ClassT mapperInterface) {

this.mapperInterface = mapperInterface;

}

public ClassT getMapperInterface() {

return mapperInterface;

}

public MapMethod, MapperMethod getMethodCache() {

return methodCache;

}

@SuppressWarnings("unchecked")

protected T newInstance(MapperProxyT mapperProxy) {

return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);

}

//供外部调用

public T newInstance(SqlSession sqlSession) {

final MapperProxyT mapperProxy = new MapperProxyT(sqlSession, mapperInterface, methodCache);

return newInstance(mapperProxy);

}

}

在MapperProxy.java中进行方法的执行

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (Object.class.equals(method.getDeclaringClass())) { try { return method.invoke(this, args); } catch (Throwable t) { throw ExceptionUtil.unwrapThrowable(t); } } final MapperMethod mapperMethod = cachedMapperMethod(method);

//方法的执行

return mapperMethod.execute(sqlSession, args);

}

private MapperMethod cachedMapperMethod(Method method) { MapperMethod mapperMethod = methodCache.get(method); if (mapperMethod == null) { mapperMethod = new MapperMethod(mapperInterface, method, sqlSession.getConfiguration()); methodCache.put(method, mapperMethod); } return mapperMethod;

}

至此,就是mybatis所有接口和xml的加载,以及通过动态代理来进行接口的执行的过程。

关于java查找mapper和java查找指定字符出现的次数的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-12-19,除非注明,否则均为首码项目网原创文章,转载请注明出处。