MyBatis 学习记录1 一个简单的demo
主题
最近(N个月前)clone了mybatis的源码..感觉相比于spring真的非常小...然后看了看代码觉得写得很精简...感觉我的写代码思路和这个框架比较相似(很难具体描述...就是相对来说比较容易理解作者想干嘛,虽然也没有注释..)...所以打算好好研究学习下.
从1个简单的DEMO来入门
package test.test; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import test.mapper.UserMapper;
import test.model.User; import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream; public class MyTest {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = new FileInputStream(resource);
//从 XML 中构建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper mapper = session.getMapper(UserMapper.class);
User u = mapper.selectByPrimaryKey(1);
System.out.println(u); User u2 = mapper.selectByPrimaryKey(1);
System.out.println(u2);
} finally {
session.close();
}
}
}
这段代码的输出如下:
Connected to the target VM, address: '127.0.0.1:51496', transport: 'socket'
2018-09-24 10:13:47,501 DEBUG [main] logging.LogFactory : Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Mon Sep 24 10:13:47 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Created connection 13928019.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@d48653]
==> Preparing: select id, user_id, user_name, real_name, email, creator_uid, modifier_uid, created_at, updated_at, del from user where id = ? and del = 0
==> Parameters: 1(Integer)
<== Columns: id, user_id, user_name, real_name, email, creator_uid, modifier_uid, created_at, updated_at, del
<== Row: 1, 1, test, realName, jyzjyz12@163.com, 1, 1, 2018-09-24 10:10:43.0, 2018-09-24 10:10:46.0, 0
<== Total: 1
User{id=1, userId=1, userName='test', realName='realName', email='jyzjyz12@163.com', creatorUid=1, modifierUid=1, createdAt=Mon Sep 24 10:10:43 CST 2018, updatedAt=Mon Sep 24 10:10:46 CST 2018, del=false}
User{id=1, userId=1, userName='test', realName='realName', email='jyzjyz12@163.com', creatorUid=1, modifierUid=1, createdAt=Mon Sep 24 10:10:43 CST 2018, updatedAt=Mon Sep 24 10:10:46 CST 2018, del=false}
Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@d48653]
Disconnected from the target VM, address: '127.0.0.1:51496', transport: 'socket'
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@d48653]
Returned connection 13928019 to pool.
就几行代码.我就debug大致看了看都做了哪些事情.
初始化SqlSessionFactory时候各种对象之间的关系
SqlSessionFactory一般一个应用只会创建1个.在程序初始化的时候创建.从这个对象中可以获取SqlSession,SqlSession是Facade设计模式.SqlSession可以获取Mapper.获取了Mapper就可以进行各种查询了.
要创建SqlSessionFactory可以通过SqlSessionFactoryBuilder的build方法来创建,build可以有很多可选的参数,比如inputstram,file...等等..最终都是转化成configuration.
转化成configuration的时候也需要借助于XMLConfigBuilder的parse方法.
对象之间关系大致如图:

1.我们需要的是SqlSession.我们一般和它打交道.从它里面可以获取Mapper
2.SqlSession需要通过SqlSessionFactory来创建.
3.SqlSessionFactory需要通过SqlSessionFactoryBuilder来build.同时build的时候需要一份配置,这个配置就是Configuration,而Configuration对象需要使用XMLConfigBuilder来解析XML生成
同时需要指定使用配置中的哪个环境?因为一个配置可以有多个环境,区别qa,dev,prod....等等.还可以传入参数,因为配置URL,USERNAME,PASSWORD的时候可以传入占位符.


