• Java后端 学习路线 笔记汇总表【黑马程序员】
  1. MyBatis-学习笔记01【01.Mybatis课程介绍及环境搭建】【day01】
  2. MyBatis-学习笔记02【02.Mybatis入门案例】
  3. MyBatis-学习笔记03【03.自定义Mybatis框架】
  4. MyBatis-学习笔记04【04.自定义Mybatis框架基于注解开发】【day02】
  5. MyBatis-学习笔记05【05.使用Mybatis完成CRUD】
  6. MyBatis-学习笔记06【06.使用Mybatis完成DAO层的开发】
  7. MyBatis-学习笔记07【07.Mybatis的连接池及事务】【day03】
  8. MyBatis-学习笔记08【08.动态SQL】
  9. MyBatis-学习笔记09【09.Mybatis的多表操作】
  10. MyBatis-学习笔记10【10.JNDI扩展知识】
  11. MyBatis-学习笔记11【11.Mybatis的缓存】【day04】
  12. MyBatis-学习笔记12【12.Mybatis注解开发】

目录

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

2 自定义Mybatis的分析-创建代理对象的分析

3 自定义mybatis的编码-根据测试类中缺少的创建接口和类

class Resources

class SqlSessionFactoryBuilder

interface SqlSessionFactory

interface SqlSession

4 自定义mybatis的编码-解析XML的工具类介绍

导入dom4j的坐标

Configuration.java

Mapper

XMLConfigBuilder.java

5 自定义Mybatis的编码-创建两个默认实现类并分析类之间的关系

DefaultSqlSession.java

6 自定义Mybatis的编码-实现基于XML的查询所有操作

7 自定义Mybatis的编码-实现基于注解配置的查询所有

day01附录

泛型术语

截图


mybatis框架 共四天
第一天:mybatis入门mybatis的概述mybatis的环境搭建mybatis入门案例自定义mybatis框架(主要的目的是为了让大家了解mybatis中执行细节)
第二天:mybatis基本使用mybatis的单表crud操作mybatis的参数和返回值mybatis的dao编写mybatis配置的细节几个标签的使用
第三天:mybatis的深入和多表mybatis的连接池mybatis的事务控制及设计的方法mybatis的多表查询一对多(多对一)多对多
第四天:mybatis的缓存和注解开发mybatis中的加载时机(查询的时机)mybatis中的一级缓存和二级缓存mybatis的注解开发单表CRUD多表查询
-----------------------------------------------------------
1、什么是框架?它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。使用框架的好处:框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高开发效率。
2、三层架构表现层:是用于展示数据的业务层:是处理业务需求持久层:是和数据库交互的
3、持久层技术解决方案JDBC技术:ConnectionPreparedStatementResultSetSpring的JdbcTemplate:Spring中对jdbc的简单封装Apache的DBUtils:它和Spring的JdbcTemplate很像,也是对Jdbc的简单封装以上这些都不是框架JDBC是规范Spring的JdbcTemplate和Apache的DBUtils都只是工具类
4、mybatis的概述mybatis是一个持久层框架,用java编写的。它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等繁杂过程它使用了ORM思想实现了结果集的封装。ORM:Object Relational Mappging 对象关系映射简单的说:就是把数据库表和实体类及实体类的属性对应起来让我们可以操作实体类就实现操作数据库表。user          Userid          userIduser_name     userName今天我们需要做到:实体类中的属性和数据库表的字段名称保持一致。user数据表       User实体类id           iduser_name     user_name
5、mybatis的入门mybatis的环境搭建第一步:创建maven工程并导入坐标第二步:创建实体类和dao的接口第三步:创建Mybatis的主配置文件 SqlMapConifg.xml第四步:创建映射配置文件 IUserDao.xml环境搭建的注意事项:第一个:创建IUserDao.xml 和 IUserDao.java时,名称是为了和我们之前的知识保持一致。在Mybatis中它把持久层的操作接口名称和映射文件也叫做:Mapper所以:IUserDao 和 IUserMapper是一样的。(Mapper==Dao)第二个:在idea中创建目录的时候,它和包是不一样的包在创建时:com.itheima.dao是三级结构目录在创建时:com.itheima.dao是一级目录第三个:mybatis的映射配置文件位置必须和dao接口的包结构相同第四个:映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名第五个:映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名好处:当我们遵从了第三、四、五点之后,我们在开发中就无须再写dao的实现类。mybatis的入门案例第一步:读取配置文件第二步:创建SqlSessionFactory工厂第三步:创建SqlSession第四步:创建Dao接口的代理对象第五步:执行dao中的方法第六步:释放资源注意事项:不要忘记在映射配置中告知mybatis要封装到哪个实体类中配置的方式:指定实体类的全限定类名 resultType="com.itheima.domain.User"mybatis基于注解的入门案例:把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名。明确(说明)-mybatis可写dao实现类:我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式,不管使用XML配置还是使用注解配置。但是Mybatis它是支持写dao实现类的。
6、自定义Mybatis的分析:mybatis在使用代理dao的方式实现增删改查时做什么事呢?只有两件事:第一:创建代理对象;第二:在代理对象中调用selectList。自定义mybatis能通过入门案例看到类class Resourcesclass SqlSessionFactoryBuilderinterface SqlSessionFactoryinterface SqlSession

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

