MyBatis总结

介绍MyBatis

Mybatis是一个半自动化持久化层ORM(对象,关系,映射)框架(dao层),将Java中的对象与数据库建立映射关系。优势:操作Java中的对象,就可以影响数据库中表的数据

MyBatis 支持定制化SQL、存储过程以及高级映射

MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(普通的Java对象)映射成数据库中的记录

对开发人员而言,核心sql还是需要自己优化

搭建MyBatis框架

1.准备

建库、建表、建约束、准备Maven工程

2.导入jar包

导入MySQL驱动包



    mysql
    mysql-connector-java
    8.0.26

导入MyBatis的jar包


    org.mybatis
    mybatis
    3.5.6

3.编写核心配置文件(推荐命名为“mybatis-config.xml ”)





    
        
            
            
                



                
                
                
                
            
        
    
    
    
        
    

4.添加Log4j日志框架

导入jar包



    log4j
    log4j
    1.2.17

编写配置文件(名称:“log4j.xml” , 文件位置:“resources”)






    
        
        
            
        
    
    
        
    
    
        
    
    
        
        
    

5.调用映射

public class App {
    public static void main( String[] args ) {
        try {
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
        SqlSession sqlSession = factory.openSession();
        JobMapper jobMapper = sqlSession.getMapper(JobMapper.class);
        List jobs = jobMapper.findAll();
        System.out.println(jobs);
        sqlSession.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

MyBaits核心配置详解

1.核心配置文件概述

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。

2.核心配置文件根标签

没有实际语义,主要作用:所有子标签均需要设置在跟标签内部





   

3.核心配置文件常用子标签(重点)

properties子标签

作用:定义或引入外部属性文件

db.properties文件(数据库连接池配置文件)

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/db220106
db.username=root
db.password=root

引入数据路连接池

    
    
        
            
            
                
                
                
                
            
        
    

settings子标签

作用:这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。

mapUnderscoreToCamelCase属性:是否开启驼峰命名自动映射,默认值false,如设置true会自动将

字段a_col与aCol属性自动映射

注意:只能将字母相同的字段与属性自动映射

类型别名(typeAliases)

作用:类型别名可为 Java 类型设置一个缩写名字。

语法及特点





        
    

Mybatis自定义别名

别名 类型
_int int
integer或int Integer
string String
list或arraylist ArrayList
map或hashmap HashMap

环境配置(environments)

作用:设置数据库连接环境

mappers子标签

作用:设置映射文件路径


    
        
        

    

注意:核心配置中的子标签,是有顺序要求的。

MyBatis总结_第1张图片

映射文件根标签

mapper标签      

  • mapper中的namespace要求与接口的全类名一致

映射文件子标签(重中之重)

  • insert标签:定义添加SQL
  • delete标签:定义删除SQL
  • update标签:定义修改SQL
  • select标签:定义查询SQL
  • sql标签:定义可重用的SQL语句块
  • cache标签:设置当前命名空间的缓存配置
  • cache-ref标签:设置其他命名空间的缓存配置
  • resultMap标签:描述如何从数据库结果集中加载对象
  • resultType解决不了的问题,交个resultMap。

映射文件中常用属性

  • resultType:设置期望结果集返回类型【全类名或别名】
  • 注意:如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。
  • resultType 和 resultMap 之间只能同时使用一个。

获取主键自增数据

  • useGeneratedKeys:启用主键生成策略

  • keyProperty:设置存储属性值

获取数据库受影响行数

直接将接口中方法的返回值设置为int或boolean即可

  • int:代表受影响行数

  • boolean

    • true:表示对数据库有影响

    • false:表示对数据库无影响

Mybatis中参数传递问题(重点)

传参

  • 单个普通参数
    • 可以任意使用:参数数据类型、参数名称不用考虑

  • 多个普通参数
    • Mybatis底层封装Map结构,封装key为param1、param2....【支持:arg0、arg1、...】

命名参数

  • 语法:

    • @Param(value="参数名")

    • @Param("参数名") (value可以省略不写)

  • 位置:参数前面

  • 注意:

    • 底层封装Map结构

    • 命名参数,依然支持参数【param1,param2,...】

  • 示例代码

/**
 * 通过员工姓名及薪资查询员工信息【命名参数】
 * @return
 */
public List selectByName(@Param("name")String lastName);
  

参数类型

  • POJO参数:Mybatis支持POJO【JavaBean】入参,参数key是POJO中属性
  • Map参数:Mybatis支持直接Map入参,map的key=参数key
  • Collection|List|Array等参数:参数名:collection、list、array+

#与$区别

  • 【#】底层执行SQL语句的对象,使用PreparedStatementd,预编译SQL,防止SQL注入安全隐患,相对比较安全。

  • 【$】底层执行SQL语句的对象使用Statement对象,未解决SQL注入安全隐患,相对不安全。

Mybatis中自动映射与自定义映射

映射方式

  • 自动映射【resultType】:指的是自动将表中的字段与类中的属性进行关联映射

    • 自动映射解决不了两类问题

      • 多表连接查询时,需要返回多张表的结果集

      • 单表查询时,不支持驼峰式自动映射【不想为字段定义别名】

  • 自定义映射【resultMap】:自动映射解决不了问题,交给自定义映射

  • 注意:resultType与resultMap只能同时使用一个

ResultMap相关标签及属性

  • resultMap标签:自定义映射标签

    • id属性:定义唯一标识

    • type属性:设置映射类型

  • resultMap子标签

    • id标签:定义主键字段与属性关联关系

    • result标签:定义非主键字段与属性关联关系

      • column属性:定义表中字段名称

      • property属性:定义类中属性名称

    • association标签:定义一对一的关联关系

      • property:定义关联关系属性

      • javaType:定义关联关系属性的类型

      • select:设置分步查询SQL全路径

      • colunm:设置分步查询SQL中需要参数

      • fetchType:设置局部延迟加载【懒加载】是否开启

    • collection标签:定义一对多的关联关系

      • property:定义一对一关联关系属性

      • ofType:定义一对一关联关系属性类型

      • fetchType:设置局部延迟加载【懒加载】是否开启

Mybatis中分步查询

将多表连接查询改为分布单表查询,连接查询效率很低。

Mybatis延迟加载【懒加载】

  • 需要时加载,不需要暂时不加载

  • 优势:提升程序运行效率

  • 语法

    • 全局设置




  • 局部设置
    • fetchType

      • eager:关闭局部延迟加载

      • lazy:开启局部延迟加载


Mybatis动态SQL(重点)

动态SQL概述

  • 动态SQL指的是:SQL语句可动态化

  • Mybatis的动态SQL中支持OGNL表达式语言,OGNL( Object Graph Navigation Language )对象图导航语言

常用标签

  • if标签:用于完成简单的判断

  • where标签:用于解决where关键字及where后第一个and或or的问题

  • trim标签: 可以在条件判断完的SQL语句前后添加或者去掉指定的字符

    • prefix: 添加前缀

    • prefixOverrides: 去掉前缀

    • suffix: 添加后缀

    • suffixOverrides: 去掉后缀

  • set标签:主要用于解决set关键字及多出一个【,】问题

  • choose标签:类似java中if-else【switch-case】结构

  • foreach标签:类似java中for循环

    • collection: 要迭代的集合

    • item: 当前从集合中迭代出的元素

    • separator: 元素与元素之间的分隔符

    • open: 开始字符

    • close:结束字符

  • sql标签:提取可重用SQL片段

缓存机制

一级缓存

  • 概述:一级缓存【本地缓存(Local Cache)或SqlSession级别缓存】

  • 特点

    • 一级缓存默认开启

    • 不能关闭

    • 可以清空

  • 缓存原理

    • 第一次获取数据时,先从数据库中加载数据,将数据缓存至Mybatis一级缓存中【缓存底层实现原理Map,key:hashCode+查询的SqlId+编写的sql查询语句+参数】

    • 以后再次获取数据时,先从一级缓存中获取,如未获取到数据,再从数据库中获取数据。

  • 一级缓存五种失效情况

    1) 不同的SqlSession对应不同的一级缓存

    2) 同一个SqlSession但是查询条件不同