4.创建好SqlSessionFactory以后我们就可以通过openSession方法来获取SqlSession了.SqlSession要执行SQL或者给你Mapper.需要用到executor来真正执行SQL,executor要执行SQL肯定也需要用到TransactionFactory创建的Transaction,Transaction对象要能正确执行事务,肯定需要用到Datasource,事务隔离级别level,是否autoCommit等参数.这些参数可以在Configuration(Environment)里获取
5.executor是装饰着的设计模式.默认返回的是CacheExecutor内部装饰着SimpleExecutor.SimpleExecutor中存在着mybatis的一级缓存,从我们的打印日志中可以看出来.我们SQL只打印了一次.所以同一个Mapper多次查询同样的SQL是有一级缓存的.如果你换了一个SqlSession,那就无效了.所以一级缓存是在SqlSession级别的.而二级缓存在CacheExecutor中.不同的SqlSession可以共享二级缓存.
以上就是初始化阶段对象之间的一些关系对的简单梳理
MyBatis 学习记录1 一个简单的demo的更多相关文章
- MyBatis 学习记录7 一个Bug引发的思考
主题 这次学习MyBatis的主题我想记录一个使用起来可能会遇到,但是没有经验的话很不好解决的BUG,在特定情况下很容易发生. 异常 java.lang.IllegalArgumentExceptio ...
- LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS
LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163. ...
- Linux第三周学习总结——构造一个简单的Linux系统MenuOS
第三周学习总结--构造一个简单的Linux系统MenuOS 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...
- MyBatis 学习记录5 MyBatis的二级缓存
主题 之前学习了一下MyBatis的一级缓存,主要涉及到BaseExecutor这个类. 现在准备学习记录下MyBatis二级缓存. 配置二级缓存与初始化发生的事情 首先二级缓存默认是不开启的,需要自 ...
- MyBatis 学习记录3 MapperMethod类
主题 之前学习了一下MapperProxy的生产过程,自定义Mapper类的对象是通过动态代理生产的,调用自定义方法的时候实际上是调用了MapperMethod的execute方法:mapperMet ...
- pipelinewise 学习二 创建一个简单的pipeline
pipelinewise 提供了方便的创建简单pipeline的命令,可以简化pipeline 的创建,同时也可以帮我们学习 生成demo pipeline pipelinewise init --n ...
- Mybatis学习记录(五)----Mybatis的动态SQL
1. 什么是动态sql mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.1 需求 用户信息综合查询列表和用户信息查询列表总数这两个statemen ...
- Mybatis学习记录(1)
1.Mybatis介绍 Mybatis是apache的一个开源项目iBatis,Mybatis是一个优秀的持久层框架,他对jdbc的操作数据库的过程进行封装,使开发者只需要关注sql本身,不需 ...
- 用IntelliJ IDEA学习Spring--创建一个简单的项目
这段时间想学习一下Spring,其实之前学过Spring,只是有些忘记了.而且之前学的时候是适用eclipse学习的,现在好像对IntelliJ这个工具使用挺多的,现在就学习一下这个工具的用法,顺便复 ...
随机推荐
- appium-java,切换源生app和webview
方法 public void swith_app(AndroidDriver AndroidDriver){ //切换到源生app System.out.println(AndroidDriver.g ...
- linux自学(一)之vmware虚拟机安装
之前有研究过linux,后来一段时间没有操作了,现在有点陌生,而且当初也没有记录学习内容.现在想从新开始包括虚拟机安装到部署Javaweb项目,把这之间所需要的全都记录下来,以便后边学习参考使用. 虚 ...
- 关于ehcache缓存的使用(简单对比redis)
前言 最近在做一个项目,某个接口查询数据到返回数据总计需要7000+毫秒,一直在考虑优化的问题,优化也有原来的一家一家查询到一次查询所有的,在查询不同天数.结果是1500+,虽然优化了不少,但是数据结 ...
- Linux驱动程序接口
§1. Linux驱动程序接口 系统调用是操作系统内核与应用程序之间的接口,设备驱动程序则是操作系统内核与机器硬件的接口.几乎所有的系统操作最终映射到物理设备,除了CPU.内存和少数其它设备,所有的设 ...
- 【angularJS】启动(bootstrap)机制
Angular的启动分为手动和自动两种. 自动启动 定义模块的例子中,采用的就是自动的方式:通过内置的指令ngApp 来指定启动时加载的模块.<html ng-app="myApp&q ...
- 笔记:webpack 打包参数 mode development
webpack 打包参数 mode development 在开发时使用 webpack 打包后不压缩,所以只需要在 webpack 打包命令中加上 --mode mode development 即 ...
- php查询mysql数据库 查询条件替中文字符串变量时无法查询
$temp2 ='十年';mysql_query("SET NAMES GBK"); $res = mysql_query("select songer_name fro ...
- RK3288 修改设备默认的蓝牙名称
path:device/rockchip/rk3288/bluetooth/bdroid_buildcfg.h /* * Copyright (C) 2012 The Android Open Sou ...
- php 必须了解提升的知识
https://blog.csdn.net/m18513057343/article/details/78974292
- 贴一段demo代码,演示channel之间的同步
package main import ( "fmt" "time" ) func deskGoRoutine(index int, userChannel c ...