mybatis

1 jdbc总结
a.jdbc 底层没有使用连接池,操作数据库需要频繁的创建和关连接,消耗很大资源
b.写原生的jdbc代码在java中,一旦修改sql 都是需要整体重新编译.
3.使用preparedStatement 预编译的话需要设置123等这种占未符
4.返回的结果也需要硬编码 去循环或者其他处理

2.mybatis 介绍 传统的orm (Object relation mapping)框架

a.配置也是有顺序在这里m=mybatis.config 参数b. mybatis annotation(注解 @select)

c. xml和annotation 优缺点
xml :增加 xml 文件 ,麻烦,条件不确定,容易出错,特殊字符需要转译
annaotation :不适合复杂的sql ,收集sql 不方便,重新编译
d. mybatis的 “#” 和“$”区别
#预编译 防止sql 注入
$ 相当于字符串里面的内容相当于字符串一样

e.mybatis 逆向工程 (给项目里面配置 自动生成sql 和实体类的 文件) 去掉注释的话可以加入


3. mybatis 源码分析

a.mybatis源码吧目录结构
mybatis源码吧目录结构
b.mybatis 核心概念
在这里插入图片描述

c.xml 大概流程

1.SqlSessionFactory = new SqlSessionFactoryBuilder.build(*.xml)(解析xml 配置文件 返回一个DefaultSqlSessionFactory)
2.SqlSession = SqlSessionFactory.openSession(){
TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);//获取一个事物管理器
Executor executor = configuration.newExecutor(tx, execType){//得到一个执行器 去操作数据库
executor = new SimpleExecutor(this, transaction);//默认返回一个简单的执行器(存在三种Batch ,Simple,Reuse(重复))
executor = new CachingExecutor(executor);//默认开始一级缓存 存在 sqlsession当中 如果开启二级缓存 (全局配置的)需要和redis 或者其他关联使用(一般不配置)
executor = (Executor) interceptorChain.pluginAll(executor); // 插件拦截器处理(xml 文件配置的) 循环遍历加载
}
}
3.SqlSession.selectOne{
MappedStatement ms = configuration.getMappedStatement(statement);/从配置sql.xml (MappedStatement)里面去读取相关属性
executor.query{ //还是依赖于executor 去执行
BoundSql boundSql = ms.getBoundSql(parameter);//获取sql
CacheKey key = createCacheKey(ms, parameter, rowBounds, boundSql); //id+sql+limit+offset+*****缓存key
query{
handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);//默认走一级缓存取数据不行就走下面数据库查询{
queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);数据库查询{
list = doQuery{
Configuration configuration = ms.getConfiguration();//获取配置
StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);//StatementHandler 请求相关(可以进源码看细节)
stmt = prepareStatement(handler, ms.getStatementLog());
return handler.query(stmt, resultHandler); //resultHandler 结果集处理
//这里面就是jdbc 相关的
}
localCache.putObject(key, list); //放在缓存里 一进来会去存一次 有值就会删除 重新缓存
}
}
}
}
e. sqlSession.getmapper{/实体方式查询
configuration.getMapper{
mapperRegistry.getMapper{
MapperProxyFactory mapperProxyFactory = (MapperProxyFactory //代理的方式获取
MapperProxy{
@Override
invoke{
mapperMethod.execute {
result = sqlSession.selectOne // case SELECT
}
}
}
}
}
} /
f. 注解(annotation) @select 标签跟进去{
configuration.addMapper{
mapperRegistry.addMapper{
MapperAnnotationBuilder parser = new MapperAnnotationBuilder(config, type);
parser.parse(){

}
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值