• [Java] Mybatis


    背景

    • 前身是iBatis,一种半自动的ORM框架
    • 传统JDBC编程的弊端
      • 工作量大,操作数据库至少需要5步
      • 业务代码和技术代码耦合
      • 连接资源手动关闭,存在隐患
    • Mybatis映射文件三要素
      • SQL语句
      • 映射规则
      • POJO(Plain Ordinary Java Object)
      • 只需自己提供SQL语句
      • 建立连接,Statement, JDBC相关异常处理等由Mybatis完成
    • 可替代Hibernate

     架构

     

     使用

    • 创建项目,导包
    • 创建实体类
    • 配置文件mybatis-config.xml
      • 提供连接数据库用的驱动,数据库名称,编码方式,账号密码
    • 配置文件Category.xml
      • 在com.how2java.pojo下创建
    • 测试类TestMybatis

    配置文件

    • 核心配置文件:mybatis-config.xml
      • settings:设置运行选项
        • mapUnderscoreToCamelCase:开启自动驼峰命名规则
        • cacheEnable:全局缓存开关
        • lazyLoadingEnabled:延迟加载全局开关
        • aggressiveLazyLoading:属性是否按需加载
      • typeAllases:类型别名,首字母不区分大小写
      • plugin:拦截器,拦截方法调用
      • mapper:映射器,配置Spring扫描包
      • environments:配置多个环境,如开发、测试、生产(实际多用Spring管理)
    • SQL映射文件:mapper.xml
      • mapper:根节点
      • cache:配置给定命名空间的缓存
      • resultMap:描述数据库结果集和对象的对应关系
      • sql:可重用的SQL块
      • insert:映射插入语句
      • update:映射更新语句
      • delete:映射删除语句
      • select:映射查询语句
        • parameterType:查询语句传入参数的类型的完全限定名或别名
        • resultType:查询语句返回结果类型的完全限定名或别名

    传参

    • #{}:占位符,用于参数传递,自动实现类型转换,可防止SQL注入
    • ${}:获取参数值,直接拼接到sql,不做类型转换,需自行判断类型,不能防止SQL注入
      • 使用默认参数名获取参数值
      • 在@Param注解指定参数名
      • 分表存储时用

    原理

    • 应用程序找Mybatis要数据
    • mybatis从数据库中找来数据
      • 通过mybatis-config.xml 定位哪个数据库
      • 通过mapper.xml执行对应的select语句
      • 基于mapper.xml把返回的数据库记录封装在对象中
      • 把多个对象装在一个集合中
    • 返回一个集合

    相关概念

    • 日志
      • 知道mybatis执行了什么SQL语句,以便进行调试
      • 使用log4j
    • 事务管理
    • 延迟加载
    • 分页
      • 导入PageHelper插件jar包
      • 在mybatis-config.xml中添加代码,开启PageHelper插件
      • 去掉mybatis-config.xml原有分页操作设置
    • 一级缓存
      • Mybatis的一级缓存在session上
      • 下一次再查询相同id的数据,都直接冲缓存中取出来
    • 二级缓存
      • Mybatis二级缓存是SessionFactory
    • 连接池
      • 整合C3P0数据库连接池
    • 逆向工程
      • Mybatis Generator是一个用于Mybatis逆向工程的工具
      • 传统流程:先有pojo, mapper, xml, 然后再创建表
      • 逆向工程:首先保证数据库里有表,然后通过Mybatis Generator生成pojo, mapper和xml

    设计模式

    • 外观模式(门面模式)
    • 适配器模式
    • 代理模式
    • 工厂模式
    • 装饰器模式

    JDBC问题

    • 加载驱动:驱动包硬编码到java代码中,更换数据库需要修改源码(写在配置文件中)
    • 创建数据库连接:写法固定(写在配置文件中)
    • 创建Statement:修改sql必须修改源码(将sql写在配置文件中)
    • 设置参数,执行sql:能否写在配置文件中(自动判断类型和位置)
    • 遍历结果集:需要判断类型,手动指定字段名(能否将结果自动映射为java对象)
    • 释放资源:频繁创建和关闭连接,影响系统性能(使用连接池)

    核心流程

    • mybatis-config.xml:配置全局参数,只有一个
    • mapper.xml:配置多个statement,即sql,可有多个
    • 通过mybatis配置文件得到SqlSessionFactory
    • 通过SqlSessionFactory得到SqlSession
    • 通过Executor执行SqlSession(基本实现 / 带缓存功能的实现)
    • 输入、输出参数
      • HashMap:k-v格式数据类型
      • Java基本数据类型
      • POJO:java对象

    动态代理

    • 使用mapper接口,不用写实现类即可完成数据库操作
    • Mapper的namespace必须和mapper接口的全路径一致
    • Mapper接口的方法名必须和sql定义的id一致
    • Mapper接口方法的输入参数类型必须和sql定义的parameterType一致
    • Mapper接口中方法的输出参数类型必须和sql定义的resultType一致

    高级特性

    • ResultMap
      • 如何从数据库结果集中加载对象
      • 解决问题:POJO属性名和表结构字段不一致,高级查询
    • 动态SQL
    • 缓存
    • 分页
    • 高级查询

    源码学习

    • 精心挑选项目
    • 先看文档
    • 下载源码,保证能编译运行
    • 摸骨架,从宏观到微观
    • 顺流程,找到入口,抓主放次
    • 源码调试,找到核心数据结构和关键类
    • 勤练习,多折腾

    参考

    Mybatis 和 JPA

    https://www.jianshu.com/p/32ce87c163d6

    https://baijiahao.baidu.com/s?id=1654809256030559190&wfr=spider&for=pc

  • 相关阅读:
    编写简单的c运行库(一)
    c中函数参数传递
    MSVC命令行参数
    在C#中对List<>进行排序
    向DataTable中添加一行数据的做法
    获取本机IP(考虑多块网卡、虚拟机等复杂情况)
    [转]在C#中判断一个文本文件的编码方式
    关于C#使用XML序列化的一些注意事项
    C#中的类型和SQL Server中的类型对应关系
    关于DLL文件和EXE文件不在同一目录下的设置
  • 原文地址:https://www.cnblogs.com/cxc1357/p/12483130.html
Copyright © 2020-2023  润新知