mybatis小结

Mybatis概述

  • mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql语句本身, 而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程
  • 传统JDBC存在问题
    • 1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
    • 2、Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。
    • 3、使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能 多也可能少,修改 sql 还要修改代码,系统不易维护。
    • 4、对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记 录封装成 pojo 对象解析比较方便。

Mybatis快速入门

基于xml配置

  • 编写dao
  • 编写实体类
  • 编写映射文件,IuserDao.xml
  • 编写sqlMapconfig.xml
  • 注意映射文件和Dao目录一致
  • 编写测试类image-20191217104211321

基于注解配置

  • 在持久层添加注解
  • image-20191217104412121
  • 修改配置文件
  • image-20191217104437315

Mybatis与JDBC的比较

  • JDBC频繁创建连接,释放资源,影响性能

    • 解决:使用数据库连接池,在sqlMapConfig.xml文件中配置连接池等信息,添加映射文件
  • JDBC,sql语句写在代码中造成不便维护,实际情况下,sql变动较大,可能需要改变java代码

    • 解决:在XXXmapper.xml中编写sql语句。与java代码分离
  • 向sql语句传参数麻烦,因为sql语句的where 条件不一定,可能多也可能少,占位符需要和参数对应。

    • 解决: Mybatis自动将 java 对象映射至 sql 语句,通过 statement 中的 parameterType 定义输入参数的类型。
  • 对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对 象解析比较方便。

    • 解决: Mybatis自动将 sql执行结果映射至 java 对象,通过statement中的resultType 定义输出结果的 类型。

Mybatis结果输出封装

  • ResultType:如果实体类和数据库字段名完全一致,数据库查询结果能被映射到实体类
  • 当实体类属性名称和查询语句的列名不一致时,引入resultmap,格式如下

mybatis延迟加载

何为延迟加载?

  • 要用数据时再加载,不用不加载,简称懒加载
  • 好处:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速 度要快。
  • 坏处:因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗 时间,所以可能造成用户等待时间变长,造成用户体验下降。

实现需求

association标签

  • 在主配置文件开启懒加载的支持

collection标签

mybatis缓存

一级缓存

  • 范围:sqlsession范围
  • 生命周期:,只要 SqlSession 没有 flush 或 close,它就存在。
  • 可能失去的情况:调用 SqlSession 的修改,添加,删除,commit(),close()等
  • 默认开启一级缓存

二级缓存

  • 范围:mapper映射范围

  • 生命周期:sqlsession没有改动他,便存在

  • 死亡情况:不同的sqlsession修改了

  • 开启二级缓存方式

  • 在主配置文件开启二级缓存

  • 配置相关的 Mapper 映射文件

  • :配置 statement 上面的 useCache 属性

Mybatis注解开发

常用注解

复杂关系映射的注解说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration     PUBLIC "-//mybatis.org//DTD Config 3.0//EN"     "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> 
<!-- 配置 properties 文件的位置 -->
<properties resource="jdbcConfig.properties"></properties>


<!-- 配置别名的注册 -->
<typeAliases><package name="com.itheima.domain"/></typeAliases>
<!-- 配置环境 -->
<environments default="mysql">
<!-- 配置 mysql 的环境 -->
<environment id="mysql">
<!-- 配置事务的类型是 JDBC -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射信息 -->
<mappers>
<!-- 配置 dao 接口的位置,它有两种方式 第一种:使用 mapper 标签配置 class 属性 第二种:使用 package 标签,直接指定 dao 接口所在的包 -->
<package name="com.itheima.dao"/>
</mappers>
</configuration>
-------------The End-------------
0%