课程介绍


  • 第一天:mybatis的入门
  • mybatis的概述
  • mybatis的环境搭建
  • mybatis入门案例
  • 自定义mybatis框架(目的:了解mybatis的执行细节)
  • 第二天:mybatis基本使用

  • mybatis的单表crud操作
  • mybatis的参数和返回值设置 
  • mybatis的dao编写
  • mybatis的配置细节
    • 几个标签的使用

  • 第三天:mybatis的深入和多表

  • mybatis的连接池
  • mybatis的事务控制及设计方法
  • mybatis的多表查询

    • 一对多(多对一)
    • 多对多


  • 第四天::mybatis的缓存和注解开发

  • mybatis中的加载时机(查询时机)
  • mybatis的一级缓存和二级缓存
  • mybatis的注解开发

    • 单表crud
    • 多表查询


一、介绍 1、什么是框架

  • 框架是软件开发中的一套解决方案,不同的框架可以解决不同的问题
  • 框架的好处:
  • 封装了许多细节,使开发者使用极简的方式实现功能,大大提高开发效率。

2、三层架构和ssm框架的对应关系

  • 表示层:用于展示数据
  • 业务层:处理业务需求
  • 持久层:用于和数据库交互

MyBatis01:框架概述、环境搭建及入门案例、自定义框架_sql

3、持久层技术解决方案

  • JDBC技术的三个对象
  • Connection
  • PrepareStatement
  • ResultSet
  • Spring的JdbcTemplate
  • Spring中对JDBC的简单封装
  • Apache的DBUtils:
  • 和Spring的JdbcTemplate类似,为对JDBC的简单封装
  • 上述都不是框架

  • JDBC是规范
  • Spring的JdbcTemplate和Apache的DBUtils只是工具类

JDBC操作数据库的问题分析

  • 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
  • Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java代码。
  • 使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。
  • 对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便

4、mybatis概述

  • mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
  • mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来
  • 采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装
  • 总结:Java语言编写的持久层框架,封装了jdbc操作的细节,使开发者只需要关注sql语句本身,无需关注注册驱动、创建连接等繁杂过程;使用ORM实现了结果集封装
  • ORM:
  • Object Relational Mapping:对象关系映射
  • 即:
  • 将数据库表和实体类及实体类的属性对应起来
  • 可以通过操作实体类就实现操作数据库表
  • 今天学习(自定义部分):
  • 实体类属性和数据库表中字段保持一致

二、入门案例 1、mybatis的入门

  • mybatis的环境搭建
  • 创建maven工程并导入坐标
  • 创建实体类和dao接口
  • 创建mybatis的主配置文件SqlMapConfig.xml
  • 创建映射配置文件IUserDao.xml
  • 环境搭建的注意事项:
  1. 创建IUserDao.xml和IUserDao.java时,名称是为了和之前的知识保持一致。在mybatis中把持久层的操作接口名称和映射文件也叫作Mapper。所以IUserDao和IUserMapper相同
  2. 在idea中创建目录时,它和包的创建不同。
  1. 包在创建时:com.itcast.dao是三级结构
  2. 目录在创建时:com.itcast.dao是一级目录,需要一级一级地创建
  1. mybatis的映射配置文件必须和dao接口的包结构相同
  2. 映射配置文件的mapper标签中namespace属性的取值必须是dao接口的全限定类名
  3. 映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名
  4. 当遵守了后三点(c、d、e)之后,无需再写dao的实现类
  • mybatis的入门案例
  1. 读取配置文件
  2. 创建SqlSessionFactory工厂
  3. 使用工厂生产SqlSession对象
  4. 使用SqlSession创建Dao接口的代理对象
  5. 使用代理对象执行方法
  6. 释放资源
  • 注意事项:
  • 在需要在映射配置中告知mybatis要封装到哪个实体类中
  • 配置的方式:指定实体类的全限定类名
package com.itcast.test;
import com.itcast.dao.IUserDao;
import com.itcast.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* 入门案例
*/
public class MybatisTest {
/**
* 入门案例
* @param args
*/
public static void main(String[] args) throws IOException {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
//6.释放资源
session.close();
in.close();
}
}
  • mybatis基于注解的入门案例
  • 把IUserDao.cml移除,在dao接口的方法上使用@Select注解,并指定SQL语句
  • 同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定被注解的dao全限定类名
  • 明确:在实际开发中,都是越简便越好,所以均采用不写dao实现类的方式;不管是使用xml还是注解配置。但mybatis支持使用dao实现类

2、入门案例中的设计模式分析

MyBatis01:框架概述、环境搭建及入门案例、自定义框架_xml_02

  • 读取配置文件:
  • 相对路径和绝对路径不可以
  • 方式
  • 类加载器
  • ServletContext的getContextPath()
  • mybatis的SqlSessionFactory工厂由别人创建,使用了构建者模式

  • 构建者模式:找工队SqlSessionFactoryBuilder盖工厂,只需要给包工队SqlSessionFactoryBuilder钱(in)
  • 隐藏对象创建细节,使用者直接调用方法即可拿到对象

  • 生产SqlSession使用了工厂模式(出厂时就写好了)

  • 对不同的实现类,new 1()实现,new 2()实现,需要更改源码,则需要重新编译部署启动服务器
  • 使用工厂生产session对象,降低了类之间的依赖关系(解耦)

  • 创建dao接口实现类,通过seesion的getMapper方法,使用了代理模式
  • 不修改源码的基础上对已有方法增强

三、自定义Mybatis的分析 1、执行查询所有分析

  • mybatis在使用代理dao方式实现增删改查时做的事情
  • 创建代理对象
  • 在代理对象中调用selectList方法

自定义Mybatis分析.png

MyBatis01:框架概述、环境搭建及入门案例、自定义框架_xml_03MyBatis01:框架概述、环境搭建及入门案例、自定义框架_sql_04MyBatis01:框架概述、环境搭建及入门案例、自定义框架_xml_05MyBatis01:框架概述、环境搭建及入门案例、自定义框架_封装_06

2、创建代理对象的分析

MyBatis01:框架概述、环境搭建及入门案例、自定义框架_封装_07

3、编码-根据测试类中缺少的创建接口和类

  • 能看到的类
  • class Resources✔
  • class SqlSessionFactoryBuilder
  • interface SqlSessionFactory
  • interface SqlSession

4、解析XML的工具类介绍 5、创建两个默认实现类并分析类之间的关系 6、实现基于XML的查询所有操作 7、实现基于注解配置的查询所有

  • 修改配置文件
  • 创建select注解
  • 取消注释