6、自定义Mybatis的分析:
    mybatis在使用代理dao的方式实现增删改查时做什么事呢?
        只有两件事:
            第一:创建代理对象
            第二:在代理对象中调用selectList

用什么语句执行,封装到哪里去?

读流,解析配置文件。

(E) 强转类型

查询所有的分析

2 自定义Mybatis的分析-创建代理对象的分析

自定义mybatis分析

3 自定义mybatis的编码-根据测试类中缺少的创建接口和类

6、自定义Mybatis的分析:
    自定义mybatis能通过入门案例看到类
        class Resources
        class SqlSessionFactoryBuilder
        interface SqlSessionFactory
        interface SqlSession

 

 自定义实现类的好处:实现灵活控制(每多一个方法,就可以多一些功能)!

class Resources

package com.itheima.mybatis.io;import java.io.InputStream;/*** 使用类加载器读取配置文件的类*/
public class Resources {/*** 根据传入的参数,获取一个字节输入流** @param filePath* @return*/public static InputStream getResourceAsStream(String filePath) {//Resources.class得到当前类的字节码;getClassLoader()获取字节码的类加载器;//getResourceAsStream根据类加载器读取配置return Resources.class.getClassLoader().getResourceAsStream(filePath);}
}

class SqlSessionFactoryBuilder

package com.itheima.mybatis.sqlsession;import com.itheima.mybatis.cfg.Configuration;
import com.itheima.mybatis.sqlsession.defaults.DefaultSqlSessionFactory;
import com.itheima.mybatis.utils.XMLConfigBuilder;import java.io.InputStream;/*** 用于创建一个SqlSessionFactory对象*/
public class SqlSessionFactoryBuilder {/*** 根据参数的字节输入流来构建一个SqlSessionFactory工厂** @param config* @return*/public SqlSessionFactory build(InputStream config) {return null;}
}

interface SqlSessionFactory

package com.itheima.mybatis.sqlsession;public interface SqlSessionFactory {/*** 用于打开一个新的SqlSession对象** @return*/SqlSession openSession();
}

interface SqlSession

package com.itheima.mybatis.sqlsession;/*** 自定义Mybatis中和数据库交互的核心类* 它里面可以创建dao接口的代理对象*/
public interface SqlSession {/*** 根据参数创建一个代理对象** @param daoInterfaceClass dao的接口字节码* @param <T>* @return*/<T> T getMapper(Class<T> daoInterfaceClass);/*** 释放资源*/void close();
}

4 自定义mybatis的编码-解析XML的工具类介绍

导入dom4j的坐标

 

 

Configuration.java

Mapper

 

XMLConfigBuilder.java

package com.itheima.mybatis.utils;//import com.itheima.mybatis.annotations.Select;import com.itheima.mybatis.annotations.Select;
import com.itheima.mybatis.cfg.Configuration;
import com.itheima.mybatis.cfg.Mapper;
import com.itheima.mybatis.io.Resources;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 用于解析配置文件*/
public class XMLConfigBuilder {/*** 解析主配置文件,把里面的内容填充到DefaultSqlSession所需要的地方* 使用的技术:* dom4j+xpath*/public static Configuration loadConfiguration(InputStream config) {try {//定义封装连接信息的配置对象(mybatis的配置对象)Configuration cfg = new Configuration();//1.获取SAXReader对象SAXReader reader = new SAXReader();//2.根据字节输入流获取Document对象Document document = reader.read(config);//3.获取根节点Element root = document.getRootElement();//4.使用xpath中选择指定节点的方式,获取所有property节点List<Element> propertyElements = root.selectNodes("//property");//5.遍历节点for (Element propertyElement : propertyElements) {//判断节点是连接数据库的哪部分信息//取出name属性的值String name = propertyElement.attributeValue("name");if ("driver".equals(name)) {//表示驱动//获取property标签value属性的值String driver = propertyElement.attributeValue("value");cfg.setDriver(driver);}if ("url".equals(name)) {//表示连接字符串//获取property标签value属性的值String url = propertyElement.attributeValue("value");cfg.setUrl(url);}if ("username".equals(name)) {//表示用户名//获取property标签value属性的值String username = propertyElement.attributeValue("value");cfg.setUsername(username);}if ("password".equals(name)) {//表示密码//获取property标签value属性的值String password = propertyElement.attributeValue("value");cfg.setPassword(password);}}//取出mappers中的所有mapper标签,判断他们使用了resource还是class属性List<Element> mapperElements = root.selectNodes("//mappers/mapper");//遍历集合for (Element mapperElement : mapperElements) {//判断mapperElement使用的是哪个属性Attribute attribute = mapperElement.attribute("resource");if (attribute != null) {System.out.println("使用的是XML");//表示有resource属性,用的是XML//取出属性的值String mapperPath = attribute.getValue();//获取属性的值"com/itheima/dao/IUserDao.xml"//把映射配置文件的内容获取出来,封装成一个mapMap<String, Mapper> mappers = loadMapperConfiguration(mapperPath);//给configuration中的mappers赋值cfg.setMappers(mappers);} else {System.out.println("使用的是注解");//表示没有resource属性,用的是注解//获取class属性的值String daoClassPath = mapperElement.attributeValue("class");//根据daoClassPath获取封装的必要信息Map<String, Mapper> mappers = loadMapperAnnotation(daoClassPath);//给configuration中的mappers赋值cfg.setMappers(mappers);}}//返回Configurationreturn cfg;} catch (Exception e) {throw new RuntimeException(e);} finally {try {config.close();} catch (Exception e) {e.printStackTrace();}}}/*** 根据传入的参数,解析XML,并且封装到Map中** @param mapperPath 映射配置文件的位置* @return map中包含了获取的唯一标识(key是由dao的全限定类名和方法名组成)* 以及执行所需的必要信息(value是一个Mapper对象,里面存放的是执行的SQL语句和要封装的实体类全限定类名)*/private static Map<String, Mapper> loadMapperConfiguration(String mapperPath) throws IOException {InputStream in = null;try {//定义返回值对象Map<String, Mapper> mappers = new HashMap<String, Mapper>();//1.根据路径获取字节输入流in = Resources.getResourceAsStream(mapperPath);//2.根据字节输入流获取Document对象SAXReader reader = new SAXReader();Document document = reader.read(in);//3.获取根节点Element root = document.getRootElement();//4.获取根节点的namespace属性取值String namespace = root.attributeValue("namespace");//是组成map中key的部分//5.获取所有的select节点List<Element> selectElements = root.selectNodes("//select");//6.遍历select节点集合for (Element selectElement : selectElements) {//取出id属性的值      组成map中key的部分String id = selectElement.attributeValue("id");//取出resultType属性的值  组成map中value的部分String resultType = selectElement.attributeValue("resultType");//取出文本内容            组成map中value的部分String queryString = selectElement.getText();//创建KeyString key = namespace + "." + id;//创建ValueMapper mapper = new Mapper();mapper.setQueryString(queryString);mapper.setResultType(resultType);//把key和value存入mappers中mappers.put(key, mapper);}return mappers;} catch (Exception e) {throw new RuntimeException(e);} finally {in.close();}}/*** 根据传入的参数,得到dao中所有被select注解标注的方法。* 根据方法名称和类名,以及方法上注解value属性的值,组成Mapper的必要信息** @param daoClassPath* @return*/private static Map<String, Mapper> loadMapperAnnotation(String daoClassPath) throws Exception {//定义返回值对象Map<String, Mapper> mappers = new HashMap<String, Mapper>();//1.得到dao接口的字节码对象Class daoClass = Class.forName(daoClassPath);//2.得到dao接口中的方法数组Method[] methods = daoClass.getMethods();//3.遍历Method数组for (Method method : methods) {//取出每一个方法,判断是否有select注解boolean isAnnotated = method.isAnnotationPresent(Select.class);if (isAnnotated) {//创建Mapper对象Mapper mapper = new Mapper();//取出注解的value属性值Select selectAnno = method.getAnnotation(Select.class);String queryString = selectAnno.value();mapper.setQueryString(queryString);//获取当前方法的返回值,还要求必须带有泛型信息Type type = method.getGenericReturnType();//List<User>//判断type是不是参数化的类型if (type instanceof ParameterizedType) {//强转ParameterizedType ptype = (ParameterizedType) type;//得到参数化类型中的实际类型参数Type[] types = ptype.getActualTypeArguments();//取出第一个Class domainClass = (Class) types[0];//获取domainClass的类名String resultType = domainClass.getName();//给Mapper赋值mapper.setResultType(resultType);}//组装key的信息//获取方法的名称String methodName = method.getName();String className = method.getDeclaringClass().getName();String key = className + "." + methodName;//给map赋值mappers.put(key, mapper);}}return mappers;}}

5 自定义Mybatis的编码-创建两个默认实现类并分析类之间的关系

DefaultSqlSession.java

6 自定义Mybatis的编码-实现基于XML的查询所有操作

7 自定义Mybatis的编码-实现基于注解配置的查询所有

 

 

day01附录

泛型术语

以ArrayList<E>为例:<>念作typeof
ArrayList<E>中的E称为类型参数变量,其实就是类型的占位符(传入什么类型就是什么类型)。
ArrayList<Integer>中的Integer称为实际类型参数
整个称为ArrayList<E>泛型类型
整个ArrayList<Integer>称为参数化的类型ParameterizedType

Set<String>、Enumeration<String>、Map<String,Object>、Map<K,V>

截图

01三层架构

02持久层总图

03mapper配置文件的创建要求

04mybatis的分析

MyBatis-学习笔记03【03.自定义Mybatis框架】相关推荐

