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

mybatis是一个持久层框架,用java编写的
orm—-对象关系映射
简单来说,就是把数据库表和实体类及实体类的属性对应起来
让我们可以操作实体类实现操作数据库表

环境搭建的注意事项:
创建UserDao.xml 和 UserDao.java时名称为了和我们之前的知识保持一致。
在Mybatis中它把持久层的操作接口和名称和映射文件也叫做:Mapper
所以,UserDao 和 UserMapper 是一样的

在idea中创建目录师和包不一样,包会自动分层,但是目录不一样,只是一级结构。

Mybatis的映射配置文件位置必须和Dao的接口位置相同

映射配置文件的Mapper标签nemaSpace取值必须师dao接口的全限定类名

映射文件的操作配置,id属性的取值必须师dao接口的方法名对应

  1. InputStream input = Thread.currentThread().getContextClassLoader()
  2. .getResourceAsStream("configuration.xml");
  3. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  4. SqlSessionFactory factory = builder.build(input);
  5. SqlSession session = factory.openSession(true);
  6. ICarDao dao = session.getMapper(ICarDao.class);
  7. List<Car> cars = dao.findAll();
  8. for (Car car : cars) {
  9. System.out.println(car);
  10. }

读取配置文件:
1.类加载器,但是它只能读取类路径的配置文件。
2.使用ServletContext对象的getRealPath()

创建工厂: mybatis使用了创建者模式
创建者模式的优势: 把对象的创建细节隐藏,使使用者直接调用方法便可拿到对象。

生产SqlSession使用了工厂模式
工厂模式的优势: 解耦(降低了类之间的依赖关系)

创建dao接口类实现了代理模式
代理模式的优势:不修改源码的基础上对已有方法增强。

URL:统一资源定位符,它是在应用中可以唯一定位一个资源的
URI: 统一资源标识符,它是在应用中可以唯一定位一个资源的

typeAliases标签: 使用别名,只能配置domain中的别名

  1. <typeAliases>
  2. <typeAlias type="com.zzh.domain.Car" alias="car"/>
  3. </typeAliases>

package标签:

mybatis中的连接池+事务控制
**
mybatis提供了三种方式的配置
配置的位置:
主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何种连接池方式
type属性的取值:
POOLED:采用的是传统的javax.sql.DataSource规范中的链接池,mybatis中有针对规范的实现
UNPOOLED: 采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想。
JNDI: 采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到的DataSource是不一样的,同时如果不是web或者maven的war工程,是不能使用的。
实际开发中一般都是tomcat服务器,采用的连接池就是dbcp连接池


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

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

mybatis的缓存
什么是缓存
存在于内存中的临时数据
为什么使用缓存
减少和数据库的交互次数,提高效率
什么样的数据可以使用缓存,什么样的数据不可以用缓存
适用于缓存
经常查询并且不经常改变的
数据的正确与否对最终结果影响不大的
不适用于缓存
经常改变的数据
数据的正确与否对最终结果影响很大的
例如: 商品的库存、银行的汇率、股市的牌价

mybatis的一级缓存,二级缓存—-默认支持一级缓存

一级缓存
它指的是Mbatis中SqlSession对象的缓存
当我们执行查询后,查询的结果会同时存入到SqlSession为我们提供的一块区域中。
该区域结构是一个Map,当我们再次查询同样的数据,mybatis会去SqlSession中查询是否有,有的话直接拿出来使用
当SqlSession对象消失时,mybatis的一级缓存就消失了。

当调用SqlSession的修改、删除、添加、commit()、close() 等方法时,就会清空一级缓存,避免脏读

二级缓存
它指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。
二级缓存相比一级缓存的范围更大(按namespace来划分),多个sqlsession可以共享一个二级缓存
image.png

二级缓存局限性:

二级缓存存的不是对象
mybatis二级缓存对细粒度的数据级别的缓存实现不好,比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息,因为mybaits的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。解决此类问题需要在业务层根据需求对数据有针对性缓存。

注解开启二级缓存: **@CacheNamespace(blocking = true)