第一章 Mybatis入门

什么是框架

它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。

  • 使用框架的好处:

框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高开发效率。

三层架构

  • 表现层
    • 用于展示数据
  • 业务层
    • 用于处理业务需求
  • 持久层
    • 用于数据库交互01三层架构.png02持久层总图.jpg

      持久层技术的解决方案

      JDBC技术:
      Connection
      PreparedStatement
      ResultSet
      Spring的JdbcTemplate:
      Spring中对jdbc的简单封装
      Apache的DBUtils:
      它和Spring的JdbcTemplate很像,也是对Jdbc的简单封装

注意:以上的持久层技术都不是框架,JDBC是规范,而Spring的JdbcTemplate和Apache的DBUtils都只是工具类。

MyBatis的概述

MyBatis是一个持久层框架,用java编写的。
它封装了jdbc操作的很多细节,使开发者只需要关注SQL语句本身,而无需关注注册驱动,创建连接等繁杂过程
它使用了ORM思想实现了结果集的封装。

ORM:
Object Relational Mapping 对象关系映射
简单的说:
就是把数据库表和实体类及实体类的属性对应起来
让我们可以操作实体类就实现操作数据库表。
user User
id userId
user_name userName
今天我们需要做的
实体类中的属性和数据库表的字段名称保持一致。
user User
id id
user_name user_name

MyBatis的入门

  • Mybatis的环境搭建:

    • 创建maven工程并导入坐标
    • 创建实体类和dao接口
    • 创建MyBatis的主配置文件 SqlMapConfig.xml

      1. <?xml version="1.0" encoding="UTF-8" ?>
      2. <!DOCTYPE configuration
      3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
      5. <!-- MyBatis的主配置文件 -->
      6. <configuration>
      7. <!-- 配置环境 -->
      8. <environments default="mysql">
      9. <!-- 配置mysql的环境 -->
      10. <environment id="mysql">
      11. <!-- 配置事务的类型 -->
      12. <transactionManager type="JDBC"></transactionManager>
      13. <!-- 配置数据源(连接池) -->
      14. <dataSource type="POOLED">
      15. <!-- 配置连接数据库的4个基本信息 -->
      16. <property name="driver" value="com.mysql.jdbc.Driver"/>
      17. <property name="url" value="jdbc:mysql://localhost:3306/mybatis_1"/>
      18. <property name="username" value="root"/>
      19. <property name="password" value="root"/>
      20. </dataSource>
      21. </environment>
      22. </environments>
      23. <!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
      24. <mappers>
      25. <mapper resource="cn/kxwahn/dao/UserDao.xml"></mapper>
      26. </mappers>
      27. </configuration>
    • 创建映射配置文件 UserDao.xml ```xml <?xml version=”1.0” encoding=”UTF-8” ?> <!DOCTYPE mapper PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN” “http://mybatis.org/dtd/mybatis-3-mapper.dtd">

```

  • 环境搭建的注意事项:
    • 创建UserDao.xml和UserDao.java时名称是为了和之前的知识保持一致。在MyBatis中他把持久层的操作接口名称和映射文件也叫做:Mapper。所以:UserDao和UserMapper是一样的
    • 在idea中创建目录的时候,它和包是不一样的。包在创建时:cn.kxwahn.dao是三级结构。目录在创建时:cn.kxwahn.dao是一级目录
    • MyBatis的映射配置文件位置必须和dao接口的包结构相同
    • 映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
    • 映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名

我们遵从了345点之后,在开发中就无须再写dao的实现类

  • Mybatis的入门案例
    • 第一步:读取配置文件
    • 第二步:创建SqlSessionFactory工厂
    • 第三步:创建SqlSession
    • 第四步:创建Dao接口的代理对象
    • 第五步:执行dao中的方法
    • 第六步:释放资源

入门案例的分析.png

  • 注意事项:

    • XML配置方式:
      • 不要忘记在映射配置中告知MyBatis要封装到哪个实体类中
      • 配置的方式:指定实体类的全限定类名
    • MyBatis基于注解的方式:
      • 把UserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定sql语句
      • 同时需要在SQLMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名
  • 明确:

    • 我们在实际开发中,都是越简单越好,所以都是采用不写dao实现类的方式,不管是使用xml配置还是注解配置。但是MyBatis是支持注解配置的。

04mybatis的分析.png查询所有的分析.png

自定义MyBatis的分析:

  • MyBatis在使用代理dao的方式实现增删改查时做什么事情呢?
    • 两件事:
      • 第一:创建代理对象
      • 第二:在代理对象中调用selectList

自定义Mybatis分析.png

  • 自定义MyBatis能通过入门案例看到的类
    • class Resources
    • class SqlSessionFactoryBuilder
    • interface SqlSessionFactory

第二章 MyBatis基本使用

自定义MyBatis开发流程

自定义mybatis开发流程图.png

使用模糊查询需要注意的无标题.png

尽量使用#{参数}

MyBatis几种重要的执行过程

1. 分析编写dao实现类MyBatis的执行过程非常重要的一张图-分析编写dao实现类Mybatis的执行过程(1).png

2. 分析代理dao的执行过程

非常重要的一张图-分析代理dao的执行过程.png非常重要的一张图.png

第三章 MyBatis的高级使用

MyBatis的连接池及事务控制

连接池

  1. 连接池
  • 我们在实际开发中都会使用连接池。
  • 因为它可以减少我们获取连接所消耗的时间。