  1. MyBatis学习笔记2 ——第一个MyBatis程序

    MyBatis学习笔记2 --第一个MyBatis程序 参考教程B站狂神https://www.bilibili.com/video/BV1NE411Q7Nx 环境搭建 建立一个mybatis数据库用 ...

  2. Mybatis学习笔记(二)【框架基础搭建】

    Mybatis框架基础搭建 一.数据库搭建 二.创建一个maven工程 三.在pom.xml中导入依赖 四.创建一个mybatis的核心配置文件 配置连接数据库的字段值文件(如果使用方式一就不需要配置 ...

  3. mybatis学习笔记-01什么是mybatis

    该视频为狂神说java视频配套笔记(博主自己手打223,日后做个参考223),b站连接:Mybatis最新完整教程IDEA版[通俗易懂]-01-什么是mybatis 文章目录 1.简介 1.1是什么 ...

  4. 2021年3月8日:MyBatis框架学习笔记02:利用MyBatis实现CRUD操作

    MyBatis框架学习笔记02:利用MyBatis实现CRUD操作 在第一节课中我们在UserMapper.xml里定义了两个查询语句:findById和findAll,对应的在UserMapper接 ...

  5. 超详细Mybatis学习笔记(可供下载)

    文章目录 1.简介 2.第一个Mybatis程序 搭建环境 编写代码 测试 3.CRUD(增删改查) 3.1.几个属性 3.2.select 3.3.insert 3.4.delete 3.5.upd ...

  6. Mybatis学习笔记——第一天

    Mybatis学习打卡 Mybatis学习笔记---第一天 Mybatis笔记 第一天 一.引言 1. 现有Jdbc的缺陷 2. Mybatis框架 3. 搭建环境 1) 引入jar包 2) 引入配置 ...

