前言:在开发Java项目的时候,后端经常会用到mybatis,那么mybatis是什么,它又能为我们的项目带来什么呢?下面是博主总结的一些mybatis的基础知识,希望对大家有帮助。
(一)mybatis简介
【相关知识】
1. 什么是框架
它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。
好处:框架封装了很多细节,使开发者可以使用极简的方式实现功能,大大提高开发效率。
2. 三层架构
表现层:用于展示数据
业务层:处理业务需求
持久层:和数据库交互
3. 持久层技术解决方案
表现层JDBC技术:Connection PreparedStatement ResultSet
Spring的JdbcTemplate:
Spring中对jdbc的简单封装
Apache的DBUtils:
它和Spring和Jdbc Template很像,也是对Jdbc的简单封装
以上都不是框架JDBC是框架 :Spring的JdbcTemplate和Apache的DBUtils都只工具类
【mybatis介绍】
1. mybatis概述
mybatis是一个持久层框架,用Java编写。
它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建等繁杂过程,它使用了ORM(ORE:Object Relational Mappging 对象关系映射)思想实现了对结果集的封装。
简答的说:就是把数据库表和实体类以及实体类的属性对应起来,让我们可以操作和实现类就实现操作数据库表
三层架构:
持久层总图:
2. maybaits环境搭建步骤
第一步:创建maven工程并导入坐标
第二步:创建实体类和DAO的接口
第三步:创建Mybatis的主配置文件SqlMapConfig.xml
第四步:创建映射配置文件IuserDao.xml
[环境搭建注意事项]
第一个:创建IuserDao.xml和IuserDao.java时名称是为了和我们之前的知识保持一致。在Mybatis中它把持久层的操作接口名称和映射文件也叫做Mapper,所以:IuserDao和IuserMapper是一样的
第二个:在idea中创建目录的时候,它和包是不一样的
包在创建的:com.dynamic.dao它是三级结构
目录在创建时:com.dynamic.dao它是一级目录
第三个:mybatis的映射配置文件必须和dao接口的包结构相同
第四个:映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
第五个:映射配置文件的操作配制(select),id属性的取值必须是dao接口的方法名
【当我们遵从了三、四、五点之后,我们在开发中无需再写dao的实现类】
mybatis的分析:
(2)mybatis基于注解的分析
把IusreDao.xml移除,在dao接口的方法上使用@Select注解,并制定SQL语句
同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名。
[明确]:
我们在实际开发中,都是越简单越好,所以都采用不写dao实现类的方式,不管使用XML还是注解配置;但是Mybatis它是支持写dao实现类的。
(3)自定义Mybatis的分析
Mybatis在使用代理dao的方式实现增删改时做什么事呢?
第一:创建代理对象
第二:在代理对象中调用selectList
(二)相关配置
1.mybatis的自定义分析和环境搭建+基于注解的xml
2.DAO
(1)使用DAO的实现类
CUD的操作其实都是最后执行一下,只是传入的语句和语句的参数不一样
因此我们用一个方法就够了
在实际开发中,只需要使用update就可以实现操作,当然其他方法也可以用。
分析编写dao实现类Mybatis的执行过程:
(2)使用代理DAO
为什么mybatis能让我们不写DAO呢?
其实它就是在想办法给我们调用,当初我们在写DAO时调用的方法。
因此我们就不用写DAO了
分析代理dao的执行过程:
3.配置properties
可以在标签内配置连接数据库的信息。也可以通过属性引用外部配置文件信息
Resource属性:常用的
用于指定配置文件的位置,是按照类路径的写法来写,并且必须存在于路径下。
url属性:是要求按照url的写法来写地址
URL: Uniform Resource Locator 统一资源定位符。它是唯一标识一个资源的位置。
它的写法:
http://localhost:8080/mybatisserver/demo1Servlet
协议 主机 端口 URI
URI:Uniform Resource Identifier 统一资源标识符。它是在应用中可以唯一定位一个资源的
Windows中的file协议
4.开发中节省代码的两个标签
(1)typeAliases
使用typeAliases配置别名
它只能配置domain中类的别名
typeAlias用于配制别名,type属性指定的是实体类全限定类名
alias属性指定别名,指定了别名会区分大小写。
<typeAliases>
<typeAlias type="com.dynamic.domain.User" alias="user"></typeAlias>
</typeAliases>
(2)Package
Package用于指定配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写
<package name="com.dynamic.domain"></package>
(三)连接池、事务和多表查询
1.连接池
我们在实际开发中都会用到连接池
因为它可以减少我们获取连接所消耗的时间
2.mybatis中的连接池
Mybatis连接池提供了3种方法的配置:
(1)配置的位置:
主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何种连接池方式。
(2)Type属性取值:
POOLED采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现
UNPOOLED采用传统的获取连接方式,虽然也实现了javax.sql.DataSource接口,但是没有使用池的思想。
JNDI 采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器拿到的DataSource是不一样的。
注意:如果不是web或者maven的war工程,是不能使用的。
Tomcat服务器,连接池就是dbcp连接池。
mybatis_pooled的过程:
4. mybatis中的事务
【相关知识】
(1)什么是事务
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。
事务的结束有两种,当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所以操作。
(2)事务的四大特征ACID
原子性 ( Atomicity )
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
一致性 ( Consistency )
事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。
如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,
这些未完成事务对数据库所做的修改有一部分已写入物理数据库,
这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
隔离性 ( Isolation )
一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,
并发执行的各个事务之间不能互相干扰。
持续性 ( Durability )
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。
接下来的其它操作或故障不应该对其执行结果有任何影响。
(3)不考虑隔会产生的3个问题:
丢失更新、不可重复度、读脏数据
(4)解决办法
四种隔离级别
它是通过sqlsession对象的commit方法和rollback方法实现事务的提交和回滚
5.mybatis多表查询
表之间的关系:一对多 一对一 多对多 多对一
Mybatis中的多表查询
从表实体应该包含主表实体的对象引用
一对多关系映射,主表实体应包含从表实体的集合引用
【示例】
用户和账户(一对多)
一个用户可以有多个账户
一个账户只属于一个用户(多个账户也可以属于同一个用户)
步骤:
1.建立两张表:用户表、账户表
让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中添加
2.建立两个实体类:用户实体类和账户实体类
让用户和账户的实体能体现出一对多的关系
3.建立两个配置文件
用户的配置文件、账户的配置文件
4.实现配置:
查询用户时,可以同时得到用户下所包含的账户信息
查询账户时,可以同时得到账户所属的用户信息
实例:多对多
【JNDI】
JDNI:Java Naming and Directory Interface 是SUN公司推出的一套规范,属于JavaEE技术之一。目的是模仿Windows系统中的注册表。在服务器中注册数据源
Windows注册和tomcat对比
(四)加载和缓存
1. Mybatis中的延迟加载
(1)什么是延迟加载
在真正使用数据时才发起查询,不用的时候不查询。按需加载(懒加载)
mybatis中的延迟加载:
(2)什么是立即加载
不管用不用,只要一 调用方法,马上发起查询
(3)在对应的四种表关系中:一对多,多对一,一对一,多对多
一对多,多对多:通常情况下,我们都采用延迟加载
多对一,一对一: 通常情况下,我们都采用立即加载
2. mybatis中的缓存
(1)什么是缓存
存在内容中的临时数据
(2)为什么使用缓存
减少和数据库的交互次数,提高执行效率
(3)什么样的数据能使用缓存,什么样的数据不能使用
适用于缓存:
经常查询并且不经常改变的。
数据的正确与否对最终结果影响不大。
不适用于缓存:
进场改变的数据
数据的正确与否对最终结果影响很大。
例如:商品库存、银行汇率、股票的牌价
3.Mybaits中的一级缓存和二级缓存
一级缓存:
它指的是mybatis中SQLSession对象的缓存
当我们执行查询之后,查询的结果同时存入到sqlsession为我们提供一块区域中。
该区域的结构是一个map。当我们再次查询同样的数据,mybatis会先去sqlsession中查询是否有,有的话直接拿出来用
当Sqlsession对象消失时,mybatis的一级缓存也就消失了。
(1) 一级缓存
一级缓存是sqlsession范围的缓存,当调用sqlsession的修改、删除,commit(),close()等方法时,后就会清空一级缓存。
(2) 二级缓存
它是指mybatis中sqlsessionFactory对象的缓存,由同一个SqlsessionFactory对象创建的Sqlsession共享其缓存。
二级缓存的使用步骤:
第一步:让mybatis框架支持二级缓存(在SqlMapConfig.xml中配置)
第二步:让当前的映射文件支持二级缓存(在IuserDao.xml中配置)
第三步:让当前的操作支持二级缓存(在Select标签中配置)
【补充】
采用注解开发的时候,在同一个文件夹下,不能使用HTML开发
如果用注解,都用注解,如果用html,则都用html
总结:mybatis的内容非常丰富,在应用中也可以更好的提高我们的开发效率。在项目的应用中不断的学习和成长。