    3) 同一个SqlSession两次查询期间执行了任何一次增删改操作

    • 清空一级缓存

    4) 同一个SqlSession两次查询期间手动清空了缓存

    • sqlSession.clearCache()

    5) 同一个SqlSession两次查询期间提交了事务

    • sqlSession.commit()

二级缓存

  • 二级缓存【second level cache】概述

    • 二级缓存【全局作用域缓存】

    • SqlSessionFactory级别缓存

  • 二级缓存特点

    • 二级缓存默认关闭,需要开启才能使用

    • 二级缓存需要提交sqlSession或关闭sqlSession时,才会缓存。

二级缓存使用的步骤:

  • ① 全局配置文件中开启二级缓存
  • ② 需要使用二级缓存的映射文件处使用cache配置缓存
  • ③ 注意:POJO需要实现Serializable接口
  • 关闭sqlSession或提交sqlSession时,将数据缓存到二级缓存

  • 二级缓存底层原理

    • 第一次获取数据时,先从数据库中获取数据,将数据缓存至一级缓存;当提交或关闭SqlSession时,将数据缓存至二级缓存

    • 以后再次获取数据时,先从一级缓存中获取数据,如一级缓存没有指定数据,再去二级缓存中获取数据。如二级缓存也没有指定数据时,需要去数据库中获取数据,......

  • 二级缓存相关属性

    • eviction=“FIFO”:缓存清除【回收】策略。

      • LRU – 最近最少使用的:移除最长时间不被使用的对象。

      • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。

    • flushInterval:刷新间隔,单位毫秒

    • size:引用数目,正整数

    • readOnly:只读,true/false

  • 二级缓存的失效情况

    • 在两次查询之间,执行增删改操作,会同时清空一级缓存和二级缓存

    • sqlSession.clearCache():只是用来清除一级缓存。

三级缓存

  • 第三方缓存:EhCache

  • EhCache 是一个纯Java的进程内缓存框架

  • 第三方缓存,需要建立在二级缓存基础上【需要开启二级缓存,第三方缓存才能生效】

  • 如何让第三方缓存失效【将二级缓存设置失效即可】

你可能感兴趣的:(mybatis,java,mysql)