栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Mybatis个人总结

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mybatis个人总结

# 第一章 Mybatis

1. 从XML中构建SqlSessionFactory 

   - 每一个Mybatis都以一个SqlSessionFactory为实例的核心

   - SqlSessionFactoryBuilder则可以通过xml配置文件或者一个预先配置的Configuration实例构建出来SqlSessionFactory实例

   - ```java
     String resource = "org/mybatis/example/mybatis-config.xml";
     InputStream inputStream = Resources.getResourceAsStream(resource);
     SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
     ```

2. 作用域Scope和生命周期

   - SqlSessionFactoryBuiilder

   - 这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。 

   - SqlSessionFactory

   - 一旦被创建就在应用运行期间一直存在  SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。 

   - SqlSession

   - 每个线程都有自己的SqlSession 每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。 下面的示例就是一个确保 SqlSession 关闭的标准模式: 

   - ```java
     try (SqlSession session = sqlSessionFactory.openSession()) {
       // 你的应用逻辑代
     }
     ```

     映射器实例

      映射器是一些绑定映射语句的接口。映射器接口的实例是从 SqlSession 中获得的。虽然从技术层面上来讲,任何映射器实例的最大作用域与请求它们的 SqlSession 相同。但方法作用域才是映射器实例的最合适的作用域。 也就是说,映射器实例应该在调用它们的方法中被获取,使用完毕之后即可丢弃。 映射器实例并不需要被显式地关闭。尽管在整个请求作用域保留映射器实例不会有什么问题,但是你很快会发现,在这个作用域上管理太多像 SqlSession 的资源会让你忙不过来。 因此,最好将映射器放在方法作用域内。就像下面的例子一样: 

     ```java
     try (SqlSession session = sqlSessionFactory.openSession()) {
       BlogMapper mapper = session.getMapper(BlogMapper.class);
       // 你的应用逻辑代码
     }
     ```

# 第二章 XML配置文件

1. properties 属性  作用:引入外部属性文件
2. settings 设置
3. typeAliases 类型别名
4. typeHandles 类型处理器
5. objectFactory 对象工厂
6. plugins 插件
7. environments 环境配置
   - environment 环境变量
   - transactionManager 事务管理器
   - dataSource 数据源
8. databaseldProvider 数据库厂商标识
9. mappers 映射器

## 1. properties 属性

