栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Mybatis底层源码解析以及Sql语句的构建

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mybatis底层源码解析以及Sql语句的构建

mybatis-config.xml




    
    
        
    
    
    
        
    
    
        
    

    
        
            
            
                
                
                
                
            
        
    

    
        
    

UserMapper.xml




  
    select id as id,name as name , address as address ,age as age from user where id = 4
  
  
    select id as id,name as name , address as address ,age as age from user where id = 4
  

总之,将接口的代理类放入mapperRegistry中,

 同时将namespace+id  作为key,valueMappedStatement 放入mappedStatements中

Map mappedStatements;

 第二步:将xml信息转化为Configuration类对象

 第三步:将Configuration类对象作为参数传入,创建一个SqlSessionFactory对象

 public SqlSessionFactory build(Configuration config) {
        return new DefaultSqlSessionFactory(config);
    }

 第四步:实际上 new DefaultSqlSessionFactory(config)

 第五步:根据sqlSessionFactory获取sqlSession

SqlSession sqlSession = sqlSessionFactory.openSession();

 第六步:具体的数据库操作

第一种:使用(namespace+id)作为key,去mappedStatements中查询

 public  T selectOne(String statement, Object parameter) {
        List list = this.selectList(statement, parameter);
        if (list.size() == 1) {
            return list.get(0);
        } else if (list.size() > 1) {
            throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size());
        } else {
            return null;
        }
    }

statement就是namespace+id 在前面就将namespace+id 作为key放入map中,value是mappedStatent根据key查询mappedStatent

第七步:根据statement找到对应的MappedStatement MappedStatement ms = this.configuration.getMappedStatement(statement);

第八步:调用executor去查询,从MappedStatement获取到sql语句

var6 = this.executor.query(ms, this.wrapCollection(parameter), rowBounds, handler); 
BoundSql boundSql = ms.getBoundSql(parameterObject);

第九步:查询缓存,从缓存中获取,若缓存没有,则查询数据库,再放入缓存中

 第十步:根据结果映射关系将查询的结果转化为具体的指定的类 ,此处将查询到的结果转化为User对象

第二种:使用代理(UserMapper.class)作为key,去mapperRegistry中查询

 

 上面已经说明了代理的实现,mybatis源码分析到此结束

根据接口创建代理类(com.wxz.mapper.UserMapper)放入容器中,使用接口的class对象作为key(UserMapper.class),value值为 MapperProxyFactory

private final Map, MapperProxyFactory> knownMappers = new HashMap();

Mabatis中 sql语句的构建

 

public String parse(String text) {
        if (text != null && !text.isEmpty()) {
            int start = text.indexOf(this.openToken);
            if (start == -1) {
                return text;
            } else {
                char[] src = text.toCharArray();
                int offset = 0;
                StringBuilder builder = new StringBuilder();
                StringBuilder expression = null;

                do {
                    if (start > 0 && src[start - 1] == '\') {
                        builder.append(src, offset, start - offset - 1).append(this.openToken);
                        offset = start + this.openToken.length();
                    } else {
                        if (expression == null) {
                            expression = new StringBuilder();
                        } else {
                            expression.setLength(0);
                        }

                        builder.append(src, offset, start - offset);
                        offset = start + this.openToken.length();

                        int end;
                        for(end = text.indexOf(this.closeToken, offset); end > -1; end = text.indexOf(this.closeToken, offset)) {
                            if (end <= offset || src[end - 1] != '\') {
                                expression.append(src, offset, end - offset);
                                break;
                            }

                            expression.append(src, offset, end - offset - 1).append(this.closeToken);
                            offset = end + this.closeToken.length();
                        }

                        if (end == -1) {
                            builder.append(src, start, src.length - start);
                            offset = src.length;
                        } else {
                            builder.append(this.handler.handleToken(expression.toString()));
                            offset = end + this.closeToken.length();
                        }
                    }

                    start = text.indexOf(this.openToken, offset);
                } while(start > -1);

                if (offset < src.length) {
                    builder.append(src, offset, src.length - offset);
                }

                return builder.toString();
            }
        } else {
            return "";
        }
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/704498.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号