MyBatis学习-10
MyBatis运行原理运行过程中涉及到的类
ResourcesMyBatis 中 IO 流的工具类
加载配置文件
SqlSessionFactoryBuilder() 构建器
作用:创建 SqlSessionFactory 接口的实现类
XMLConfigBuilder MyBatis 全局配置文件内容构建器类
作用负责读取流内容并转换为 JAVA 代码.
Configuration 封装了全局配置文件所有配置信息.
全局配置文件内容存放在 Configuration 中
DefaultSqlSessionFactory
是SqlSessionFactory接口的实现类
Transaction 事务类
每一个 SqlSession 会带有一个 Transaction 对象.
TransactionFactory 事务工厂
负责生产 Transaction
Executor MyBatis 执行器
作用:负责执行 SQL 命令
相当于 JDBC 中 statement 对象(或 PreparedStatement或 CallableStatement)
默 ...
MyBatis学习-9
MyBatis 注解注解:为了简化配置文件.Mybatis 的注解简化 mapper.xml 文件.
如果涉及动态 SQL 依然使用 mapper.xml
mapper.xml 和注解可以共存.
使用注解时 mybatis.xml 中<-mappers>使用<-package/>或者<-mapper class=””/>
实现查询实现新增实现修改实现删除使用注解通过AutoMapping结合别名实现多表查询
使用注解实现<-resultMap>功能(不推荐使用)
以 N+1 举例
在 StudentMapper 接口添加查询
在 TeacherMapper 接口添加
@Results() 相当于<-resultMap>
@Result() 相当于<-id/>或<-result/>
@Result(id=true) 相当与<-id/>
@Many() 相当于<-collection/>
@One() 相当于<-association/>
MyBatis学习-8
MyBatis多表查询
实现多表查询方式
业务装配.对两个表编写单表查询语句,在业务(Service)把查询的两个结果进行关联.
使用AutoMapping特性,在实现两表联合查询时通过别名完成映射.
使用 MyBatis 的标签进行实现.
多表查询时,类中包含另一个类的对象的分类
单个对象
集合对象resultMap 标签
<-resultMap>标签写在mapper.xml中,由程序员控制SQL查询结果与实体类的映射关系.
默认 MyBatis 使用 AutoMapping 特性.
使用<-resultMap>标签时,<-select>标签不写 resultType 属性,而是使用 resultMap 属性引用<-resultMap>标签.
使用 resultMap 实现单表映射关系
数据库设计
实体类设计
TeacherMapper.xml代码
resultMap 实现关联单个对象(N+1 方式)N+1 查询方式,先查询出某个表的全部信息,根据这个表的信息查询另一个表的信息.
<-association& ...
MyBatis学习-7
缓存应用程序和数据库交互的过程是一个相对比较耗时的过程。缓存存在的意义:让应用程序减少对数据库的访问,提升程序运行效率
MyBatis 中默认 SqlSession 缓存开启
同一个 SqlSession 对象调用同一个<-select>时,只有第一次访问数据库,第一次之后把查询结果缓存到 SqlSession 缓存区(内存)中
缓存的是 statement 对象.–简单记忆。(必须是用一个<-select>增删改都没有数据库数据返回)
在 myabtis 时一个<-select>对应一个 statement 对象
有效范围必须是同一个 SqlSession 对象
缓存流程
步骤一: 先去缓存区中找是否存在 statement
步骤二:返回结果
步骤三:如果没有缓存 statement 对象,去数据库获取数据
步骤四:数据库返回查询结果
步骤五:把查询结果放到对应的缓存区中
SqlSessionFactory 缓存(二级缓存)
有效范围:同一个 factory 内哪个 SqlSession 都可以获取
什么时候使用二级缓存:
当数据 ...
MyBatis学习-6
ThreadLocal(jdk中)线程容器,给线程绑定一个 Object 内容,后只要线程不变,可以随时取出.改变线程,无法取出内容.
1234567final ThreadLocal<String> threadLocal = new ThreadLocal<>();threadLocal.set("测试"); new Thread(){ public void run() { String result = threadLocal.get(); System.out.println("结果:"+result); }; }.start();
利用这一特性优化mybatis中service加载配置文件,创建session代码
MyUtil
1234567891011121314151617181920212223242526272829303132333435363738394041424344package com ...
MyBatis学习-5
动态 SQL根据不同的条件需要执行不同的 SQL 命令.称为动态 SQL
MyBatis 中动态 SQL 在 mapper.xml 中添加逻辑判断等.
OGNL 表达式,直接写 key 或对象的属性,不需要添加任何特殊符号。只能获取kye或对象的属性
If标签使用判断是否满足条件,在动态 SQL 中所做的最通用的事情是包含部分 where 字句的条件。注意:在where子句后面如果直接使用if,会造成where and···语法错误,若where后面没有条件,则需要添加一个正确的等式(例如1=1)
12345678910<select id="selByAccinAccout" resultType="log"> select * from log where 1=1 <!-- OGNL 表达式,直接写 key 或对象的属性.不需要添加任 何特字符号 --> <if test="accin!=null and accin!=''"> ...
MyBatis学习-4
MyBatis 接口绑定作用:实现创建一个接口后,把mapper.xml变成由mybatis生成接口的实现类,通过调用接口对象就可以获取 mapper.xml中编写的 sql.
后面 mybatis 和 spring 整合时使用的是这个方案.
实现步骤:
创建一个接口
接口包名和接口名与 mapper.xml 中<- mapper>namespace相同
接口中方法名和 mapper.xml 标签的 id 属性要报持相同
在 mybatis.xml 中使用<-package>进行扫描接口和 mapper.xml
代码实现步骤:
在 mybatis.xml 中<-mappers>下使用<-package>
创建一个接口,接口包名和接口名与 mapper.xml 中namespace相同。接口中方法名和 mapper.xml 标签的 id 属性相同
创建xml文件,获取参数,编写sql namespace 必须和接口全限定路径(包名+类名)一致。id值必须和接口中方法名相同,使用接口绑定可以省略parameterType
通过 ...
MyBatis学习-3
MyBatis事务操作功能:从应用程序角度出发,软件具有哪些功能.
业务:完成功能时的逻辑.对应 Service 中一个方法
事务:从数据库角度出发,完成业务时需要执行的 SQL 集合,统称一个事务.
事务回滚.如果在一个事务中某个 SQL 执行事务,希望回归到事务的原点,保证数据库数据的完整性.
在mybatis中默认是关闭了 JDBC 的自动提交功能。每一个 SqlSession 默认都是不自动提交事务.于是利用mybatis进行增删改操作时应该手都动交事务–session.commit(),操作失败发生异常应该回滚事务–seesion.rollback()
openSession(true);自动提交.setAutoCommit(true);
mybatis底层是对JDBC的封装.
JDBC 中 executeUpdate()执行新增,删除,修改的 SQL.返回值 int,表示受影响的行数.
mybatis中<-insert><-delete><-update>标签没有 resultType 属性,默认认为返回值都是 int
在 openS ...
MyBatis学习-2
三种查询方式
.selectList() 返回值为 List<resultType 属性控制> 适用于查询结果都需要遍历的需求
.selectOne() 返回值 Object,适用于返回结果只是变量或一行数据时
.selectMap() 返回值 Map 适用于需要在查询结果中通过某列的值取到这行数据的需求. Map<key,resultType 控制>
settings标签
在mybatis全局配置文件中通过settings标签控制 mybatis 全局开关
在mybatis.xml(mybatis配置文件)中开启log4j
必须保证有 log4j.jar
在 src 下有 log4j.properties123<settings><setting name="logImpl" value="LOG4J"/> </settings>
注意再mybais.xml中的标签顺序
parameterType 属性在XXXMapper.xml中<-sele ...
MyBatis学习-1
MyBatis 简介MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)
作用: 数据访问层框架. 底层是对 JDBC 的封装.
优点之一:使用mybatis时不需要编写实现类,只需要写需要执行的sql命令
MyBatis环境搭建和使用1.导入 jar
2.在src下新建全局配置文件
没有名称和地址要求
在全局配置文件中引入 DTD 或 schema
如果导入dtd后没有提示,可以采用使用本地dtd1234567891011121314151617181920212223<?xml version="1.0" encoding="utf-8" ?>&l ...