Skip to content

Latest commit

 

History

History
399 lines (355 loc) · 16.9 KB

Mybatis笔记 .md

File metadata and controls

399 lines (355 loc) · 16.9 KB

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、什么是框架? 它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。 使用框架的好处: 框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高开发效率。 2、三层架构 表现层: 是用于展示数据的 业务层: 是处理业务需求 持久层: 是和数据库交互的 3、持久层技术解决方案 JDBC技术: Connection PreparedStatement ResultSet Spring的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			User
		id			userId
		user_name		userName
今天我们需要做到
	实体类中的属性和数据库表的字段名称保持一致。
		user			User
		id			id
		user_name		user_name

5、mybatis的入门 mybatis的环境搭建 第一步:创建maven工程并导入坐标 第二步:创建实体类和dao的接口 第三步:创建Mybatis的主配置文件 SqlMapConifg.xml 第四步:创建映射配置文件 IUserDao.xml 环境搭建的注意事项: 第一个:创建IUserDao.xml 和 IUserDao.java时名称是为了和我们之前的知识保持一致。 在Mybatis中它把持久层的操作接口名称和映射文件也叫做:Mapper 所以:IUserDao 和 IUserMapper是一样的 第二个:在idea中创建目录的时候,它和包是不一样的 包在创建时:com.itheima.dao它是三级结构 目录在创建时:com.itheima.dao是一级目录 第三个:mybatis的映射配置文件位置必须和dao接口的包结构相同 第四个:映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名 第五个:映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名

	当我们遵从了第三,四,五点之后,我们在开发中就无须再写dao的实现类。
mybatis的入门案例
	第一步:读取配置文件
	第二步:创建SqlSessionFactory工厂
	第三步:创建SqlSession
	第四步:创建Dao接口的代理对象
	第五步:执行dao中的方法
	第六步:释放资源

	注意事项:
		不要忘记在映射配置中告知mybatis要封装到哪个实体类中
		配置的方式:指定实体类的全限定类名
	
	mybatis基于注解的入门案例:
		把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句
		同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名。
明确:
	我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式。
	不管使用XML还是注解配置。
	但是Mybatis它是支持写dao实现类的。

xml文件配置

<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
    <mapper resource="com/itheima/dao/IUserDao.xml"/>
</mappers>
子配置文件 select * from user

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

自定义mybatis能通过入门案例看到类
	class Resources
	class SqlSessionFactoryBuilder
	interface SqlSessionFactory
	interface SqlSession

"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" -Dmaven.multiModuleProjectDirectory=E:\IDEA\myMybatis\asd -DarchetypeCatalog=internal -Dmaven.home=E:\Tools\apache-maven-3.5.2-bin\apache-maven-3.5.2 -Dclassworlds.conf=E:\Tools\apache-maven-3.5.2-bin\apache-maven-3.5.2\bin\m2.conf -Didea.launcher.port=51189 "-Didea.launcher.bin.path=E:\IDEA\IntelliJ IDEA 2018.3.5\bin" -Dfile.encoding=UTF-8 -classpath "E:\Tools\apache-maven-3.5.2-bin\apache-maven-3.5.2\boot\plexus-classworlds-2.5.2.jar;E:\IDEA\IntelliJ IDEA 2018.3.5\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMainV2 org.codehaus.classworlds.Launcher -Didea.version=2018.3.5 -Dexec.workingdir=E:\IDEA\myMybatis\asd "-Dexec.args=-classpath %classpath com.it.test.A" "-Dexec.executable=C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" exec:exec [INFO] Scanning for projects...

第二天:mybatis基本使用

1、回顾mybatis自定义和环境搭建+完善自定义Mybatis的注解开发 2、Mybatis基于代理Dao的CRUD操作 重点内容
细节: 对于删除方法,他是一个基本类型或者是基本类型包装类作为参数传递时,占位符可以随意写

	<!-- 删除用户 --> 
	<delete id="deleteUser" parameterType="java.lang.Integer"> 
		delete from user where id = #{uid} 
	</delete>  
	模糊查询 两种写法
	保存操作之后,获取id值

3、CRUD中可能遇到的问题:参数的传递以及返回值的封装 4、介绍Mybatis基于传统dao方式的使用(自己编写dao的实现类) 了解的内容

源码分析,能让自己理解更深刻,和自定义的mybatis逻辑基本一致
断点调试,跟踪源码

5、mybatis主配置文件中的常用配置 properties标签 typeAliases标签 ---解释Integer的写法 mappers标签的子标签:package

<!-- 用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写-->
<package name="com.itheima.domain"></package>

OGNL表达式: Object Graphic Navigation Language 对象 图 导航 语言

它是通过对象的取值方法来获取数据。在写法上把get给省略了。
比如:我们获取用户的名称
	类中的写法:user.getUsername();
	OGNL表达式写法:user.username     类的成员变量,和类的属性  有可能会不一样
mybatis中为什么能直接写username,而不用user.呢:
	因为在parameterType中已经提供了属性所属的类,所以此时不需要写对象名
	实际开发中,又多个对象来组合成查询条件,以此来封装(pojo 实体类 == javabean)

第三天:mybatis的深入和多表 1、mybatis中的连接池以及事务控制 原理部分了解,应用部分会用 mybatis中连接池使用及分析 mybatis事务控制的分析 2、mybatis基于XML配置的动态SQL语句使用 会用即可 mappers配置文件中的几个标签: 3、mybatis中的多表操作 掌握应用 一对多 一对一(?) 多对多


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

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

4、mybatis中的多表查询 表之间的关系有几种: 一对多 多对一 一对一 多对多 举例: 用户和订单就是一对多 订单和用户就是多对一 一个用户可以下多个订单 多个订单属于同一个用户

	人和身份证号就是一对一
		一个人只能有一个身份证号
		一个身份证号只能属于一个人

	老师和学生之间就是多对多
		一个学生可以被多个老师教过
		一个老师可以交多个学生
特例:
	如果拿出每一个订单,他都只能属于一个用户。
	所以Mybatis就把多对一看成了一对一。

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

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

第四天:mybatis的缓存和注解开发 1、Mybatis中的延迟加载 问题:在一对多中,当我们有一个用户,它有100个账户。 在查询用户的时候,要不要把关联的账户查出来? 在查询账户的时候,要不要把关联的用户查出来?

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

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

在对应的四种表关系中:一对多,多对一,一对一,多对多  
	一对多,多对多:通常情况下我们都是采用延迟加载。  
	多对一,一对一:通常情况下我们都是采用立即加载。    
<resultMap id="accountUserMap" type="account">
    <id property="id" column="id"></id>
    <result property="uid" column="uid"></result>
    <result property="money" column="money"></result>
    <!-- 一对一的关系映射:配置封装user的内容
    select属性指定的内容:查询用户的唯一标识:
    column属性指定的内容:用户根据id查询时,所需要的参数的值
    -->
    <association property="user" column="uid" javaType="user" select="com.itheima.dao.IUserDao.findById"></association>
</resultMap>  
<settings>
    <!--开启Mybatis支持延迟加载-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"></setting>
</settings>

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

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

3、Mybatis中的注解开发 (在使用注解开发的时候,不能在同一个dao下在使用xml配置) 环境搭建 单表CRUD操作(代理Dao方式) 多表查询操作 缓存的配置(一级缓存不用配置,自己就有) /**

  • 在mybatis中针对,CRUD一共有四个注解
  • @Select @Insert @Update @Delete */