**Mybatis框架 笔记一 [共四篇,史上最全重点]*

版权声明:文章为作者自己原创文章,转载请注明出处。 https://blog.csdn.net/qq_37128049/article/details/83500905

mybatis的四天安排

* 第一天: mybatis入门
	* mybatis的概述
	* mybatis的环境搭建
	* mybatis入门案例
	* 自定义mybatis框架(主要的目的是为了让大家了解mybatis中执行细节)
* 第二天:mybatis基本使用
	* mybatis的单表crud操作
	* mybatis的参数和返回值
	* mybatis的dao编写
	* mybatis配置的细节
		* 几个标签的使用
* 第三天:
	* mybatis的深入和多表
	* mybatis的连接池
	* mybatis的事务控制及设计的方法
	* mybatis的多表查询
		* 一对一(多对一)
		* 多对多
* 第四天:
	* mybatis的缓存和注解开发
	* mybatis中的加载时机(查询的时机)
	* mybatis中的一级缓存和二级缓存
	* mybatis的注解开发
		* 单表CRUD
		* 多表查询

mybatis今日

1.什么是框架?
* 它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。
* 框架是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法。 另一种定义认为:框架是一种可被应用开发者定制的应用骨架。前者是从应用层面后者是从目的方面给出的定义。
* 通俗的讲:它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。
* 以我们的角度解决实际开发的角度描述框架:
* 框架是实现了一定功能的半成品软件,所谓半成品软件,就是没有完全实现用户的需求,只实现了一部分。框架还需要加工,不断完善,才能满足用户的所有需求。所以:框架面向的客户是开发人员,而不是客户。
* 既然框架是半成品软件,我们又为什么要花这么大的成本去学习呢?
1.实现完成了一定的功能(简单,重复的,复杂的等之类的),提供了方便。
2.提供了非常清晰的架构。
3.做IT,互联网,思维很重要!要懂底层原理,活学活用。
* 使用的好处:
* 框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高效率
2.三层架构:
* 表现层: 是用于展示数据的 SpringMVC
* 业务层: 是处理业务需求 Sping :IOC(控制反转与面向切面)
* 持久层: 是和数据库交互的 Mybatis
3.持久层技术解决方案:
* JDBC技术:
* Connection 连接
* PreparedStatement 连接对象
* ResultSet 查询
* Spring 的JdbcTemplate
* Spring 中对jdbc的简单封装
* Apache的BDUtils:
* 它和Spring的JdbcTemplate很像,也是对Jdbc的简单封装
* 以上这些都不是框架,JDBC是规范,其他都只是工具类。只是使用的封装,并没有一套完整的解决方案。
* 为什么要用框架:
* 开发人员需要关心的是核心业务逻辑,而不是一系列为了核心业务逻辑而做的大量预备工作。
4.mybatis的概述:
* mybatis是一个持久层框架,用java编写的
* 它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等繁杂过程
* mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。
* 它使用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbc实现的细节。实现了结果集的封装。
* ORM:Object Relational Mappging 对象关系映射
* 简单的说:就是把数据库表和实体类及实体类的属性对应起来,让我们可以操作实体类就实现操作数据库表;
* 今天我们需要做到:实体类中的属性和数据库表的字段名称保持一致。
* user -> Uer
* id -> id
* user_name ->user_name
5.mybatis的入门
* mybatis的环境搭建(创建项目的时候不要导入模板,因为里面有很多bug,以后可能会出现各种各样的问题。)
1. 打开idea工具,创建一个空的工程
2. 创建一个maven项目,GroupId:com.theima ArtifactId:day01_mybatis
3. 打开SQLYog,复制mybatisdb.sql中的User,创建User表,再添加进数据。
4. 在pom.xml中添加角标。depencies中添加:mybatis, mysql,log4j(日志),junit(单元测试)
5. 在com.ithema.domain创建一个User.java表,创建对应的参数和相应的方法。
6. 创建一个Dao包下的IUserDao(前面I无其他含义,只是为了表明这是一个接口)接口,提供一个方法,ListfindALl()
7. 在resource下新建一个SqlMapConfig.xml(习惯会以此命名,无其他含义),将pom.xml头部信息导入进来。(核心配置文件)

<?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>
	<!-- 配置 mybatis 的环境 -->
	<environments default="mysql">
	<!-- 配置 mysql 的环境 -->
	<environment id="mysql">
	<!-- 配置事务的类型 -->
	<transactionManager type="JDBC"></transactionManager>
	<!-- 配置连接数据库的信息:用的是数据源(连接池) -->
	<dataSource type="POOLED">
	<property name="driver" value="com.mysql.jdbc.Driver"/>
	<property name="url" value="jdbc:mysql://localhost:3306/ee50"/>
	<property name="username" value="root"/>
	<property name="password" value="123456"/>
	</dataSource>
	</environment>
	</environments>
	<!-- 告知 mybatis 映射配置的位置 -->
	<mappers>
	<mapper resource="com/itheima/dao/IUserDao.xml"/>
	</mappers>
	</configuration>
	8. 在resources中创建对应的三级目录映射文件IUserDao.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">
		<mapper namespace="com.itheima.dao.IUserDao">
		<!-- 配置查询所有操作 -->
		<select id="findAll" resultType="com.itheima.domain.User">
		select * from user
		</select>
	9. 测试---步骤:
		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 suer: users){
			* System.out.println(user);
			* }
		6. 释放资源
			* session.close();
			* in.close();
