MyBatis框架的学习

Updated on with 0 views and 0 comments

MyBatis框架的学习

MyBatis框架

  1. 简单来说,框架就是一种半成品的程序,开发者可以在此基础之上实现再开发。框架可以不断地更新维护,便于项目再开发

  2. 有哪些常用的框架

    1)持久层的框架:mybatis、(DbUtils)、spring-jdbc、hibernate

    2)表现层的框架:springmvc、struts2

    3)全栈性质的框架:(可以在所有层可用)spring

  3. 分层思想/概念,目的是降低耦合、结构清晰、实现和维护相对更简单;分工协作

    1)MVC是一种分层设计思想,把项目中某些内容分成 M,V,C 层

    2)M-Model,模型层,包含:实体类层,实现数据的封装和传输;V-View,视图层,包含:视图界面(jsp\html\excel\word),实现信息展示以及和操作者交互

    C-Controller,控制层,包含:Servlet,实现接收和处理请求,做出响应

    3)三层架构

    A、适合于所有语言、适用于所有的项目形式

    B、表现层,用于实现数据的展示,和操作者交互

    C、业务逻辑层,用于实现项目的业务逻辑的

    D、数据访问层,用于实现数据的操作,和数据库交互

mybatis框架

  1. 是什么?

    是持久层框架、和数据库交互、实现CRUD、封装了jdbc、参数自动传递、结果自动封装、由开发者实现SQL编写,mybatis是由apache管理的开源项目,目前托管在GitHub。由于SQL语句需要开发者编写,所以mybatis又称为半ORM框架。

  2. ORM---Object Relational Mapping 对象关系映射,是指数据库表和实体类对应,表中字段和实体类属性对应,表中字段类型和实体类属性类型对应

  3. 优点

    1)减少代码量

    2)实现软编码,通过 xml 配置方式

    3)提高效率,比如减少连接对象的操作

    4)还可以实现注解方式的操作

    5)简单易学

  4. mybatis 的官网

    http://mybatis.org/mybatis-3/

  5. mybatis 的入门案例

    1)比如需求是实现添加操作

    2)准备

    A、准备数据库和表

    CREATE DATABASE mybatis CHARSET utf8
    USE mybatis
    CREATE TABLE t_user(
        uid INT PRIMARY KEY AUTO_INCREMENT,
        uname VARCHAR(30),
        upwd VARCHAR(30)
    );
    

    B、搭建项目环境

    创建项目 -- java 性质 maven 项目,添加依赖,创建实体类

    C、准备 mybatis 相关配置文件:两类文件(mybatis 核心配置文件和映射文件)

    核心文件 --- 名称任意、保存位置在类路径下,项目中一般只有一个

    映射文件 --- 名称任意(通常和表关联)、保存位置在类路径下(可以在其他任意位置),项目中可能有多个

    D、准备持久层

    E、测试

  6. CRUD

    1)查询操作 根据主键id查询……

  7. mybatis的执行流程(从上到下、顺序关系)

    • 配置文件:核心文件(环境、映射导入)和映
      射文件(SQL语句)
    • 加载配置文件、创建工厂:生产SqlSession
    • 创建会话:获取代理对象、实现增删改查
    • 执行器:真正实现增删改查功能的对象---Executor
    • 容器:负责保存SQL语句、查询结果等信息---MappedStatement(环境参数在独立保存位置)

在mybatis中有两种符号

  1. #{}${} 两种符号的使用格式相同

  2. 区别

    1)作用上: #{}是占位符${}是字符串拼接符

    2)预编译:#{}在预编译时转回 ?,框架帮我们判断类型添加单引号,${}在预编译拼接字符串,值拼接不添加单引号,会产生错误,需要自己添加单引号

    3)安全:#{}防SQL注入 更安全

    ${}不能防止SQL注入 不安全
    4)${}可以进行字段名称的拼接(用途)

    1. log4j 日志 1.2.47 log4j.properties日志文件从官网复制 ERROR、WARN、INFO、DEBUG四个级别设置最低的DEBUG显示信息多

parameterType 属性的相关介绍1. 何时使用?

