Mybatis学习笔记

Mybatis学习笔记

什么是框架?

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

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

三层架构

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

持久层技术解决方案

  • JDBC技术:Connection

    ​ PreparedStatement

    ​ ResultSet

  • Spring的JdbcTemplate:Spring中对jdbc的简单封装

  • Apache的DBUtils:它和Spring的JdbcTemplate很像,也是对jdbc的简单封装

以上这些都不是框架,JDBC是规范,Spring的JdbcTemplate和Apache的DBUtils都只是工具类

Mybatis框架概述

​ mybatis 是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
​ mybatis通过xml或注解的方式将要执行的各种statement 配置起来,并通过java对象和statement中 sql的动态参数进行映射生成最终执行的sql语句,最后由 mybatis框架执行sql并将结果映射为java对象并返回。
​ 采用ORM思想解决了实体和数据库映射的问题,对 jdbc进行了封装,屏蔽了jdbc api底层访问细节,使我们不用与 jdbc api打交道,就可以完成对数据库的持久化操作。

ORM:Object Relational Mappging对象关系映射简单的说就是把数据库表和实体类及实体类的属性对应起来让我们可以操作实体类就实现操作数据库表。

Mybatis的入门

Mybatis的环境搭建:第一步:创建maven工程并导入坐标(导入架包)

​ 第二步:创建实体类和dao的接口

