Mybatis框架介绍与基本使用笔记

注意:一般的一个Maven工程首先注入的依赖包含数据库驱动依赖,日志依赖,测试依赖

domain中的实体类实现serizlizable接口序列化的原因:

最重要的两个原因是:

  1、将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;

  2、按值将对象从一个应用程序域发送至另一个应用程序域。

  实现serializable接口的作用是就是可以把对象存到字节流,然后可以恢复。所以你想如果你的对象没实现序列化怎么才能进行网络传输呢,要网络传输就得转为字节流,所以在分布式应用中,你就得实现序列化,如果你不需要分布式应用,那就没那个必要实现序列.

namespace:名称空间;写接口的全类名;相当于告诉Mybatis这个配置文件是实现哪个接口的;

由于在学习框架时,经常会遇到反射,故此篇文章用于对反射的基本学习。

一、概述

基本定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

对其简单的理解就是将类的各个组成部分封装为其他对象,以便我们能够更加细化的使用。同时,我们也都知道,Java中程序是运行在虚拟机中,我们平常用文本编辑器或者是IDE编写的程序都是.java格式的文件,这是最基础的源码,但这类文件是不能直接运行的,必须经过编译成.class字节码文件进而加载进内存供JVM虚拟机执行。要想理解反射,就先需要谈起Java代码在计算机中经历的三个阶段,见下图。

java代码经历的三个阶段

一、概念

FilterJava Web的三大组件之一。Java Web三大组件分别是ServletFilterListener

Filter的作用一般用于完成通用的操作。例如:登录验证、统一编码处理、敏感字符过滤…在实际开发中,过滤器就是对Web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理,通常都是用来拦截request进行处理,或者对返回的response进行拦截处理。其处理流程见下图:

Filter执行原理

拦截request可以简单理解为,在客户端向后端发送请求时,我们需要对其请求加一些”修饰”,将”修饰”后的请求带到后端。其中这个”修饰”是需要在这个请求的过程中完成的,这里因为是通用操作,可能是对所有的request进行”修饰”,所以并没有在客户端进行编写,否则当再加入一个request请求时,我们又要编写对应的规则,因此我们借用过滤器在请求过程中,对我们需要改写的request进行”修饰”。

其中,这里的”修饰”就可以理解为在原有的request请求中,再加入一些”修改”。例如:在Servlet中过多字符集编码发生变化需要修改时,你是选择对每个Servlet都进行修改,还是会选择一个通用的”规则”,来自动判断帮我们进行修改呢?而这里通用的”规则”就是Filter,我们可以把这些通用的字符集编码配置等工作放在Filter中,由Filter在请求过程中或返回过程中帮我们来实现。

在之前的总结Java初试MVC及三层架构中,查看其目录结构仅仅对于User对象的操作就写了6,7个servlet,而每一个servlet只对应一个功能,但随着以后项目的扩大,业务逻辑的复杂化,我们需要操作的对象不仅仅是一个User类时,换句话说,我们操作数据库中的表不止一张时,那么可想而知我们的servlet需要写多少!

未优化前的目录结构

思考:我们能否像service层和dao层一样,将关于User的操作都写在一个类当中,方便我们的使用呢。从而减少Servlet的数量,现在是一个功能一个Servlet,将其优化为一个模块一个Servlet,相当于在数据库中一张表对应一个Servlet,在Servlet中提供不同的方法,完成用户的请求。

我们编写的所有servlet都继承了HttpServlet,与此同时都复写了doGet以及doPost方法。查看HttpServlet源码,可以看见对doGet以及doPost的方法的调用都写在service中。

一、简单介绍

redis是一款高性能的NOSQL系列的非关系型数据库。主要用于缓存,可提升数据访问的性能。这里用于做缓存的数据是不经常做改变的数据。核心思想见下图:

redis

使用缓存机制,可以加快我们数据的访问。因为数据是暂存在内存中,直接访问内存的数据可以减少在访问数据库过程中的I/O操作,这样便可以提升系统的性能,查询速度。但是作为缓存也有一定的缺点:数据因为是暂存在内存上的,一旦redis服务端关闭,再次开启时,缓存数据将不复存在。因此在某些场合中,我们需要对redis缓存数据做持久化操作,将其持久化到硬盘上,当再次查询时,可将数据读取到缓存中。

从以上我们看出redis使用时的两点注意事项:

  1. 数据不会经常改变。如果,数据持续改变,就不断的访问数据库,再将数据放入到缓存中。
  2. 确定持久化操作的条件。不能随时随地的进行持久化(反而增加了IO操作),也不能对缓存中大量改变的数据不做持久化数据(会导致数据大量的丢失)。

最近又捡起了对Java的学习,通过对一个实例的介绍,总结下此次对Web开发中MVC三层架构的学习,以便用于日后的复习。

一、 MVC

简单的先介绍下MVC模式:

  • M(Model):JavaBean。用于完成具体的业务操作。

    JavaBeanJava中特殊的类.

    JavaBean满足条件:

    • public修饰的类,并提供public无参构造方法
    • 所有的属性都是private修饰
    • 提供gettersetter方法

    使用层面:

    • 封装业务逻辑:dao层封装对数据库的底层操作
    • 封装数据:domain层。对数据库中所要查询对象的封装
  • V(View):视图。用于数据的展示。

    • 页面的展示
    • 与用户的交互
  • C(Controller):控制器。由Servlet实现控制器。

    主要功能:

    • 获取用户的输入
    • 调用模型,将请求交给模型进行处理
    • 将数据交给视图进行展示

在上一篇介绍JDBC基础使用的博文中,简单了解到JDBC的使用。但是,也看出了一定的弊端:重复代码量较大。在我们每次新建一个JDBC的类操作数据库时,都要不停的进行驱动的注册,数据库的连接,参数的输入等大量重复性的操作。所以,有没有什么方法简化这一类的操作呢?
其实,将这些重复的代码进行抽取,作为一个工具类,每次使用的时候进行调用即可,这样便能够达到代码的可复用性。
抽取JDBC工具类的思路:

  1. 将注册驱动进行抽取
  2. 抽取一个方法获取连接对象
    • 需求:不必传递参数,并且保证工具类的通用性。
    • 解决:配置文件。

JDBC:Java DataBase Connectivity,即为Java数据库连接。

JDBC是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。即:定义的一套操作所有关系型数据库的规则,是为接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接(JDBC)编程,真正执行的代码是驱动jar包中的实现类。