# mybatis
**Repository Path**: mnmnwq/mybatis
## Basic Information
- **Project Name**: mybatis
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-07-14
- **Last Updated**: 2021-07-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: mybatis学习, java学习
## README
## 目录介绍
#### mybatis-01 基本的增删改查
#### mybatis-02 配置提出到properties以及类型别名
#### mybatis-03 解决属性名和字段名不一致的问题
#### mybatis-04 日志
日志 配置项:logImpl 重点 LOG4J 需要组件和配置文件 ; STDOUT_LOGGING 标准日志输出;
limit的使用;
> 分页插件: mybaties PageHelper
#### mybatis-05 注解开发-增删改查,lombok的使用
> 需要在核心配置文件使用注解方式绑定
```xml
```
> 简单语句建议使用,如果复杂点的语句还是使用映射的方式
>
> 本质:应用反射机制; 底层:动态代理;
>
> 如果想让事务自动提交,可以在MyBatisUtils里面去处理,在打开数据库连接时候传个参数true【默认为false需要手动提交事务】
```java
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}
```
#### mybatis-06 解决多对一问题
1、按照查询嵌套处理
```xml
```
2、按照结果嵌套处理
```xml
```
#### mybatis-07 解决一对多的问题
1、按结果嵌套查询
```xml
```
2、按照查询嵌套处理
```xml
```
#### mybatis-08 动态sql
```xml
```
- if
```xml
```
- set
解决update时set多个时候,如果是动态的,可以自动处理","
```xml
title=#{title},
author=#{author}
```
- where
自动处理and
- choose(when,otherwise)
```xml
```
- trim(where,set)
- foreach
```xml
```
- sql片段
```xml
```
> 注意事项:最好基于单表定义sql片段,不要存在where标签
## 笔记
## 什么是MyBatis
- MyBatis是一款优秀的**持久层框架**
- 它支持定制化sql、存储过程以及高级映射
- MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
- MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
- MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
- 2013年11月迁移到Github
##如何获得MyBatis
- 通过maven仓库
```xml
org.mybatis
mybatis
3.5.2
```
#### 作用域
##### SqlSessionBuiler:
- 一旦创建了就不再需要它了
- 局部变量
##### sqlSessionFactory
- 可以想象为:数据库连接池
- SqlSessionFactory一旦被创建就应该在运行期间一直存在,**没有任何理由丢弃它或者重新创建另一个实例**。
- 因此SqlSessionFactory的最佳作用域是应用作用域
- 最简单的就是使用**单例模式**或者静态单例模式
##### SqlSession
- 连接到连接池的一个请求
- 用完紧关闭,否则资源被占用
#### 解决属性名和字段名不一致的问题
结果集映射 resultMap
id name pwd
id name password
#### pom.xml 包含资源导出失败解决和相关maven组件
- pom.xml 包含资源导出失败解决和相关maven组件
```xml
mysql
mysql-connector-java
5.1.47
org.mybatis
mybatis
3.5.2
junit
junit
4.12
```
```xml
src/main/resources
**/*.properties
**/*.xml
true
src/main/java
**/*.properties
**/*.xml
true
```
#### Lombok【偷懒用的】【观点不一,依个人喜好】
> 在实体类加入相应的注解就不用再写相应的代码了
- 使用步骤
1. 在idea中安装插件
2. 在项目中导入jar包
```xml
org.projectlombok
lombok
1.18.10
```
3. limbok支持的注解
```java
@Getter and @Setter
@FieldNameConstants
@ToString
@EqualsAndHashCode
@AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor
@Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger, @CustomLog
@Data
@Builder
@SuperBuilder
@Singular
@Delegate
@Value
@Accessors
@Wither
@With
@SneakyThrows
@val
@var
```
> @Data:无参构造 、 set 、 get 、 toString 、 hashcode 、 equals 自动生成
>
> @AllArgsConstructor 有参构造 自动生成
>
> @NoArgsConstructor 无参构造 自动生成
#### 动态sql定义
- 动态sql就是指根据不同条件生成不同的sql语句
#### 缓存
- mybatis默认定义了两个缓存:一级缓存和二级缓存
- 默认情况下开启了一级缓存
- 二级缓存需要手动开启,它是基于namespace级别的缓存
- 一级缓存
- 默认缓存机制:最近最少操作的会被淘汰,如果连续查询不会刷新缓存,如果进行增删改会导致默认缓存失效,手动清除缓存也会刷新缓存
```java
sqlSession.clearCache(); //会清理缓存,手动清理缓存
```
- 一级缓存默认开启,只在一次SqlSession中有效,也就是拿到链接到关闭连接这个区间段内
- 二级缓存
- 二级缓存也叫全局缓存,一级缓存的作用域太低了,所以诞生了二级缓存
- 基于namespace级别的缓存,一个命名空间,对应一个二级缓存
- 工作机制
- 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中
- 如果当前会话关闭了,这个会话对应的一级缓存就消失了,但是我们想要的是,会话关闭了,一级缓存中的数据会被保存到二级缓存中
- 新的会话查询信息,就可以从二级缓存中获取内容
- 不同的mapper查询出的数据会放在自己对应的缓存(map)中
```xml
```