有参数时候
2. 可以缺省配置(设置一般类型时(数组、集合),或者添加注解时)
3. 可以设置哪些属性值(不缺省配置情况下)?

1)一般类型(八个包装类、String、Date)

2)实体类类型

3)Map 类型

4)复合实体类类型

注解方式

  1. 使用了 Param 注解 省略parameterType(适合多参数)

    注解中变量名称要和井号括号中变量名称相同

    对象里面对象嵌套要使用.来连接

核心配置文件的其他配置

  1. 环境

    1)事务配置 JDBC(有事务管理,提交回滚)/MANAGED(没有事务管理)

    2)数据源配置 POOLED(连接池)/UNPOOLED(非连接池,每次请求连接和关闭)/JNDI(外部配置数据源)

  2. 映射导入

    1)mapper 标签有三种属性

    A、resource(类路径下,和接口不在一个目录)

    B、class(使用注解代替映射文件实现增删改查,用 class 设置接口名称/映射文件和接口在同一个路径且映射文件和接口名相同,也可以使用 class 引入)

    C、url 统一资源定位符 三部分:协议(http/file)+主机端口+资源路径如果映射文件没有在类路径中也没有和接口在同包,在任意的位置

    2)package标签 下 name 包名 在映射文件和接口在同位置且同名时可以一次性加载或者引入多个映射文件

  3. 类型别名 typeAliases

    1)别名 -- 用来设置别名的(例如 数据库);需求就是为了简化在映射文件中parameterType或者resultType设置类型名称时较长的全名

    2)设置 注意顺序 在 enviroments 上面 一次只能给一个类定义别名 typeAlias 标签 中 type 全限定名 alias 别名(缺省alias属性缺省配置,此时默认别名就是类名不含包名,不区分大小写)package标签 中 name 包名 简化操作 一次给一个包中的所有类定义默认别名(默认基本类型已经定义别名)

  4. properties 标签

    1)配置标签 -- 用来实现加载外部 properties 文件的

    可以把项目中一些相同的参数抽取到properties 文件中,实现参数统一管理,什么位置需要,如核心文件,通过 properties 标签加载,再使用 OGNL(对象图形导航语言)表达式加载变量值

  5. plugins 标签(在typeAliases下enviroments上)

    1)插件配置 -- 可以配置多种插件 目的是为了给 mybatis 添加其他功能

    2)添加分页插件 -- 给 mybatis 添加分页插件,实现分页功能 Mybatis_PageHelper 插件 托管在 github

    (mysql 借助 limit 关键字分页 除了第一页 limit后两个参数

    5.X版本的使用PageInterceptor 之前版本用PageHelper)

    3)Spring AOP 思想的体现 -- 实现把 limit片段向 SQL 添加

        <!-- 分页插件-->
        <plugins>
            <plugin interceptor="com.github.pagehelper.PageInterceptor">
                <!-- 指定底层数据库-->
                <property name="helperDialect" value="mysql"/>
                <!-- 分页页码合理-->
                <property name="reasonable" value="true"/>
            </plugin>
        </plugins>
    

