美文网首页
Mybatis:超市采购员

Mybatis:超市采购员

作者: 柠檬小猪 | 来源:发表于2021-12-16 22:38 被阅读0次

    关键字:ORM(对象/关系数据库映射),反射,内省,注解/配置文件,缓存,插件/自定义,延迟加载

    虽然不是spring家的,但是ssm框架用到了,也算是个编外人员把。

    持久层框架对JDBC进行封装

    原始的JDBC就像自己去超市购物

    1.找去超市的车

    Class.forName("com.mysql.jdbc.Driver");

    2.进入超市

    connection =DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "root");

    3.看着妈妈的购物清单拿要买的东西

    String sql = "select * from user where username = ?";

    preparedStatement = connection.prepareStatement(sql);

    4.结账  

    resultSet = preparedStatement.executeQuery();

    5.分类放进冰箱

    int id = resultSet.getInt("id"); String username = resultSet.getString("username");

    user.setId(id);  user.setUsername(username);

    6.躺回沙发上

    preparedStatement.close();  connection.close();

    原始jdbc开发存在的问题如下:

    频繁从沙发上起来躺下腰吃不消(连接/释放频繁),

    写死的购物清单(Sql语句在代码中硬编码,占位符固定,造成代码不易维护),

    回家后还要把菜分类储存(如果能将数据 库记录封装成pojo对象解析⽐较⽅便)

    而Mybatis就像一个采购员

    可以帮你解决这些问题

    1.这个采购员有一辆车,可以开到任何想去的超市(核心配置文件,修改配置文件就可以连接不同的数据库)

    2.这个采购员有个对讲机,方便的修改购物清单(sql语句写在xml中)

    3.这个采购员会将货物分类放在冰箱(反射,内省;出入参数都可以是POJO);

    额外.可以添加插件或自定义插件,比如分页。

    采购专车(核心配置文件)

    只需要给出目标,就可以去到不同超市。

    将连接参数全部转移到核心配置文件中,不需要再费力的修改java代码。

    先以数据流的方式读取配置文件,再解析

    基于 Java XPath 解析器


    自动进货的储物箱(ORM映射,Mapper代理)

    家里有个土豆储物箱,采购员就会往里面加土豆,不需要过多的交流。

    操作实体类等同于操作表

    怎么样通过操作储物箱就可以拿到货。

    简单的说:

    建立mapper.xml和Dao之间的连接:核心配置文件->mapper包->mapper.xml->namespace->Dao;

    实体类映射数据库:Dao->方法->实体类(反射)->paramterType(入参)->mapper.xml->resultType(出参)->实体类(反射)。

    项目启动时,通过ORM映射将mapper.xml中的sql语句和mapper中的接口方法关联起来,有点像spring的IOC容器,这里叫javaBean容器,Mybatis会创建一个javaBean(说白了就是实体类带上set,get和其他常用方法)来保存解析后的mapper.xml中的sql方法(语句和其他属性)

    是Map类型的,结构是<namespace.id,javaBean>

    在解析mappers标签的时候

    找到核心配置文件的mappers标签,然后获取里面package标签中的name属性,指向的是mapper.xml的位置(和Dao层文件结构上一样的)。

    然后进入mapper.xml,通过namespace属性和Dao层建立联系

    出参和入参通过配置文件的属性反射User类,这样就可以使用pojo来操作数据库并且返回封装好的pojo对象

    反射方法Class.forName(“全限定类名”)

    到这里就找到了namespace和id还有javaBean,可以添加进javaBean容器了。

    简单的说反射是拿类的方法,内省是拿类的属性。

    Mapper代理

    Mapper代理中增删改方法处理都是类似的,他们都是更新操作

    最终都是到这个方法

    查询就不一样了,会根据方法返回值类型做不同处理,其实也就是包装成那种类型的返回值。

    发现一个小秘密,selectOne就是查全部返回第一条

    储物箱便利贴(注解开发)

    再买一次(缓存)

    想补货的时候又懒得在翻一遍商品页面,这时候就可以再次下单。

    SqlSession(mapper代理里用到的)是一级缓存

    查询条件会编码后和查询结果一起保存在一个HashMap中,如果条件相同会直接从缓存里取。有更新数据库的操作(修改,删除,添加)就会清空缓存。

    默认是开启的

    ⼆级缓存是基于mapper⽂件的namespace的

    也就是多个SqlSession在操作同一个mapper时会共用一个缓存,任意一个SqlSession有更新操作也会清空这个缓存。

    默认是关闭的。

    ⼆级缓存底层还是HashMap结构。

    二级缓存一般集群的时候用redis,有很好的兼容性

    导入jar包

    需要使用的mapper.xml里配置

    随时加单(延迟加载)

    一车装不下的东西可以要用到时候再去买

    要用到的时候再加载,而不是一启动就添加进缓存里。

    局部延迟加载

    resultMap标签下的collection 标签里的fetchType="lazy"

    <collection property="orderList" ofType="com.xxx.pojo.Order" select="com.xxx.mapper.IOrderMapper.findOrderByUid" column="id" fetchType="lazy">

    全局延迟加载

    在Mybatis的核⼼配置⽂件中可以使⽤setting标签修改全局的加载策略

    相关文章

      网友评论

          本文标题:Mybatis:超市采购员

          本文链接:https://www.haomeiwen.com/subject/vcxmfrtx.html