  7. [MyBatis学习笔记] 二、Mybatis基本操作及相关标签介绍

    [MyBatis学习笔记] 二.Mybatis基本操作及相关标签介绍 一.Mybatis简介 二.简单的CRUD操作 1.构建SqlSessionFactory (1)编辑mybatis-config ...

  8. ant的下载与安装——mybatis学习笔记之预备篇(一)

    看到这个标题是不是觉得有点奇怪呢--不是说mybatis学习笔记吗,怎么扯到ant了?先别急,请容我慢慢道来. mybatis是另外一个优秀的ORM框架.考虑到以后可能会用到它,遂决定提前学习,以备不 ...

  9. mybatis学习笔记--常见的错误

    原文来自:<mybatis学习笔记--常见的错误> 昨天刚学了下mybatis,用的是3.2.2的版本,在使用过程中遇到了些小问题,现总结如下,会不断更新. 1.没有在configurat ...

  10. LearnOpenGL学习笔记—入门03:Hello Triangle

    LearnOpenGL学习笔记-入门03:Hello Triangle 0 前言 1 图形渲染管线 2 顶点输入 3 VAO,VBO 3.1 VAO建立 3.2 VBO建立 4 shader 5 绘制 ...

最新文章

  1. jenkins自动化部署工具
  2. face recognition[翻译][深度人脸识别:综述]
  3. LeetCode Algorithm 240. 搜索二维矩阵 II
  4. VC6安装错误——Error Launching acmboot.exe
  5. swot分析法案例_(附数据集)SWOT分析实战案例!
  6. Markdown绘制UML图
  7. ci php redis,一次基于CI的Redis性能问题定位
  8. CODING 最佳实践:快课网研发效能提升之路 1
  9. Hinton胶囊网络代码正式开源,5天GitHub fork超1.4万
  10. sql中的一些通用函数
  11. 冲动的惩罚 - 刀郎 - 新阿瓦尔古丽
  12. IAR的基本使用教程
  13. wpf DoEvents
  14. Java实现图片压缩功能
  15. 微信自动加好友可以使用python实现
  16. 海蜘蛛软路由linux安装教程,软路由安装设置教程【详细步骤】-太平洋IT百科
  17. python——常用的数学计算公式
  18. elasticsearch的linux安装
  19. 用户价值VS商业价值
  20. 华为交换机导入配置_将一个华为交换机的配置导入另一个已有配置的交换机中...

热门文章

  1. angular 绑定自定义属性_Angular2实现自定义双向绑定属性
  2. 拖链电缆 机器人电缆_trvv高柔性拖链电缆
  3. 计算机专业新老生交流会ppt,铜陵学院实践部新老生交流会.ppt
  4. dubbo k8s 服务发现_服务化改造实践(二)| Dubbo + Kubernetes
  5. android点击弹出滑动条,IndicatorSeekBar Android自定义SeekBar,滑动时弹出气泡指示器显示进度...
  6. AChartEngine中的Renderer和DataSet介绍
  7. 深度学习篇| keras入门(一)
  8. DBSCAN密度聚类
  9. 开源内容管理系统 php mysql_「分享」7 个精致的 PHP 开源内容管理系统(CMS)
  10. 博士申请 | 荷兰代尔夫特理工大学陶倩教授招收医学人工智能全奖博士生