获取主键生成值 -- 介绍映射文件的相关配置 -- 重点

  1. 由于MySQL数据库中,表中主键字段,在设计时设置自动生成值,那么有些时候是需要在程序中获取到MySQL自动生成的这个主键值

  2. 如何获取

    1)两种方式:

    属性方式(新增语句中添加两个属性useGeneratedKeys="true" keyProperty="uid")

    标签方式(添加selectKey标签 keyProperty、keyColumn、resultType、order)

    <selectKey keyProperty="uid" keyColumn="uid" resultType="int" order="AFTER">
        select last_insert_id()
    </selectKey>
    

    2)在数据库有 auto_increment 属性时都可用;如果没有,只能用标签方式

  3. 映射文件中SQL片段概念以及相关操作

    1)为了实现映射文件中多处的相同SQL片段的统一管理,采取了 SQL 片段抽离 以及引用回去的设计,以便于在修改和维护的时候比较方便

    2)实现 抽离 sql标签 属性id为唯一标识 引用 include标签 属性refid

  4. 动态SQL标签 -- 重点

    1)是指通过这些标签可以实现SQL动态变化

    2)包含的标签有:where、if、choose+when+ohterwise、set、foreach、trim

    3)where 标签用于代替where关键字,有条件则转回where关键字向SQL中传入,如果没有条件则不传入。

    4)set 标签代替 set 关键字,在预编译的时候又转回set关键字传入 SQL 中

    5)if 选择判断标签 用于实现条件成立时,向SQL中传入被 if 标签包裹的内容 mybatis框架能自动帮我们删除多余的and 关键字(前后都会删除)

    6)foreach 标签 循环遍历标签,在循环时向SQL中传入指定的内容

    7)choose+when+ohterwise 标签 用于实现选择判断,当when 部分有一个条件成立时,其他所有成立的条件都不执行,因此只把成立位置的SQL片段传入SQL中去

    8)trim 标签 --- 自定义标签 可以使开发者更灵活的向SQL中传入指定的内容 prefix、suffix 管前后传入

    prefixoverrid、suffixoverrid 管前后删除

  5. resultType 和 resultMap 属性加标签 -- 重点

    1)在实现 select 查询时使用 resultType 或者 resultMap

    2)区别:

    A、resultType 只有属性;resultMap 有属性和标签

    B、当实体类属性名和表中字段名称相同时使用resultType;

    当实体类属性名和表中字段名称不相同时使用resultMap(使用mysql的字段别名也可以)

    C、实现多表关联查询的时候使用resultMap,不能使用resultType。

    3)resultType 可以设置的类型有哪些?

    A、实体类类型

    B、一般类型:Integer、String、Date……

    C、Map 类型

    4)resultMap (标签)可以设置类型有

    A、实体类类型

    B、复合实体类类型

resultMap属性和标签(重点)

关联查询第一套方案

嵌套结果查询 -- 连接查询
  1. 多表关联查询时,resultMap的使用 -- 要把数据映射封装到实体类/复合实体类对象中(否则使用Map key-value即可)

    image-20210708094520354

  2. 多表关联查询,结果使用 map 封装,如何处理?

    1)查询用户信息,关联详细信息

    2)resultType 写map 用List Map 接收 即可

  3. 关联查询一对一查询(实体类和复合类封装数据)

    1)查询用户信息,关联详细信息

    1. resultMap 标签 id result 标签 写 查询表的实体使用 association 标签 中 id、result 标签写连接的表实体

    3)SQL语句是连接查询语句(包括内外连接)

    4)查询用户详细信息属于哪个用户

    A、实体主方 添加 关联实体

  4. 关联查询 实现 一对多关联查询

    1)查询用户信息,管理多收件地址

  5. 多对多的关联查询

    1)查询用户信息,关联用户购买商品

    2)通过 实体类设计 collection association标签嵌套关系 实现连接查询

关联查询第二套方案

  1. 一对一、一对多、多对多关联查询,换一种方式嵌套查询、分表查询方式。

  2. 一对一的分表查询实现

    1)查询用户信息,关联查询详细信息

    2)配置文件变化 语句变化为单表查询

    一对一查询嵌套 association 标签中添加 column 属性(本方字段id值)和 select 属性(本方的字段值送到对方的具体位置,实际上就是对方的某个方法处)相当于左外连接查询

    特点:

    • SQL语句变化连接查询变为单表查询
    • 在 association中没有下级标签 多了两个属性 column 和 select 对方需要配置相应xml内容
  3. 一对多实现

    1)查询用户信息 以及具备的地址信息

    2)association替换为collection javaType替换为ofType即可

  4. 多对多实现

    1)查询用户 关联购买商品有哪些

延迟加载

  1. 介绍

    延迟策略、懒加载、延迟查询,是和查询有关。是指在实现查询的时候把查询语句,从框架向数据库的发送时间延后。在后续程序中如果需要使用相关的数据了,此时才向数据发送SQL查询语句。

  2. 在 mybatis 中延延迟策略的实现只有一种情况,关联查询时,查询对方数据可能会被延迟

  3. 在 mybatis 中实现延迟策略时,只有分表方案才能实现延迟。(所以分表方式常用!)

  4. 演示

    1)局部:使用get展示看效果

    一对一、一对多的配置 association、collection 标签中 加入属性 fetchType 值为lazy 不用不发数据,中间可以隔一段时间,用了才发送。

    2)全局:核心配置文件加入全局配置settings标签(properties下typeAliases上)

    name为 lazyLoadingEnabled、

    aggressiveLazyLoading(极其懒加载)

    value为true

    3)目的:为了减少向数据库发送 SQL 的次数、从而降低数据库的压力,起到提高整体性能好处