* 总结:
	* mybaits的环境搭建
		1. 创建maven项目
		2. 导入maven的相关坐标
		3. 准备数据资源(建表)
		4. 创建核心配置文件SqlMapConfig.xml  (建议命名统一规范)
		5. 创建映射配置文件			(映射与包名都必须一致相同)
		6. 创建测试类
			1. 读取配置文件
			2. 创建SqlSessionFactory工厂
			3. 创建SqlSession
			4. 创建Dao接口的代理对象
			5. 执行dao中的方法
			6. 释放资源
				* 注意事项:不要忘记在映射配置中告知mybatis中
	* 环境搭建的注意事项:
		1. 创建IUserDao.xml和IuserDao.java时名称是为了和我们之前的知识保持一致,在Mybatis中它把持久层的操作接口名称和映射文件也叫做Mapper;所以:IuserDao和IUserMapper是一样的
		2. 
			* 在idea中创建目录的时候,它和包是不一样的
			* 包在创建时,com.itheima.dao是三级目录
			* 目录在创建时,com.theima.dao是一级目录
		3. mybatis的映射配置文件位置必须和dao接口的包结构相同
		4. 映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
		5. 映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名
			当我们遵从了三,四,五点之后,我们在开发中就无需再写dao的实现类。
* 使用注解方法创建mybatis案例:
	1.创建环境工程
	2.创建对应的项目,domain实体类,dao接口,pom.xml(不需要在resouces中创建dao接口的对应配置文件了)
	3.将pom.xml中<mappers>内容修改为:<mapper class="com.itheima.dao.UserDao";  //class中写全限定类名
	4.在dao接口的方法上使用@Select注解,并且指定SQL语句  //@Select("select* from user")
* 明确:
	* 我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式。(mybatis中是支持写实现类的,但实际上是不用写的)
	* 不管
	* 使用配置文件跟类不关联,而配置文件是直接写在类方法上的,所以能省去很多方法。实际开发过程中,两个都在用,看实际情况。
* 读配置文件:
	* 错误:
		* d:/xxx/xxx.xml
		* src/java/main/xxx.xml
	* 正确方式:
		1. 使用类加载器,它只能读取类路径的配置文件
		2. 使用ServletContext对象的getRealPath()
	* 创建工厂mybatis使用了构建者模式:
		* 优势:把对象的创建细节隐藏,使使用者直接调用方法即可拿到对象。
	* 生产SqlSession使用了工厂模式:
		* 优势:解耦(降低类之间的依赖关系)
	* 创建Dao接口实现类使用了代理模式
		* 优势:不修改源码的基础上对已有的方法进行增强。

mybatis的入门案例–掌握

* 读取配置文件sqlMapconfig.xml
* 创建SqlSessionFactory工厂	
* 使用工厂生成SqlSession对象
* 使用sqlSession对象创建dao接口的代理独享
* 执行dao的方法
* 释放资源
  注意:在查询操作过程中,不要忘记在映射配置文件中药指定返回的结果集全类名,要求XML和注解的方式各写一套;

自定义mybatis框架

  1. 原理解析一:
    1. 根据配置文件的信息创建Connection对象
      • 注册驱动,获取连接
    2. 获取预处理对象PreparedSatement
      • 此时需要SQL语句 conn.prepareStatement(sql);
    3. 执行查询
      • ResultSet resultSet=preparedStatement.executeQuery();
    4. 遍历结果集用于封装:
      Listlist=new ArrayList();
      while(reulstSet.next()){
      E element=(E)Class.forName(配置的全限定类名).newInstance()
      //进行封装,把每个rs的内容都添加到element中
      //我们的实体类属性和表中的列名是一致的。
      //于是我们就可以把表的列名看成是实体类的属性名称
      //就可以使用反射的方式来根据名称获取每个属性,并把值赋值进去
      //把element加入到list中
      list.add(element);
      }
    5. 要想上上策的方法执行,需要给方法提供两个信息
      • 第一个: 连接信息
      • 第二个:映射信息:
        • 它包含了两个部分:
          • 第一:执行的SQL语句
          • 第二: 封装结果的实体类的全限定类名
          • 把这两个信息组合起来定义成一个对象
      1. 通过了一个方法实现了一个代理对象的创建

2.自定义Mybatis创建:
1. 创建maven工程,赋值代码(入门案例的代码)
2. 干掉pom.xml中的mybatis的坐标
3. 在测试类MyBatisTest类中会大量报错—>报什么错就建什么类或接口
1. Resources–读取io操作。用类加载器
2. sqlSessionFactoryBuilder–>提供一个build(inputstream in)方法产生一个SqlSessionFactory工厂(接口)
3. 创建SqlSession对象–>SqlSessionFactory中定义另一个openSession()方法
4. SqlSession对象中定义一个getMapper方法
T getMapper(class daoInterfaceClass)
4.关键点:架子已经搭好,接下来就是展示真正的技术了!
1. 在SQLSessionFacotryBuilder,build方法中去加入的工具类去解析io流
2. 工具类就是XMLConfigBuilder
1. 该类帮助我们解析核心主配置文件以及对应的映射文件
2. 返回给我们一个configuration对象,该对象就包含了连接数据库的信息以及sql语句和返回类型的全限定类名
5.核心点:
* 有builder对象创建出来factory对象,factory创建了sqlSession对象
* 关键点Ian就在sqlSession对象的getMapper方法–>通过动态代理

猜你喜欢

转载自blog.csdn.net/qq_37128049/article/details/83500905
今日推荐