Mybatis


categories: MyBatis

MyBatis框架学习笔记

是一款优秀的ORM(Object/Relation Mapping)对象关系映射 半自动轻量级持久层框架。

大量使用设计模式

​ 1 Builder模式 SqlSessionFactoryBuilder

含义 :使用多个简单的对象构建成一个复杂的对象。

1
2
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

2 工厂模式 SqlSessionFactory

​ 含义:根据参数的不同 返回不同类的实例。

1
2
3
SqlSession sqlSession = sqlSessionFactory.openSession();
// 设置自动提交
SqlSession sqlSession = sqlSessionFactory.openSession(boolean autoCommit);

3 代理模式

动态代理模式

一般采用接口的形式定义Mapper 其底层使用的就是Jdk的动态代理技术

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
IUserDao mapper = sqlSession.getMapper(IUserDao.class);

// 会调用 MapperProxy 类中的方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
// 如果是 Object 定义的方法,直接调用
if (Object.class.equals(method.getDeclaringClass())) {
return method.invoke(this, args);

} else if (isDefaultMethod(method)) {
return invokeDefaultMethod(proxy, method, args);
}
} catch (Throwable t) {
throw ExceptionUtil.unwrapThrowable(t);
}
// 获得 MapperMethod 对象
final MapperMethod mapperMethod = cachedMapperMethod(method);
// 重点在这:MapperMethod最终调用了执行的方法
return mapperMethod.execute(sqlSession, args);
}

总体流程
1加载配置文件并初始化
将文件 加载成字节输入流,并将xml文件内容解析到Configuration类中的属性中
2处理操作请求
SqlSession接口的默认实现DefaultSqlSession 中的Executor 执行器,解析参数,然后执行底层的JDBC操作。
3 返回处理结果
执行器 具体执行后 将数据库的查询 结果通过反射对应的具体的类中。

复习整理

  1. 持久层框架是由于传统的JDBC连接数据库的方式存在硬编码、频繁创建和释放数据库连接、需要手动封装结果集等问题而诞生的;

  2. 硬编码采用配置文件来规避,config.xml中定义数据库的配置信息和mapper文件的基本信息,mapper.xml中定义sql的配置信息包括sql语句、参数类型、返回值类型等;

  3. 实现流程:

    总体流程

    image-20210519111317199

    • 加载配置文件;

      第一步:加载配置文件

​ 第二步:创建两个javabean存放加载出来的配置信息;

​ 第三步:解析配置文件并保存对应信息到javabean中

​ 第四步:使用工厂模式生产sqlSession;

​ 第五步:定义对数据库的CURD操作;

​ 第六步:创建Executor实现具体的增删改查动作(使用JDBC);

​ 第七步:使用反射(内省)封装返回结果集。

Java 4种引用关系

Java 4种引用关系

1 强引用

概念 被强引用关联的对象不会被回收。

使用 new 一个新对象的方式创建强引用。

1
Object obj = new Object();

2 弱引用

被弱引用关联的对象一定会被回收,也就是说它只能存活到下一次垃圾回收发生之前。

使用 WeakReference 类来创建弱引用。

1
2
3
Object obj=new Object();
WeakReference<Object> wf=new WeakReference<Object>(obj);
obj=null;

3 虚引用

又称为 幽灵引用 或者幻影引用,一个对象是否有虚引用的存在,不会对其生存时间造成影响,也无法通过虚引用得到一个对象。

为一个对象设置虚引用的唯一目的是能在这个对象被回收时收到一个系统的通知。

使用PhantomReference 来创建虚引用。

1
2
3
Object obj=new Object();
PhantomReference<Object> pf=new PhantomReference<object>(obj,null);
obj=null;

4 软引用

被软引用关联的对象只有在内存不够的情况下才会被回收。

使用SoftReference 类 来创建软引用。

1
2
3
Object obj=new Object();
SoftReference<Object> sf=new SoftReference<Object>(obj);
obj=null // 使对象只能被软引用关联。

177230_23种设计模式详解笔记Part1

零、讲在前面

1.学习基础要求:

(1)对JavaEE尤其面向对象思想有较为深刻的理解和使用经验;

(2)熟练掌握eclipse或idea使用;

(3)对Java有良好的编程习惯。

2.课程说明:

​ 本课程主要讲解设计模式思想,对于开发工具使用、语法、编程习惯、代码细节不做过多讲解。

​ 课程使用环境及工具:jdk1.8 + idea2018.2.4

3.课程介绍

一、设计模式概述

1.设计模式概念:

​ 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。

​ 使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

2.设计模式简介:

​ 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

​ 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。

3.六大设计原则:

为什么要提倡“Design Pattern”呢?根本原因是为了代码复用,增加可维护性。那么怎么才能实现代码复用呢?面向对象有几个原则:单一职责原则 (Single Responsiblity Principle SRP)开闭原则(Open Closed Principle,OCP)、里氏代换原则(Liskov Substitution Principle,LSP)、依赖倒转原则(Dependency Inversion Principle,DIP)、接口隔离原则(Interface Segregation Principle,ISP)、合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)、最小知识原则(Principle of Least Knowledge,PLK,也叫迪米特法则)。开闭原则具有理想主义的色彩,它是面向对象设计的终极目标。其他几条,则可以看做是开闭原则的实现方法。

(1)总原则:开闭原则(Open Close Principle)

​ 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代 码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类等,后面的具体设计中我们会提到这点。 单一职责原则不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分。

(2)里氏替换原则(Liskov Substitution Principle)

​ 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP 是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实 现抽象化的具体步骤的规范。里氏替换原则中,子类对父类的方法尽量不要重写和重载。因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它。

(3)依赖倒转原则(Dependence Inversion Principle)

​ 这个是开闭原则的基础,具体内容:面向接口编程,依赖于抽象而不依赖于具体。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。

(4)接口隔离原则(Interface Segregation Principle)

​ 这个原则的意思是:每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口 拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。

(5)迪米特法则(最少知道原则)(Demeter Principle)

​ 就是说:一个类对自己依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装方法的内部,通过 public 方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。 最少知道原则的另一个表达方式是:只与直接的朋友通信。类之间只要有耦合关系,就叫朋友关系。耦合分为依赖、关联、聚合、组合等。我们称出现为成员变量、方法参数、方法返回值中的类为直接朋友。局部变量、临时变量则不是直接的朋友。我们要求陌生的类不要作为局部 变量出现在类中。

(6)合成复用原则(Composite Reuse Principle)

​ 原则是尽量首先使用合成/聚合的方式,而不是使用继承。

4.设计模式的分类:

总体来说设计模式分为三大类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

其实还有两类:并发型模式和线程池模式,以图的形式表示:

1554254661859

Read More