# 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 ```