三个步骤即:初始化——>处理请求——>销毁
创建Servlet对象后———->初始化(调用 init () 方法)———>处理/响应客户端的请求(调用 service() 方法)———>销毁(调用 destroy() 方法,最后由 JVM 的垃圾回收器进行垃圾回收)
调用Servlet对象的init()方法,初始化Servlet的信息,init()方法只会在创建后被调用一次(初始化阶段)
(1)init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,创建于用户第一次调用该 Servlet 的 URL 时,也可以指定 Servlet 在服务器第一次启动时被加载。
(2)当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。
(3)init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。
(4)load-on-startup标签可以设置servlet的加载优先级别和容器是否在启动时加载该servlet,load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)
响应请求
(1)是执行实际任务的主要方法,处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
(2)每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。
(3)Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。
在长时间没有被调用或者是服务器关闭时,会调用destroy()方法来销毁Servlet对象。(终止阶段)
(1)destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。
(2)destroy() 方法可以让Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
(3)在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。
resultType 是一种简单的映射方式,它指定了查询结果的类型。通常情况下,resultType可以是Java的基本类型(如int、String等)或者自定义的Java类。当查询结果只有一个列时,可以使用resultType。
resultMap 是一种更为灵活的映射方式,它允许我们定义复杂的映射规则。通过resultMap,我们可以将查询结果映射为一个自定义的Java对象,而不仅仅是基本类型。
resultType是指定查询结果的数据类型。它可以是Java的基本数据类型、JavaBean或者其他自定义的数据类型。当查询结果只有一个字段时,可以使用resultType来指定结果的数据类型。
resultMap是用于将查询结果映射到Java对象的规则集合。它定义了查询结果与Java对象之间的映射关系。resultMap可以指定多个映射规则,用于处理复杂的查询结果。它可以映射查询结果中的每个字段到Java对象的属性,也可以进行一些特殊的映射操作,如级联映射、关联映射等。
两者的区别为:
对象不同
(1)resultMap:查询出的列名和pojo(java的普通对象)的属性名不一致,通过resultMap和pojo做一个映射关系。
(2)resultType:使用resultType进行输出映射
描述不同:
(1)resultMap:resultMap对于一对一表连接的处理方式通常为在主表的pojo中添加嵌套另一个表的pojo
(2)resultType:resultType无法查询结果映射到pojo对象的pojo属性中,根据对结构集查询遍历的需要选择使用resultType还是resultMap。
3.类型适用不同:
(1)resultMap:mybatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap。
(2)resultType:resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。
在MyBatis中,符号和#符号是用于参数替换的两种不同的占位符语法。它们在使用方式和替换规则上有所不同。
(1) 符号(sql拼接符号)
$符号占位符是简单的字符串替换,不进行预编译和参数类型处理。
$符号占位符直接将参数的值替换到SQL语句中,可以用于动态拼接SQL语句的部分内容。
$符号占位符存在SQL注入的风险,因为参数值直接替换到SQL语句中,可能导致恶意注入攻击。
没有 ‘引号’
(2)#符号(占位符)
#符号占位符是预编译的占位符,会对参数进行类型处理和安全处理。
#符号占位符将参数值作为预编译参数传递给数据库,可以防止SQL注入攻击。
#符号占位符可以用于动态生成SQL语句的条件部分,例如WHERE子句、ORDER BY子句等。
有引号
(1)读取MyBatis的配置文件。
mybatis-config.xml为MyBatis的全局配置文件,用于配置数据库连接、属性、类型别名、类型处理器、插件、环境配置、映射器(mapper.xml)等信息,这个过程中有一个比较重要的部分就是映射文件其实是配在这里的;这个核心配置文件最终会被封装成一个Configuration对象
(2)加载映射文件。
映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
构造会话工厂。通过MyBatis的环境配置信息构建会话工厂SqlSessionFactory。
(3)构造会话工厂获取SqlSessionFactory。
这个过程其实是用建造者设计模式使用SqlSessionFactoryBuilder对象构建的,SqlSessionFactory的最佳作用域是应用作用域。
(4)创建会话对象。
创建会话对象SqlSession。由会话工厂创建SqlSession对象,对象中包含了执行SQL语句的所有方法,每个线程都应该有它自己的 SqlSession 实例。SqlSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
(5)Executor执行器。
是MyBatis的核心,负责SQL语句的生成和查询缓存的维护,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护
(5)Mapper 调用:在 MyBatis 中,我们通过 Mapper 来执行 SQL 语句。Mapper 是 MyBatis 中 SQL 语句和 Java 方法之间的映射关系。我们可以直接调用 Mapper 中的方法来执行 SQL 语句。
两个(5)是一样的,执行入口不同,但是里面的原理都是一样的
(6)MappedStatement对象。
在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。
(7)输入参数映射。输入参数类型可以是基本数据类型,也可以是Map、List、Pojo类型复杂数据类型,这个过程类似于JDBC的预编译处理参数的过程,有两个属性 parameterType 和 parameterMap
(8)输出结果映射(封装结果集)。输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和Pojo类型。输出结果映射过程类似于JDBC对结果集的解析过程。
public class StudentDemo1 {
public static void main(String[] args) {
Student s1 = new Student("zhang",50);
Student s2 = new Student("yang",30);
Student s3 = new Student("wang",40);
List<Student> list = new ArrayList<Student>();
list.add(s1);
list.add(s2);
list.add(s3);
Collections.sort(list, (o1, o2) -> o1.getPrice() - o2.getPrice());
for (Student l:list){
System.out.println("学生名字" + l.getName() + "成绩" + l.getPrice());
}
}
}
class Student {
private String name;
private int price;
public Student() {
}
public Student(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
powered by kaifamiao