Mybatis

作者: 五十米_深蓝 | 来源:发表于2018-12-09 23:36 被阅读3次

    1、原生JDBC缺点
    (1)数据库连接,使用时创建,不使用立即释放,对数据库进行频繁的连接开启和关闭,造成数据库资源浪费,影响数据库性能。
    -----解决方法:使用数据库连接池管理数据库连接。
    (2)将sql语句硬编码到Java代码中,如果sql语句修改,需要重新编译Java代码,不利于程序维护。------解决方法:将sql语句配置在xml文件中。
    (3)向preparedStatement中设置参数,对占位符位置和设置参数值,硬编码在Java代码中,不利于代码维护-----解决方法:将sql语句和占位符号和参数全部配置在xml文件中。
    (4)从resutSet中便利结果数据集时,存在硬编码。---------解决方法:将查询的结果集,自动映射成Java对象。
    2、mybatis框架
    2.1 mybatis介绍
    (1)一个持久层的框架,是apache下的顶级项目,目前代码托管在github上。
    (2)让程序员将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活的生成(半自动,大部分程序员需要自己编写sql语句)满足需要的sql。
    (3)可以将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成Java对象(输出映射)。
    2.2 mybatis框架
    (1)配置文件:
    sqlMapConfig.xml(名称可自定义)------是mybatis的全局配置文件,配置了数据源、事务等mybatis的运行环境。
    mapper.xml------映射配置文件(配置sql语句)


    image.png

    (2)sqlSessionFactory(会话工厂)------创建sqlSession
    (4)sqlSession(会话)------操作数据库,发出更新、查询指令。
    (5)Executor(执行器)是一个接口(基本执行器、缓存执行器)------sqlSession内部通过执行器来操作数据库。
    (6)mapped statement(底层封装对象)------对操作数据库存储封装,包括sql语句、输入参数、输出结果类型等。
    2.3、mybatis查询小结
    (1)${}:表示一个拼接符号,会引起sql注入,不建议使用。
    (2)#{}:表示一个占位符号。


    image.png
    (3)selectone:表示查询出一条记录进行映射。
    (4) selectlist:表示查询出多条记录(列表)进行映射。
    image.png
    (5)parameterType:在映射文件中通过其指定输入参数的类型。
    (6)resultType:在映射文件中通过其指定输出结果的类型。
    2.4 mybatis更新操作
    (1)插入:------自增主键返回
    image.png
    非自增主键返回(使用uuid)
    image.png
    (2)修改 、删除
    image.png
    2.5 mybatis与
    hibernate的区别
    (1)hibernate入门门槛较高,是一个ORM(对象关系映射)框架,对sql语句进行优化、修改比较困难;适用于需求变化不多的中小型项目,如后台管理项目等;
    (2)mybatis专注sql本身,需要程序员自己编写sql语言(非全自动),优化、修改方便;也属于ORM框架(含有输入输出映射);适用于需求变化较多的项目,如互联网项目等。

    2.6 sqlSession


    image.png
    2.7 原始dao层开发(需要些dao接口和dao接口实现类)
    需要向dao实体类中注入SqlSessionFactory,在方法体内部通过SqlSessionFactory创建SqlSession。
    image.png
    2.8 mapper代理方法(只需要关些mapper借口)
    mapper接口规范:
    (1)mapper.java接口中的方法名和mapper.xml配置文件(必须在mybatis配置文件中加载映射)中的statement的id值一致。
    (2)在mapper.xml中namespace等于mapper.java接口的全限定名称。
    (3)mapper.java接口中的方法输入参数类型和mapper.xml配置文件中的statement的parameterType值一致。
    (4)mapper.java接口中的方法返回值类型和mapper.xml配置文件中的statement的resultType制定类型一致。
    image.png
    image.png

    2.8 mybatis全局配置文件
    (1)将数据库连接参数单独配置在jdbc.properties文件中,只需要在mybatis.xml中加载jdbc.properties的属性值。


    image.png
    image.png

    (2)setting全局参数配置
    比如:开启耳机缓存、开启延迟加载等。
    (3)typeAliases(别名)---便于开发
    在mapper.xml中,定义了statement,statement需要指定输入(parameterType)、输出结果映射类型(resultType)。
    基本类型默认别名:int等对应包装类型;
    针对pojo自定义别名:


    image.png

    (4)typeHandlers(类型处理器)
    mybatis中类型处理器用于Java类型和jdbc类型映射,一般不需要自定义(提供的可以满足日常需要)。
    (5)mappers(映射配置)


    image.png
    2.9 mapper映射配置文件
    (1)输入映射
    通过parameterType指定输入参数类型,可以是pojo(包装的多张数据表的字段、复杂查询条件)、简单类型和hashmap等。
    image.png
    image.png
    2.10 输出映射
    (1)resultType---表列名与pojo属性必须一致
    image.png
    image.png

    动态的代理对象中是根据mapper方法的返回值类型确定是调用selectOne还是selectList。
    (2)resultMap
    mybatis中使用resultMap完成高级输出结果映射。


    image.png
    2.11 动态sql
    mybatis核心-对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
    (1)where if 判断
    image.png
    (2)sql片段
    将sql代码块抽取出来,组成一个sql片段,其他的statement中就可以引用sql片段,便于开发。
    定义:
    image.png
    引用:
    image.png
    (3)foreach
    向sql传递数组或者list,mybatis使用foreach解析。
    image.png
    2.12 高级映射
    (1)一对一查询
    resultType实现:
    image.png
    resultMap实现:
    image.png
    image.png
    image.png

    一对一查询时resultMap与resultType的对比:


    image.png
    (2)一对多查询
    image.png
    image.png
    (3)多对多查询
    image.png
    image.png
    image.png
    image.png
    2.13 延迟加载
    (1)什么是延迟加载
    resultMap可以实现高级映射(使用association、collection实现一对一以及一对多映射)association、collectio具备延迟加载功能。
    image.png
    (2)实现
    image.png
    image.png
    (3)mybatis默认不开启延迟加载,改配置在mybatis中的核心配置文件中设置:
    image.png
    2.14 查询缓存
    mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。mybatis提供了一级缓存和二级缓存。
    image.png
    (1)一级缓存
    image.png
    一级缓存的工作原理:
    如果sqlsession去执行commit(更新)操作,清空sqlsession中的一级缓存,这样做的目的是让一级缓存中存储的是最新的数据,避免读取到脏数据。
    mybatis默认支持一级缓存,不需要在配置文件中去配置。
    一级缓存的应用:
    在mybatis和spring进行整合开发中,事物是控制在service层中,一个service方法中包括很多的mapper方法。
    image.png
    (2)二级缓存
    image.png
    mybatis二级缓存原理:
    image.png
    二级缓存与一级缓存的区别:
    二级缓存的范围更大,多个sqlseesion可以共享一个userMapper的二级缓存区域。userMapper有一个二级缓存区域(按namespace分),其他的mapper也有自己的二级缓存区域(按namespace分)。即每一个namespace的mapper都有一个二级缓存区域,两个mapper的namespace如果相同,那么这两个mapper执行查询到的数据将存储在相同的二级缓存区域中。
    开启二级缓存:
    mybatis的二级缓存是mapper范围级别的,除了在SqlMapConfig.xml设置cacheEnabled属性(默认true开启);
    image.png
    还需要在userMapper.xml中开启二级缓存,userMapper.xml下的sql执行完会存储到它的缓存区域中(HashMap)。
    image.png
    调用pojo类实现序列化接口(Serializable接口):
    为了将缓存数据取出执行反序列化操作,因为二级缓存数据存储介质多种多样,在内存中不一样。
    注意:sqlSession必须进行close操作,才能将sqlSession获取的数据写到二级缓存区域。
    二级缓存参数:
    image.png
    注:针对每次查询都需要最新的数据sql,可以设置为禁用缓存。
    刷新缓存:一般执行完commit操作都需要刷新缓存,(mapper的statement属性)flashCache=true(默认)表示刷新缓存。
    2.15 mybatis整合ehcache

    mybatis无法实现分布式缓存,需要和其他分布式缓存框架进行整合。
    *分布缓存(Redis、ehcache、memcached):提高系统并发、性能,一般对系统进行分布式部署(集群部署方式)。
    (1)整合方法:
    mybatis提供了一个cache接口,如果要实现自己的缓存逻辑,实现cache接口开发即可;例如:mybatis和ehcache整合,mybatis和ehcache整合包中提供了一个cache接口的实现类。
    (2)配置mapper总cache中的type为ehcache对cache接口的实现类型。


    image.png
    (3)加入ehcache的配置文件(classpath下加入ehcache.xml文件)
    2.16 二级缓存应用场景
    (1)访问多的查询请求且用户对查询结果实时性要求不高的;
    (2)耗时较高的统计分析sql,电话账单查询,产品代码查询等;
    (3)设置缓存刷新时间间隔flashinterval属性;
    (4)二级缓存的局限性:对细粒度的数据缓存实现不好;
    image.png

    2.17 mybatis整合spring



    (1)spring通过单例模式管理sqlSessionFactory


    image.png
    image.png
    (2)spring管理mapper.java

    通过MapperFactoryBean创建代理对象(繁琐不推荐):


    image.png
    通过MapperScannerConfigurer(扫描)自动创建代理对象(推荐):

    2.18 逆向工程
    mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表(数据库表)自动生成mybatis执行所需要的代码(mapper.java、mapper.xml、po...)
    (1)运行逆向工程(建议使用Java程序方式,不依赖开发工具)
    (2)生成代码的配置文件
    (3)执行生成程序

    (4)使用生成的代码(将生成工程所生成的代码拷贝到自己的工程中)

    相关文章

      网友评论

          本文标题:Mybatis

          本文链接:https://www.haomeiwen.com/subject/llbvmftx.html