```xml

  
  



    
    
    
    

2.settings 设置

mapUnderscoreToCamelCase 是否开启驼峰命名自动映射 A_COLUMN 映射到经典的java属性名aColumn

3.typeAliases 类型别名
为java类型设置一个缩写名字

  


指定包名

  

4.环境配置
  1. mybatis可以配置成适应多种环境 这种机制有助于将sql映射应用于多种数据库中

  2. 不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

  3. environments 元素定义了如何配置环境

    
      
        
         
        
        
          
        
       
    
    
  4. 注意一些关键点:

  • 默认使用的环境 ID(比如:default=“development”)。
  • 每个 environment 元素定义的环境 ID(比如:id=“development”)。
  • 事务管理器的配置(比如:type=“JDBC”)。
  • 数据源的配置(比如:type=“POOLED”)。

默认环境和环境 ID 顾名思义。 环境可以随意命名,但务必保证默认的环境 ID 要匹配其中一个环境 ID。

  1. 事务管理器 transactionManager
    • 在 MyBatis 中有两种类型的事务管理器(也就是 type=“[JDBC|MANAGED]”):
    • JDBC – 这个配置直接使用了 JDBC 的提交和回滚功能,它依赖从数据源获得的连接来管理事务作用域。默认情况下,为了与某些驱动程序兼容,它在关闭连接时启用自动提交。然而,对于某些驱动程序来说,启用自动提交不仅是不必要的,而且是一个代价高昂的操作。因此,从 3.5.10 版本开始,你可以通过将 “skipSetAutoCommitOnClose” 属性设置为 “true” 来跳过这个步骤。例如:

  

​ MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。例如:


  

  1. 数据源dataSource

    
      
      
      
      
    
    
第三章 映射文件 1.映射器Mappers
  • 既然Mybatis的行为已经由上述元素配置完成了 接下来定义sql映射语句
  • 使用相对路径
  • 使用完全限定资源定位符
  • 使用映射器接口实现类的完全限定类名
  • 将包内的映射器接口实现为映射器
  • 这些配置会告诉 MyBatis 去哪里找映射文件,剩下的细节就应该是每个 SQL 映射文件了
2.XML映射器
  1. cache 该命名空间的缓存配置

  2. cache-ref 引用其他命名空间的缓存配置

  3. resultMap 描述如何从数据库结果集中加载对象 是最杂也是最强大的元素

  4. sql 可被其他语句引用的可复用语句块

  5. CURD

  6. 
            SELECT
                id,
                dept_name,
                dept_loc
            FROM
                t_dept
            WHERe
                id = #{id}
        
    
            update t_dept
            set dept_name = #{deptName},
                dept_loc = #{deptLoc}
            where id = #{id}
        
     
            delete from t_dept where id = #{id}
        
     
            insert into t_dept (dept_name,dept_loc)
            values (#{deptName},#{deptLoc})
        
    码片

7.自动与自定义映射
  1. 常见的多表连接查询
  • 1.等值连接
  • select * from tableA a,tableB b where a.id = b.id
  • 2.内连接
  • select *tableA a inner join tableB b on a.id = b.id
    1. 外连接
      • 左外连接 以左边的数据为主 (全部) 右边的数据为辅 (有的数据显示)
      • select tableA a left join tableB b on a.id = b.id
  1. 自动映射与自定义映射概述
  • 自动映射 resultType

    概述:指的是可以将表中的字段和类中的属性 建立映射关系

    • 注意:
    • 要求字段名与属性名称一致
    • 字段名与属性不一致时 需要定义别名或开启驼峰命名映射
    • 不足:无法解决多表连接查询的结果集映射问题
  • 自定义映射 resultMap

    • 概述:指的是自定义表中字段与类中的属性 建立映射关系
  • 自定义详解

    1. 级联映射

      
        
        
        级联映射
        
      
      
      
      1. 分布查询
      • 概述:将多表一步连接查询 拆分单表分布查询
      • 优势:提升性能
      public Employee selectEmpAndDeptByEmpIdAssociationStep(int empId);
      
      
          
          
          
          
          
          
          
      
      
      
          select
              id,
              dept_name,
              dept_loc
          from
              t_dept
          where
              id =#{id}
      
      
      1. ResultMap标签详解
      • 属性

        • id属性:定义resultMap唯一标识
        • result属性:定义resultMap的类型 与方法返回值类型一致
      • 子标签

        • id 子标签:定义表中字段与类中的属性映射关系 主键

          1. property 设置属性名称
          2. column 设置字段名称
        • result子标签 :定义表中字段与类中属性映射关系 非主键

          • proeprty 设置属性名称
          • column 设置字段名称
        • association 子标签

          • property 设置属性名称

          • javaType:设置对应的pojo类型

          • select :设置分分步查寻 【接口全类名.方法名】

          • column:设置分步查询参数【字段名称】

      1. association 分步查询使用延迟加载

        • 延迟加载配置

        • 开启延迟加载
          
          设置加载的数据是否按需加载
          
          
          1. 在association标签中也可以设置延迟加载,将覆盖全局配置
        • 
              
          
          
        1. collection 一对多

        2. 1)POJO中的属性可能会是一个集合对象,我们可以使用联合查询,并以级联属性的方式封装对象,使用collection标签定义对象的封装规则
              public class Department {
              private Integer id;
              private String name;
              private List emps;
          
        3. collection多表查询方式同association类似

        4. collection分步查询

          • ① 先通过部门的id查询部门信息

            ② 再通过部门id作为员工的外键查询对应的员工信息.。

            ③ 将所有员工设置到部门中

            首先在员工EmployeeMapper中先写好getEmployeesByDeptId()
            
                select id,name
                from departments
                where id = #{id}
            
            
            
            
                
                
                
                
            
            
      第四章 Mybatis的动态SQL 1.简介
      • MyBatis 采用功能强大的基于 OGNL 的表达式来简化操作
        if
        choose (when, otherwise)
        trim (where, set)
        foreach
        OGNL( Object Graph Navigation Language )对象图导航语言,这是一种强大的
        表达式语言,通过它可以非常方便的来操作对象属性。 类似于我们的EL,SpEL等
        
      2.if where 3.trim 4.set 5.choose(when otherwhise) 6.foreach 7.sql 第五章缓存机制 1.一级缓存 2.二级缓存 第六章 逆向工程 1.导入jar包
      mybatis-generator-core
      
      2.编写配置文件
      编写MBG的配置文件mbg.xml(重要几处配置),参考官方文档
      注意:如果使用的是MySQL8,在jdbcConnection标签中还需要添加以下标签
      
      3.参考官方文档创建代码生成器运行代码 4.测试
      simple版本和Mybatis3版本
      simple属于基本的查询方式
      Mybatis3:
              EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
              //创建EmployeeExample对象
              EmployeeExample employeeExample = new EmployeeExample();
              //创建Criteria对象
              EmployeeExample.Criteria criteria = employeeExample.createCriteria();
              mapper.selectXXX(employeeExample);
      
      第七章PageHelper分页插件 1.导入jar包
      pagehelper
      
      2.在Mybatis全局配置文件中配置分页插件
      
          
          
      
      
      3.page对象的使用
      //设置分页信息,每页显示3条记录,获取第1页
      Page page = PageHelper.StartPage(1,3);
      System.out.println("当前页是:"+page.getPageNum());
      System.out.println("每页显示的条数是:"+page.getPageSize());
      System.out.println("总页数是:"+page.getPages());
      System.out.println("总记录数是:"+page.getTotal());
      System.out.println("当前页中的记录有:");
      
      
      4.pageInfo对象的使用
      //创建PageInfo对象设置每页只显示5个页码
      PageInfo pageInfo = new PageInfo<>(employees, 5);
      System.out.println("导航页的总页码是:"+pageInfo.getNavigatePages());
      System.out.println("页码信息:");
      int[] navigatepageNums = pageInfo.getNavigatepageNums();
      for (int navigatepageNum : navigatepageNums) {
          System.out.print(navigatepageNum+"  ");
      }
      
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/996507.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号