mybatis 中逆向工程

  1. 介绍

    利用表,使用相关的工具,可以用工具帮助开发者创建出实体类、持久层接口、映射文件,这样的操作就是逆向工程

  2. 作用

    调高开发的效率

  3. 实现

    1)导入相关的包

    org.mybatis.generator

    mybatis-generator-core

    1.4.0

    2)创建一个 xml 配置文件 -- 逆向工程需要的配置文件

    官网

    https://mybatis.org/generator/quickstart.html

    使用 MyBatis3驱动 xml 文件(不用Simple)

    --- 文件中进行相关配置

    • 驱动配置
    • 逆向生成的时候 取消注释配置
    • commentGenerator标签下 property标签 属性name为suppressAllComments 属性value为true
    • 数据源配置
    • targetPackage
    • 生成实体类 model 保存位置
    • 生成的 xml 文件的保存位置
    • 生成的持久层接口 mapper 的配置
    • 哪些表要参与逆向工程
    • table标签 tableName属性 写入表名

    3)运行工具代码

    找到官网 copy run with Java

    位置写绝对路径

    运行

    4)默认命名规则 表明 属性 去掉下划线 字母大写

    example类封装条件片段(写入了很多常用SQL查询的条件)抽象类 有三个内部类 将SQL片段传入 生成完整的SQL语句

    条件的操作 -- example 条件对象 -- 没有SQL片段

    使用需要example下静态内部类

    封装片段查询对象:example.createCriteria

    逆向工程 不生成关联查询

mybatis缓存

缓存空间(计算机内存条)临时存放 内存读写速度较快 降低数据库的压力 提高整体的性能

  1. 一级缓存和二级缓存

    1)一级缓存属于session,由session管理,有session才有一级缓存,一个session对应一个一级缓存,有多少个session有多少个一级缓存,可以借助session实现一级缓存数据的清理和更新(clearCache方法)。实现数据的增删改操作,一级缓存数据自动删除。查询时候重新缓存。

    2)二级缓存属于mapper级别的,多个session共用的 的缓存 一般只有一个,可以清理和更新。实现数据的增删改操作,二级缓存数据也自动删除。

    (注意:第一个session直接到数据库查询,再到二级缓存保存 守护线程判断是否为第一个)

    image-20210709094314779

  2. 一级缓存

    1)有 session 就有一级缓存、所以当 session 被创建出来那么一级缓存就有了

  3. 二级缓存

    1)默认是关闭的

    2)如果需要使用则首先开启:有两个位置需要操作:全局配置 settings cacheEnabled(新版本默认开启)位置和映射文件 加入cache标签即可 默认类型设置为 PerpetualCache 永恒的缓存 也可以选用其他二级缓存类型 导入jar包 添加type设置 如ehCache、memberCache、Redis 如需要自定义实现类 就是定义Cache接口的实现类

mybatis注解

Overrid、Test、 WebServlet等注解

  1. 介绍

    代替配置实现增删改查等功能,不同的注解具备不同功能

  2. 有哪些注解:

    1)实现增删改查的注解:@Insert、@Delete、@Update、@Select

    2)实现获取主键的注解:@SelectKey

    3)实现名称不一致或者联合查询的注解:@Results、@Result、@one、@Many

    Results 相当与ResultMap 标签

    注解中添加相应的属性如:id=true、column、 property、javaType、one、many、select

    多表的话many可以将javaType缺省 没有ofType

    one和many里的属性 fetchType = FetchType.LAZY/EAGER 懒加载与急加载

  3. 实现

  4. 业务复杂度没有那么高适合使用注解的方式,SQL变化不大适合使用注解方式,其他情况使用配置,分布式项目配置为主


标题:MyBatis框架的学习
作者:HB2Ocean
地址:http://future-hb.top:8080/articles/2021/07/18/1626600272490.html