发表于: 2018-03-31 17:15:21
1 600
今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin)
复习;
<resultType 与resultMap
如果你搜索只是返回一个值,比如说String ,或者是int,那你直接用resultType就行了。 但是你如果是返回一个复杂的对象,就必须定义好这个对象的resultMap的result map。
那么resultType也可以返回一个对象 resultMap有什么区别呢。
但你用resultmap,因为resultmap那段是我们自己指定的,可能指定的属性只是User的一部分,而且还可以设置默认值,这是result type做不到的:
resultMap里面只定义 name
<resultMap class="包.User" id="User">
<result property="name" column="NAME" />
</resultMap>
<select id="getUserByID" resultMap="User">
Select NAME from User where id =#id#
</select>
<mybatis是怎么在程序中顺利的找到sqlmapper的,这个的流程是怎么样??
//mybatis的配置文件
String resoure = "SqlMapConfig.xml";
//使用类加载器加载配置文件(也加载关联的映射文件)
Reader reader = Resources.getResourceAsStream(resoure);
//创建sqlSession工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建session
SqlSession session = sqlSessionFactory.openSession();
session通过mapper映射的id来进行相关操作
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 使用 Builder 模式去生成 SqlSessionFactory,因此只提供了多个 build 方法。这些方法可以接受 XML 配置文件的 Reader 或 InputStream @输入流,也可以传入 environment 指定环境或传入 Properties 作为属性。
输入流:在Java中,我们把能够读取一个字节序列的对象称作一个输入流;
environment :环境配置
Properties:用户链接数据
在 build 方法的实现中,首先根据传入的输入流、environment 和 Properties 构建 XMLConfigBuilder 对象,然后调用其 parse() 方法解析 XML 文件得到 Configuration 对象,最后创建 SqlSessionFactory 对象并返回。
SqlSessionFactory
SqlSessionFactory 是一个工厂接口,默认实现是 DefaultSqlSessionFactory。SqlSessionFactory 的作用是获取 SqlSession,因此提供了多个 openSession 方法,支持从 DataSource 数据源和一个给定的连接 Connection 中创建 SqlSession。
Connection对象,代表与数据源进行的唯一会话。
openSession 方法的底层实现可以分为 5 步:
①从 Configuration 对象中获取环境配置 Environment;
②根据环境配置得到事务工厂 TransactionFactory;
③从事务工厂得到事务 Transaction,Transaction 包装了数据库连接,处理数据库连接的创建、准备、提交、回滚和关闭;
④创建执行器 Executor;
Executor;Mybatis中所有的Mapper语句的执行都是通过Executor进行的,Executor是Mybatis的一个核心接口
Executor是跟SqlSession绑定在一起的,每一个SqlSession都拥有一个新的Executor对象,由Configuration创建。
⑤创建 SqlSession,返回 DefaultSqlSession 的实例。
Executor是怎么利用StatementHandler执行SQL的
- 获取一个数据库连接
- 调用StatementHandler.prepare()方法获取一个statement
- 调用StatementHandler.parameterize()方法设置sql执行时所需要的参数
- 调用StatementHandler.update或query方法执行sql
SqlSession
SqlSession 是一个接口,默认实现是 DefaultSqlSession,提供了多种数据库操作方式,如 select、selectOne、selectList、insert、update、delete、commit、rollback 和 getMapper 等方法。getMapper 方法用于获取 Mapper 接口的代理实现。在 MyBatis 中建议使用 Mapper 接口操作数据库。
数据库的增删改查和事务的提交回滚都是通过 Executor 执行的。Executor 有 3 种类型 SIMPLE、REUSE、BATCH,默认使用简易执行器 SIMPLE,REUSE 类型执行器重用预处理语句,BATCH 类型执行器重用预处理语句和批量更新。Executor 对象的创建在 Configuration 类型的 newExecutor 方法中进行。
Executor 在执行过程中,会用到 StatementHandler、ParameterHandler 和 ResultHandler,其中 StatementHandler 封装了 java.sql.Statement 的相关操作,ParameterHandler 封装了 SQL 对参数的处理,ResultHandler 封装了对返回数据集的处理。Executor 的执行过程,就是对这 3 个对象的调度过程。更多分析在后续文章中进行。
DefaultSqlSession,DefaultSqlSessionFactory根据执行器类型,事务级别,是否提交等信息,来构建执行器Executor,然后根据执行器和configuration构建SqlSession,默认为DefaultSqlSession
statementHandler,它的任务就是和数据库对话。在它这里会使用parameterHandler和ResultHandler对象为我们绑定SQL参数和组装最后的结果返回。
ParameterHandler是用来设置参数规则的
Mapper
Mapper 是通过 JDK 动态代理实现的,在 MapperProxyFactory 中创建 MapperProxy 并进行接口代理封装。对 Mapper 接口的调用实际上是由 MapperProxy 实现的。在 MapperProxy 中,实现了 InvocationHandler 的 invoke 方法。methodCache 是一个 ConcurrentHashMap,其中存储了方法与 MapperMethod 的对应关系。从 methodCache 缓存中获取或创建 MapperMethod 对象,然后调用 MapperMethod 对象的 execute 方法执行数据库操作。
创建 MapperMethod 对象时,会在构造函数中初始化 SqlCommand 和MethodSignature。SqlCommand 包含了数据库操作的名称,格式为 “接口名.操作名称”,以及 XML 中配置的操作类型,如 select、update等,把一个 Mapper 接口与 XML中的一个配置结合起来。MethodSignature 是方法的签名,标记了方法的返回值类型,对于使用 RowBounds(offset 和 limit 配置)、ResultHandler(结果处理回调)作为参数的方法记录参数位置并初始化参数处理器。
在 MapperMethod 的 execute 方法中,根据 SqlCommand 中的配置选择 SqlSession 的方法,根据 MethodSignature 的配置处理传入的参数,调用 SqlSession 的方法进行数据库操作,最后根据 MethodSignature 的返回值类型返回操作结果。
注解:
注解的作用
格式检查:告诉编译器信息,比如被@Override标记的方法如果不是父类的某个方法,IDE会报错;
减少配置:运行时动态处理,得到注解信息,实现代替配置文件的功能;
减少重复工作:比如第三方框架xUtils,通过注解@ViewInject减少对findViewById的调用,类似的还有(JUnit、ActiveAndroid等);
https://zhuanlan.zhihu.com/p/27643133
代理模式
代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。值得注意的是,代理类和被代理类应该共同实现一个接口,或者是共同继承某个类。
静态代理
类型是事先预定好的
动态代理
在动态代理中,我们可以让程序在运行的时候自动在内存中创建一个实现 接口的代理
https://blog.csdn.net/briblue/article/details/73928350这里有一篇详细的资料
19.日志应该怎么打,在什么位置,需要打印出来什么样的关键参数?
每一个涉及判断成功与否的步骤都要打,需要打印出识别性高的参数 如id
20.为什么需要单步调试?Debug的时候IDE是怎么找到源码的?
单步调试可以看到代码的运行轨迹 根据变量找出问题。
21.可否远程连接到线上直接调试?真实的项目中,遇到问题的排查方案是什么?
远程调试:服务端程序运行在一台远程服务器上,我们可以在本地服务端的代码(前提是本地的代码必须和远程服务器运行的代码一致)中设置断点,每当有请求到远程服务器时时能够在本地知道远程服务端的此时的内部状态。
明天计划的事情:(一定要写非常细致的内容)
明天复习spring+mybatis
遇到的问题:(遇到什么困难,怎么解决的)
收获:(通过今天的学习,学到了什么知识)
评论