无标题.png

  1. MyBatis中的连接池
    1. MyBatis连接池提供了3中方式的配置:
      1. 配置的位置:
        1. 主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何种连接池方式
      2. type属性的取值:
        1. POOLED 采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现
        2. UNPOOLED 采用传统的获取连接的方式,虽然也实现了Javax.sql.DataSource接口,但是并没有使用池的思想。
        3. JNDI 采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到的DataSource是不一样的。
          1. 注意:如果不是web或者maven的war工程,是不能使用的。
          2. 课程中使用的tomcat服务器,采用的连接池就是dbcp连接池
  2. mybatis中的事务
    1. 什么是事务
    2. 事务的四大特性ACID
    3. 不考虑隔离性会产生的3个问题
    4. 解决办法:四种隔离级别

它是通过sqlsession对象的commit方法和rollback方法实现事务的提交和回滚

  1. MyBatis中的多表查询
    1. 表之间的关系有几种:
      1. 一对多
      2. 多对一
      3. 一对一
      4. 多对多
    2. 举例:
      1. 用户和订单就是一对多
      2. 订单和用户就是多对一
        1. 一个用户可以下多个订单
        2. 多个订单属于同一个用户
      3. 人和身份证就是一对一
        1. 一个人只能有一个身份证号
        2. 一个身份证号只能属于一个人
      4. 老师和学生之间就是多对多
        1. 一个学生可以被多个老师教过
        2. 一个老师可以教多个学生
    3. 特例:
      1. 如果拿出每一个订单,他都只能属于一个用户。
      2. 所以MyBatis就把多对一看成一对一

MyBatis中的多表查询:
示例:用户和账户
一个用户可以有多个账户
一个账户只能属于一个用户(多个账户也可以属于同一个用)
步骤:

  1. 建立两张表:用户表,账户表
     1. 让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中添加
  2. 建立两个实体类:用户实体类和账户实体类
     1. 让用户和账户的实体类能体现出来一对多的关系
  3. 建立两个配置文件
     1. 用户的配置文件
     1. 账户的配置文件
  4. 实现配置:
     1. 当我们查询用户时,可以同时得到用户下所包含的账户信息
     1. 当我们查询账户时,可以同时得到账户的所属用户信息

示例:用户和角色
一个用户可以有多个角色
一个角色可以赋予多个用户
步骤:

  1. 建立两张表:用户表,角色表
     1. 让用户表和角色表之间具备多对多的关系:需要使用中间表,中间表中包含各自的主键,在中间表中是外键
  2. 建立两个实体类:用户实体类和角色实体类
     1. 让用户和角色的实体类能体现出来多对多的关系
     1. 各自包含对方一个集合引用
  3. 建立两个配置文件
     1. 用户的配置文件
     1. 角色的配置文件
  4. 实现配置:
     1. 当我们查询用户时,可以同时得到用户下所包含的角色信息
     1. 当我们查询角色时,可以同时得到角色的所赋予的用户信息
  1. JNDI数据源

MyBatis基于XML配置的动态SQL语句

where
if
foreach

MyBatis中的多表操作

配置类映射
配置resultMap
SQL(外连接)

第四章 MyBatis注解开发

MyBatis中的延迟加载

问题:在一对多中,当我们有一个用户,他有100个账户。
在查询用户的时候,要不要把关联的账户查出来?
在查询账户的时候,要不要把关联的用户查出来?

在查询用户时,用户下的账户信息应该是,什么时候使用,什么时候查询的。
在查询账户时,账户的所属用户信息应该是随着账户查询时一起查询出来的。

什么是延迟加载:
在真正使用数据时才发起查询,不用的时候不查询。按需加载(懒加载)
什么是立即加载:
不管用不用,只要一调用方法,马上发起查询。

在对应的四种表关系中:一对多,多对一,一对一,多对多
一对多,多对多:通常情况下我们都是采用延迟加载。
多对一,一对一:通常情况下我们都是采用立即加载。

MyBatis中的缓存

什么是缓存:
存在于内存中的临时数据。
为什么使用缓存:
减少和数据库的交互次数,提高执行效率。
什么样的数据能使用缓存,什么样的数据不能使用:
适用于缓存:
经常查询并且不经常改变的。
数据的正确与否对最终的结果影响不大的。
不适用于缓存:
经常改变的数据。
数据的正确与否对最终的结果影响很大的。
例如:商品的库存,银行的汇率,股市的牌价。
MyBatis中的一级缓存和二级缓存:
一级缓存:
它指的是MyBatis中SqlSession对象的缓存。
当我们执行查询之后,查询的结果会同时存入到SqlSession为我们提供的一块区域中。
该区域的结构是一个Map,当我们再次查询同样的数据,MyBatis就会先去SqlSession中查询是否 有,有的话直接拿出来用。
当SqlSession对象消失时,MyBatis的一级缓存也就消失了。

     - 注意:一级缓存是SqlSession范围的缓存,当调用SqlSession的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存。

二级缓存:
它指的是MyBatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。
二级缓存的使用步骤:
第一步:让MyBatis框架支持二级缓存(在SqlMapConfig.xml中配置)
第二步:让当前的映射文件支持二级缓存(在UserDao.xml中配置)
第三步:让当前的操作支持二级缓存(在select标签中配置)

MyBatis中的注解开发

环境搭建

单表CRUD(代理Dao方式)

多表查询操作

缓存的配置