​ 第三步:创建Mybatis的主配置文件(SqlMapConfig.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接口的全限定类名。l

自定义Mybatis的分析

执行查询所有的分析

mybatis在使用代理dao的方式实现增删改查时做什么事呢?

  • 第一:创建代理对象

  • 第二:在代理对象中调用selectList



创建代理对象的分析


Mybatis的CRUD操作

基本操作

resultType属性值表示,执行SQL语句后,从数据库获取数据,封装的对象类型。

parameterType属性值表示,执行SQL语句前,需要获取数据的对象类型(当只有一个数据时,#{name}中name的值可以是任意,否则需要根据封装对象的属性名称确定)。

模糊查询的两种实现方法中第一种比较常用,第一种的执行的SQL语句中是采用占位符的方式进行值的获取,而第二种是直接拼接成完整的SQL语句去执行的。

OGNL

OGNL表达式:

Object Graphic Navigation Language

对象 图 导航 语言

​ 它是通过对象的取值方法来获取数据,在写法上把get省略了。

​ 比如:我们获取用户的名称

​ 类中的写法:user.getUsername();

​ OGNL表达式写法:user.username

​ mybatis中为什么能直接写username,而不用user呢?

​ 因为在parameterType中已经提供了属性所属的类,所以此时不需要写对象名。

解决实体类属性和数据库列名不对应的两种方式

  • 起别名的方式

  • 配置查询结果的列名和实体类的属性名对应关系的方式

注意:resultType属性不再需要,改成resultMap属性。

properties标签的使用及细节

可以在标签内部配置连接数据库的信息。也可以通过属性引用外部配置文件信息。

resource属性:用于指定配置文件的位置,是按照类路径的写法来写,并且必须存在于类路径下。

url属性:是要求按照url的写法来写地址

URL:Uniform Resource Locator 统一资源定位符。它是可以唯一标识一个资源的位置。

它的写法:

​ http:// localhost:8080/mybatisserver/demo1Servlet

​ 协议 主机 端口 URI
URI:Uniform Resource Identifier 统一资源标识符。它是在应用中可以唯一定位一个资源的。

typeAliases标签和package标签

使用typeAliases配置别名,它只能配置domain中类的别名。

package标签用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写

注意:mappers标签下的package标签作用与上面的不一样

package标签是用于指定dao接口所在的包,当指定了之后就不需要再写mapper以及resource或者class

连接池

在实际开发中使用连接池,可以减少我们获取连接所消耗的时间。

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连接池。

Mybatis中的事务

什么是事务

事务的四大特征ACID

不考虑隔离性会产生的三个问题

解决办法:四种隔离级别

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

Mybatis中动态SQL语句

if标签

当我们不确定查询条件时(查询条件是一个,多个,或者没有),可以使用if标签的格式进行条件查询



where标签

where标签的使用,使得我们不用再在SQL语句后面写“where 1=1”使语句永远为真

foreach标签

根据queryvo中的id集合实现查询用户列表




sql标签

抽取重复的sql语句

注意:如果引用抽取语句后,代码后面还要其他语句要用“;”隔开,如果没有其他语句不要加“;”


Mybatis中多表查询

表之间的关系有几种:一对多、多对多、一对一、多对多

举例:

​ 用户和订单就是一对多

​ 订单和用户就是多对一

​ 一个用户可以下多个订单

​ 多个订单属于同一个用户

​ 人和身份证号就是一对一

​ 一个人只能有一个身份证号

​ 一个身份证号只能属于一个人

​ 老师和学生之间就是多对多

​ 一个学生可以被多个老师教过

​ 一个老师可以交多个学生

特例:

​ 如果拿出每一个订单,他都只能属于一个用户

​ 属于Mybatis就把多对一看成了一对一

mybatis中的多表查询示例:用户和账户

​ 一个用户可以有多个账户

​ 一个账户只能属于一个用户(多个账户也可以属于同一个用户)

​ 步骤:1、建立两张表:用户表,账户表

​ 让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中添加

​ 2、建立两个实体类:用户实体类和账户实体类

​ 让用户和账户的实体类能体现出来一对多的关系

​ 3、建立两个配置文件

​ 用户的配置文件

​ 账户的配置文件

​ 4、实现配置

​ 当我们查询用户时,可以同时得到用户下所包含的账户信息

​ 当我们查询账户时,可以同时得到账户的所属用户信息

​ 示例:用户和角色

​ 一个用户可以有多个角色

​ 一个角色可以赋予多个用户

​ 步骤:1、建立两张表:用户表,角色表

​ 让用户表和角色表具有多对多的关系:需要使用中间表,中间表中包含各自的主键,在中间表中时外键

​ 2、建立两个实体类:用户实体类和角色实体类

​ 让用户和角色的实体类能体现出来一对多的关系

​ 各自包含对方一个集合引用

​ 3、建立两个配置文件

​ 用户的配置文件

​ 角色的配置文件

​ 4、实现配置

​ 当我们查询用户时,可以同时得到用户下所包含的角色信息

​ 当我们查询角色时,可以同时得到角色的所赋予的用户信息

Mybatis中的延迟和立即加载

问题:在一对多中,当我们有一个用户,它有100个账户

​ 在查询用户的时候,要不要把关联的账户查出来?

​ 在查询账户的时候,要不要把关联的用户查出来?

​ 在查询用户时,用户下的账户信息应该是,什么时候使用,什么时候查询的?

​ 在查询账户时,账户的所属用户信息应该是随着账户查询时一起查询出来?

什么是延迟加载?

​ 在真正使用数据时才发起查询,不用的时候不查询。按需加载(懒加载)

什么是立即加载

​ 不管用不用,只要一调用方法,马上发起查询

在对应的四种表关系中:一对多,多对一,一对一,多对多

​ 一对多,多对多:通常情况下我们都采用延迟加载。

​ 多对一,一对一:通常情况下我们都采用立即加载。

Mybatis中的缓存

什么是缓存:存在于内存中的临时数据

为什么使用缓存:减少和数据库的交互次数,提高执行效率

什么样的数据能用缓存,什么样的数据不能使用

​ 适用于缓存:经常查询并且不经常改变的

​ 数据的正确与否对最终结果影响不大的

​ 不适用于缓存:经常改变的数据

​ 数据的正确与否对最终结果影响很大的

​ 例如:商品的库存,银行的汇率,股市的牌价

Mybatis中的一级缓存

它指的是Mybatis中SqlSession对象的缓存

当我们执行查询之后,查询的结果会同时存入到SqlSession为我们提供一块区域中

该区域的结构是一个Map。当我们再次查询同样的数据,mybatis会失去sqlsession中查询是否有,有的话直接拿来用

当SqlSession对象消失时,mybatis的一级缓存也就消失了

Mybatis中的二级缓存

它指的是Mybatis中SqlSessionFactory对象的缓存,由同一个SqlSessionFactory对象创建的SqlSession共享其缓存

二级缓存的使用步骤:第一步:让Mybatis框架支持二级缓存(在SqlMapConfig.xml中配置)

​ 第二步:让当前的映射文件支持二级缓存(在IUserDao.xml中配置)

​ 第三步:让当前的操作支持二级缓存(在select标签中配置)

Mybatis注解开发

mybatis注解开发时,不能和xml配置一起使用:要么全是注解,要么全是xml配置文件

posted @ 2021-11-02 22:16  BreakRabbit  阅读(141)  评论(0)    收藏  举报