欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

回顾MyBatis

程序员文章站 2024-01-09 17:20:05
MyBatis文章目录MyBatisXML配置方式环境搭建注意事项:简单例子(xml)注解方式案例设计模式分析自定义mybatis分析OGNL表达式连接池JNDI延迟加载一级缓存、二级缓存持久层解决方案,封装了JDBC很多细节,使开发者只需关注业务本身,无需关注连接创建,ORM思想,搭好“舞台”,任我们表演.JDBC三大对象:ConnectionPrepareStatementResultSetJDBC只是一种规范,像Spring的JdbcTemplate或者Apache的DBUtils都...

MyBatis


持久层解决方案,封装了JDBC很多细节,使开发者只需关注业务本身,无需关注连接创建,ORM思想,搭好“舞台”,任我们表演.
JDBC三大对象:

  • Connection
  • PrepareStatement
  • ResultSet

JDBC只是一种规范,像Spring的JdbcTemplate或者Apache的DBUtils都只是简单的封装,只是一种工具类.

XML配置方式

mybatis加载配置文件的4种方式:

  1. 依据Mapper类具体路径配置mapper

    <configuration>  
        <mappers>       
            <!-- class 级别的指定 -->  
            <mapper class="cn.zoujidi.mybatis.dao.IUserDao"/>  
        </mappers>  
    </configuration>  
    
  2. 依据Mapper类所在的Package配置mapper

    <configuration>  
        <mappers>  
            <package name="cn.zoujidi.mybatis.dao"/>  
        </mappers>  
    </configuration>  
    
  3. 把Mapper配置文件与单独放到resource中,和Mapper类分开了

      <!-- 指定映射配置文件位置,映射配置文件是每个dao的独立配置文件 -->
        <mappers>
            <mapper resource="cn/zoujidi/mybatis/dao/IUserDao.xml" />
        </mappers>
    
  4. 直接在spring中配置Mapper的路径,但是mybatis.xml还是必不可少的

环境搭建注意事项:

  1. 创建IUserDao.xml和IUserDao.java时,名称是为了我们之前的知识保持一致.在mybatis中,它把持久层的操作接口和映射文件也叫做:Mapper,所以IUserDao.xml与IUserMapper.xml是一样的

  2. 在idea中创建目录的时候,它和包是不一样的:包在创建时cn.zoujidi.mybatis是三级目录,而目录在创建时cn.zoujidi.mybatis是一级目录

  3. mybatis的映射文件配置位置必须和dao接口的包结构相同(使用上部分加载mapper配置文件的第三种方式)

  4. 映射配置文件namespace属性取值必须是dao接口的全限定类名

  5. 映射配置文件的操作配置(select),id属性的值必须是dao接口的方法名

    当我们遵从3、4、5点之后,我们就无需再写dao的实现类

简单例子(xml)

// 1、读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig");
// 2、创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 3、使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
// 4、使用SqlSession创建Dao接口的代理对象
IUserDao iUserDao = session.getMapper(IUserDao.class);
// 5、使用代理对象执行方法
List<User> users = iUserDao.findAll();
users.forEach(System.out::println);
// 6、释放资源
session.close();
in.close();

步骤描述:

  1. 第一步读取配置文件,获取连接数据库的信息
  2. 有了工厂就可以生成操作对象:session
  3. 我们一般不使用session直接操作数据库,而是使用dao操作数据库
  4. 所以在在第五步中,让session给我们生成代理对象
  5. 代理对象(方法增强)
  6. 通过代理对象操作数据库
  7. 切记映射配置中告知返回映射的实体类,制定全限定类名

注解方式

移除mapper.xml的配置,同时在dao的方法上用@Select标记,并制定sql语句,在config中用class属性指明使用该注解的全限定名

案例设计模式分析

  1. 读配置文件

    常使用:1.使用类加载器读取类路径的配置文件、2.ServletContext.getRealPath()获取当前部署环境的路径

    绝对路径、相对路径均不常使用。

  2. 创建factory工厂,使用了构建者模式

  3. 工厂模式生成SqlSession(解耦:降低类之间的依赖关系)

自定义mybatis分析

mybatis在使用代理dao实现增删改查做了哪些事情?

两件事。

  1. 创建dao的代理对象
  2. 代理对象中SelectList方法

自定义mybatis能通过入门案例看到的类:

​ class Resource

​ class SqlSessionFactoryBuilder

​ interface SqlSessionFactory

​ interface SqlSession

OGNL表达式

object Graphic Navigation Lauguage

对象。 图。 导航。 语言

它是通过对象的取值方法来获取数据,在写法上给省略了.

比如:我们获取用户名称

​ 类中:user.getUserName

​ OGNL表达式写法:user.userName

​ mybatis中为什么直接写userName,而不用user.呢,因为在parameterType中已经提供了属性所属类

连接池

连接池就是存储连接的一个容器,其实就是一个集合对象,并且必须是容器安全的.不能两个线程拿到同一个连接,该集合还必须实现队列的特性:先进先出

减少获取连接的所消耗的时间.

mybatis中的连接池提供了三种方式的配置: 配置的位置->主配置文件SqlMapConfig.xml中的datasource标签,type属性表示采用何种连接池的方式,取值分别是:

​ POOLED:采用传统的javax.sql.DataSource规范中的连接池,有针对规范的实现

​ UNPOOLED:采用传统获取连接的方式,虽然也实现了java.sql.DataSource接口,但是并没有使用池的思想

​ JNDI:采用服务器提供的JNDI技术实现来获取DataSource对象,不同服务器能拿到的DataSource又不一样,注意:如 果不是web或者maven 的war工程是不能使用的.如果使用的tomcat服务器,采用的连接池就是dbcp连接池

JNDI

Java Naming and Direction Interface,是sun公司推出的一套规范,属于javaee技术之一,目的在于模仿windows系统中的注册表。

延迟加载

按需加载,懒加载

一级缓存、二级缓存

减少与数据库的交互此。

什么样的数据适用于缓存:

  1. 经常查询并且不经常修改;
  2. 数据的正确与否对最终结果影响不大。

什么样的数据不适用于缓存:

  1. 经常改变的数据;
  2. 数据的正确与否对最终结果影响很大的(例如商品的库存、汇率、股市的牌价)

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

当SqlSession调用更新、删除、添加、commit()、close()等方法时,会清空一级缓存。

二级缓存:指的是mybatis中SqlSessionFactory对象的缓存,由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。

二级缓存使用步骤:

​ 一、让mybatis框架支持二级缓存(主配置文件配置);

​ 二、在映射文件中支持二级缓存(IUserDao.xml);

​ 三、让当前操作支持二级缓存(select标签中)

二级缓存存放的事数据,而不是对象。

本文地址:https://blog.csdn.net/qq_36443497/article/details/107191607