Java 阶段三 MyBatis、Springboot及SpringMVC复习总结
SpringBoot
Spring Boot 是一个开源的Java框架,它简化了基于Spring框架的应用程序的创建和开发。Spring Boot旨在提供一个快速、易于使用的方式,以创建独立的、可运行的Spring应用程序,而无需过多的配置和样板代码。以下是Spring Boot的一些关键特点和概念:
-
自动配置(Auto-Configuration):Spring Boot通过自动配置来减少了开发人员的工作。它会根据项目的依赖关系和配置来自动配置应用程序的行为,无需手动配置大量选项。
-
独立运行(Standalone):Spring Boot应用程序可以作为独立的Java应用程序运行,无需外部Web容器。Spring Boot内置了一个嵌入式的Web服务器(例如Tomcat、Jetty或Undertow),这使得部署和运行应用程序变得非常简单。
-
起步依赖(Starter Dependencies):Spring Boot提供了一系列起步依赖,这些依赖包含了常见的库和框架,以便快速启动特定类型的应用程序。你可以根据需要选择合适的起步依赖,而无需手动管理依赖。
-
生产就绪(Production-Ready):Spring Boot提供了一组工具和功能,用于监视、管理和维护应用程序,以确保应用程序在生产环境中具备高可用性、健壮性和性能。
-
外部化配置(Externalized Configuration):Spring Boot允许你将应用程序的配置从代码中分离出来,并使用属性文件、YAML文件、环境变量等方式进行配置。
-
约定优于配置(Convention Over Configuration):Spring Boot遵循了一系列约定,以减少配置工作。如果你按照这些约定进行项目布局和命名,那么很多配置可以自动完成。
-
可扩展性和定制性:虽然Spring Boot提供了许多默认配置,但你仍然可以根据需要进行自定义和扩展。你可以使用自定义配置、拦截器、过滤器等来满足项目特定的需求。
Spring Boot可以用于构建各种类型的应用程序,包括Web应用程序、RESTful服务、批处理应用程序、微服务等。它在Java开发社区中非常受欢迎,因为它提供了快速开发和部署应用程序的便捷方式。
MyBatis
概述
MyBatis(以前称为iBatis)是一个用于Java编程语言的开源持久性框架。它提供了一种简单的方法来管理应用程序中的SQL数据库访问,同时尽量减少了样板代码的编写。以下是关于MyBatis的一些重要概念和特点:
-
SQL映射配置:在MyBatis中,你可以编写SQL映射配置文件,该文件将SQL查询与Java对象之间的映射关系进行了定义。这使得在数据库中检索和存储数据时更加灵活和方便。
-
SQL语句控制:MyBatis允许你完全控制SQL查询,包括编写和管理复杂的SQL查询语句。你可以使用动态SQL元素来构建条件查询,以适应不同的情况。
-
参数绑定:MyBatis支持将Java对象参数与SQL查询进行绑定,无需手动构建SQL查询字符串。这使得参数传递更加方便,并且可以避免SQL注入攻击。
-
结果映射:MyBatis允许你将SQL查询的结果映射到Java对象上。你可以定义映射规则,以便将数据库中的表格数据转化为Java对象,简化了数据的提取和处理。
-
会话管理:MyBatis引入了
SqlSessionFactory
和SqlSession
的概念,用于管理数据库连接和事务。SqlSessionFactory
是线程安全的,可以在应用程序的整个生命周期内共享,而SqlSession
则用于执行SQL操作。 -
批处理:MyBatis支持批处理操作,这对于批量数据的插入、更新和删除非常有用,可以提高性能。
-
缓存机制:MyBatis具有内建的缓存机制,可以在某些情况下提高查询性能。你可以配置和定制缓存,以满足应用程序的需求。
-
插件体系:MyBatis提供了一个插件体系,允许你自定义和扩展其功能。你可以编写自己的插件来处理查询、结果处理或其他方面的逻辑。
MyBatis广泛用于Java应用程序中的持久性层。它的灵活性和性能使其成为一个受欢迎的选择,特别是在需要直接控制SQL查询和数据库访问的场景中。如果你计划使用MyBatis,建议查阅官方文档以获取更多详细信息和示例。
核心思想
将Java对象和数据库操作分离,通过注解和XML映射文件映射到数据库的字段上,并提供相应的API来操作数据库。可以自动将SQL语句转为JDBC代码,并根据指定的返回值类型生成对应的结果提供给开发者使用。
使用流程
-
配置MyBatis环境
在pom.xml中添加相关依赖:MyBatis Framework 和 MySQL Driver -
配置文件中配置数据库的连接信息(application.properties)
spring.datasource.url=jdbc:mysql://localhost:3306/blog?characterEncoding=utf8&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root
-
定义pojo类,和数据表做好映射关系
-
编写Dao层接口,在接口中定义操作数据库的方法,在注解或者XML文件中实现具体的SQL语句。
@Mapper public interface UserMapper{ @Insert("INSERT INTO user VALUES(NULL,#{username})") int insert(User user); }
-
使用
// 1.自动装配 @Autowired private UserMapper userMapper // 2.调用方法 userMpper.insert(...)
MyBatis配置SQL方式
基于注解方式
说明
基于注解方式省去了配置XML文件的编写工作,并且可以很方便的完成一些 简单的 CRUD操作,但是对于一些复杂的SQL语句使用起来会很冗余。
使用流程
-
(maven工程)在pom.xml中添加MyBatis和MySQL相关的依赖
-
在配置文件中(application.properties)配置数据库的连接信息
-
创建实体类,和数据库中的表做好对应关系
-
配置Mapper接口,在接口中添加@Mapper注解,告诉底层为此接口创建实现类,在实现类中定义数据访问的逻辑,执行与数据库的会话
-
在接口中定义方法,在方法上使用注解标注SQL语句的类型,可以使用的注解有:@Insert、@Dlelete、@Update、@Select
如果SQL语句中涉及到多个参数,可以使用@Param注解给每个参数取名。 -
自动装配并在应用程序中使用即可
@Autowired private XxxMapper xxxMapper; xxxMapper.接口中的方法(参数...);
常用注解
@Insert("SQL")
@Delete("SQL")
@Update("SQL")
@Select("SQL")
基于XML方式
XML相比注解的优势
-
更好的可读性
XML文件具有良好的结构和语义,可以使JAVA代码和SQL语句彻底分离,便于管理和优化。注解配置SQL语句可能使JAVA代码变的冗长。 -
更好的复用性
将SQL语句写入XML文件中,通过标签和标签将重复的SQL抽取并引用,从而提高了SQL语句的复用性。 -
更好的支持动态SQL
动态SQL语句是根据运行时的参数来生成的SQL,复杂性较高,使用XML文件更加方便。
使用流程
-
添加依赖:pom.xml
-
配置数据源:application.properties
-
配置xml文件的扫描路径:application.properties
-
创建实体类,做好和数据表的对应关系
-
定义接口,添加
@Mapper
注解,并定义接口中的方法 -
创建xml文件,使用标签配置SQL
<mapper namespace="接口的完整路径"> <insert id="接口中定义的方法名"></insert> </mapper>
-
装配使用
@Autowired private XxxMapper xxxMapper; xxxMapper.接口方法(参数...);
常用标签
-
insert
标签 -
delete
标签 -
update
标签 -
select
标签:使用select标签需要指定resultType的属性值 -
foreach
标签:用于动态删除<delete id="xxx"> DELETE FROM xxx WHERE id IN( <foreache collection="对象类型" item="变量名" separator="分隔符"> #{变量名} </foreache> ) </delete>
-
set
标签和if
标签:用于动态修改<update id="xxx"> UPDATE xxx <set> <if test="属性名!=null">字段名=#{属性名},</if> <if test="属性名!=null">字段名=#{属性名},</if> <if test="属性名!=null">字段名=#{属性名}</if> </set> </update>
-
sql标签和include标签:用于SQL语句的复用
示例:<!--1.重复SQL抽取--> <sql id="selectSql"> SELECT * FROM </sql> <select id="xxx" resultType="xxx"> <include refid="selectSql" />#{id} </select>
SpringMVC
介绍
Spring MVC 是一个用于构建基于Java的Web应用程序的开源框架,它是 Spring Framework 的一部分,专注于实现 Model-View-Controller(MVC)设计模式,用于构建灵活、模块化和可维护的Web应用程序。以下是关于 Spring MVC 的一些重要概念和特点:
-
MVC 设计模式:Spring MVC 遵循经典的MVC设计模式,其中:
- Model:表示应用程序的数据和业务逻辑。比如:查询数据库、验证用户输入、更新数据库等等,可以使用POJO类或者实体类表示
- View:负责呈现数据给用户的部分。
- Controller:接收用户请求,协调 Model 和 View,处理业务逻辑,并决定哪个视图用于呈现响应。
-
前端控制器:Spring MVC 应用程序的入口点是一个前端控制器(Front Controller),它统一管理请求的处理。在 Spring MVC 中,DispatcherServlet 充当了前端控制器的角色。
-
处理器映射器(Handler Mapping):处理器映射器负责将请求映射到适当的处理器(Controller)上,根据请求的URL和其他条件选择合适的 Controller 处理请求。
-
控制器(Controller):Controller 负责处理请求,并根据请求的参数和业务逻辑确定要呈现的视图。通常,Controller 类使用注解或配置来定义请求处理方法。
-
视图解析器(View Resolver):视图解析器将逻辑视图的名称映射到实际的视图模板,以便最终呈现给用户。视图解析器使得视图的切换更加灵活。
-
模型(Model):模型是应用程序的数据和业务逻辑的表示。在 Spring MVC 中,模型可以是 JavaBean、Map 或任何其他可用于存储数据的对象。模型数据传递给视图以渲染页面。
-
视图(View):视图是用于呈现用户界面的部分。Spring MVC 支持多种视图技术,包括 JSP、Thymeleaf、FreeMarker 等。
-
数据绑定:Spring MVC 提供了数据绑定机制,将请求参数自动绑定到控制器方法的参数或模型对象中。这简化了数据的处理。
-
拦截器(Interceptor):拦截器允许你在请求到达控制器之前或之后执行预处理或后处理逻辑,以实现日志记录、权限检查等功能。
-
国际化和本地化:Spring MVC 提供了国际化和本地化支持,使得应用程序可以轻松支持多种语言和区域。
-
异常处理:Spring MVC 允许你定义全局异常处理机制,以处理应用程序中的异常情况,向用户提供友好的错误信息。
职责
常见问题
- 新增或者调整JAVA代码后一定要重启工程
- 新增或者调整static下的html文件后一定要 Rebuild Static
- 浏览器没有效果,可以清除浏览器缓存
客户端发请求方式
浏览器地址栏
用户在浏览器中输入URL地址,即可向服务器发出请求。
超链接和form表单
-
首先写一个index.html文件到static目录下,Rebuild Static
<h1>工程首页</h1> <!-- 绝对路径中第一个 / 代表的是工程根路径 和页面所处位置无关 1.当前位置:http://localhost:8080/index.html 2.请求位置:http://localhost:8080/DeleteOrder --> <a href="/DeleteOrder">删除订单</a> <h3>通过form表单发请求</h3> <form action="/createOrder"> <input type="text" name="orderId" placeholder="订单编号"> <input type="text" name="orderAmount" placeholder="订单金额"> <input type="submit" value="创建订单"> </form>
-
controller.OrderController处理请求
// 处理删除订单请求 @RequestMapping("/deleteOrder") @ResponseBody public String deleteOrder(){ return "删除订单成功"; } // 处理查询订单请求 @RequestMapping("createOrder") @ResponseBody public String selectOrderById(){ return "创建订单成功"; }
-
重启工程后浏览器输入地址测试
http://localhost:8080/index.html
GET请求和POST请求区别
-
GET请求
-
请求参数在请求地址的后面通过 ? 分割,多个查询参数之间使用 & 符号分隔
GET请求的参数在地址后面所以有大小限制(4k左右) -
应用场景
一般从服务器获取数据都使用GET请求
-
-
POST请求
- 请求参数在请求体中,没有参数大小的限制
- 应用场景
- 在服务器中新增数据时使用
- 请求参数中包含敏感信息时使用
- 上传文件使用
客户端传递参数方式
客户端负责发送请求,服务端负责处理请求,客户端在发送请求时可能需要向服务端传递数据,具体传递数据的方式有如下几种方式。
GET请求-查询字符串
-
浏览器地址栏
-
浏览器地址栏:http://localhost:8080/v1/users/login?username=zuokai&password=123456
-
新建 controller.UserController 处理请求
@Controller public class UserController { @RequestMapping("/v1/users/login") @ResponseBody public String login(HttpServletRequest request){ String username = request.getParameter("username"); String password = request.getParameter("password"); return username + ":" + password; } }
-
重启工程浏览器输入地址测试
http://localhost:8080/v1/users/login
-
-
form表单
-
新建getpost.html到static目录下
<h1>前端向后端传递参数的方式:GET请求</h1> <form action="/v1/users/login" method="get"> <input type="text" name="username" placeholder="用户名"> <input type="password" name="password" placeholder="密码"> <input type="submit" value="登录"> </form>
-
重启工程浏览器测试
http://localhost:8080/02getpost.html
-
POST请求-请求体
-
user.html
<h3>前端向后端传递参数: POST请求</h3> <form action="/v1/users/login" method="post"> <input type="text" name="username" placeholder="用户名"> <input type="password" name="password" placeholder="密码"> <input type="submit" value="登录"> </form>
-
重启工程浏览器测试
http://localhost:8080/user.html
服务端接收参数方式
HttpServletRequest接收
以上述案例为准,用户输入用户名和密码,发送请求到服务器端,服务器端接收传递过来的用户名和密码信息。
-
controller.UserController处理请求
/**方式1:使用HttpServletRequest接收数据*/ @RequestMapping("/v1/users/login") @ResponseBody public String login(HttpServletRequest request){ String username = request.getParameter("username"); String password = request.getParameter("password"); return username + ":" + password; }
-
重启工程浏览器测试
http://localhost:8080/02getpost.html
声明参数接收
可以在处理请求的函数中通过声明参数接收传递过来的数据。
-
controller.EmpController处理登录请求
/**方式2:通过声明参数的方式接收*/ @RequestMapping("/v1/users/login") @ResponseBody // 好处:代码简洁,并且可以自动根据声明的类型进行转换 public String login(String username, String password){ return "username = " + username + ", password = " + password; }
-
重启工程浏览器测试
http://localhost:8080/02getpost.html
声明实体类接收
如果客户端传递数据过多,通过以上两种方式接收会很麻烦,可以将数据封装到实体类中。
-
controller.UserController处理登录请求
/**方式3:通过声明Pojo类接收*/ @RequestMapping("/v1/users/login") @ResponseBody public String updateEmp(User user){ return user.toString(); }
-
自定义实体类:工程目录下创建entity.User
public class User { // 客户端传递几个参数,此处就有几个属性 private String username; private String password; // 此处生成setter() getter() 和 toString() 方法 }
-
重启工程浏览器测试
http://localhost:8080/02getpost.html
POJO
定义
Plain Ordinary Java Object
:简单的Java对象,也就是没有继承任何类或实现任何接口的简单 Java 对象,也不依赖于其他复杂的框架或技术,POJO 对象通常包含了纯粹的数据和简单的业务逻辑,是一种用于简化 Java 应用程序开发的编程模型。是entity实体类、VO(Value Object或View Object)视图对象、DTO(Data Transfer Object)数据传输对象 这些对象的总称。
entity实体类作用
在软件开发中,“实体类”(Entity Class)是一种常见的编程概念,它用于表示现实世界中的实际对象或概念,通常映射到数据库表的行(records)或用于表示业务数据的Java对象。实体类的作用是在应用程序中描述和封装特定类型的数据,以便对其进行操作和管理。以下是实体类的主要作用:
-
表示业务对象:实体类用于表示应用程序中的业务对象或概念,例如用户、产品、订单、员工等。每个实体类通常对应到系统中的一个数据表,它们的属性映射到表的列。
-
封装数据:实体类包含属性或字段,用于存储对象的数据。这些属性可以是对象的状态信息,如用户的姓名、年龄、地址等。
-
定义对象行为:除了数据属性,实体类通常还包含方法,用于定义对象的行为和操作。这些方法可以用于验证数据、执行业务逻辑、计算属性值等。
-
支持数据持久性:在应用程序中,实体类通常用于与数据库进行交互。通过使用ORM(对象关系映射)框架(如Hibernate、JPA),实体类可以映射到数据库表,使得数据的读取、写入、更新和删除变得更加方便。
-
支持业务逻辑:实体类可以包含业务逻辑,例如验证数据的有效性、执行复杂的计算、处理特定的业务规则等。
-
数据传输:实体类也可以用于在不同层次之间传输数据,例如在控制器层和服务层之间传递数据。在这种情况下,实体类可能被称为DTO(Data Transfer Object)或VO(Value Object)。
总之,实体类是面向对象编程中的一个关键组成部分,它用于将业务数据抽象为可编程的Java对象,和数据库中的表字段一一对应的,比如:UserEntity(id,username,password,nickname);
DTO作用
DTO,或称为数据传输对象(Data Transfer Object),是一种设计模式,用于在不同层次之间传输数据。DTO的主要作用是将数据从一个层次(通常是业务逻辑层或服务层)传输到另一个层次(通常是表示层,如控制器或视图),以便分离不同层次的关注点和提高数据传输的效率。以下是DTO的主要作用:
-
数据封装:DTO用于封装特定层次的数据,将数据从数据源(如数据库)或服务层抽象为可传输的对象。这有助于隐藏底层数据结构的细节,使上层代码更加简洁和独立。
-
数据传输:DTO用于在不同层次之间传输数据,例如在业务逻辑层和表示层之间,或在微服务之间。通过使用DTO,可以将数据以一种标准化的方式传递,减少了数据传输的复杂性和冗余。
-
减少数据传输量:DTO通常仅包含传输所需的数据字段,而不包含不必要的信息。这有助于减少数据传输的网络流量和数据序列化/反序列化的开销,提高了性能和效率。
-
版本控制:在不同的应用程序版本之间,DTO可以用于处理数据结构的变化。通过创建不同版本的DTO,可以逐渐进行升级和迁移,而不会破坏现有的客户端代码。
-
安全性:DTO可以用于限制客户端访问的数据。通过选择性地包含或排除字段,可以控制客户端可以访问和查看的信息,提高数据安全性。
-
解耦合:DTO有助于解耦不同层次之间的依赖关系。业务逻辑层和表示层可以独立开发和测试,不必依赖于特定的数据结构和数据库模式。
-
可维护性:DTO的使用使代码更具可维护性。通过明确定义数据传输对象的结构,可以更容易地理解和维护代码。
总之,DTO是一种有助于改善应用程序的可维护性、性能和可扩展性的设计模式,用来接收客户端传递给服务器的数据的,比如:UserLoginDTO(username,password);
实现登录功能,客户端向服务器端传递数据。
它的主要目标是简化数据传输,减少不同层次之间的耦合,并提高代码的可读性和可维护性。在现代应用程序开发中,DTO是一个重要的概念,特别是在分布式系统和微服务架构中。
VO作用
VO,或称为值对象(Value Object),是一种在软件开发中用于表示不可变的、具有值语义的对象的设计模式。VO的主要作用是封装一组相关的数据字段,并且通常不允许修改其内部状态,因此它们是不可变的。以下是VO的主要作用:
-
表示不可变数据:VO用于表示一组相关的数据字段,这些字段在创建后不可更改。这确保了对象的状态不会被外部代码修改,有助于维护数据的一致性和完整性。
-
封装数据:VO封装了一组数据字段,提供了一种结构化的方式来组织和管理相关数据。这有助于将数据抽象为更高级别的概念,使代码更易于理解。
-
值语义:VO具有值语义,即两个相等的VO实例(字段值相同)在逻辑上是等价的。这有助于简化比较和判等操作,因为只需要比较字段值而不是对象引用。
-
安全性:由于VO通常是不可变的,它们在多线程环境中更加安全,因为不需要担心并发修改数据导致的问题。
-
可重用性:VO可以在多个上下文中重用,因为它们是独立于特定业务逻辑的数据结构。这有助于减少代码的重复性。
-
领域建模:在领域驱动设计(Domain-Driven Design)中,VO常常用于表示领域内的重要概念和实体的属性。它们有助于更好地反映业务领域的语义。
-
减少错误:由于VO是不可变的,它们可以防止在不适当的地方修改数据,从而减少了代码中的潜在错误。
-
代码清晰度:VO的使用可以提高代码的可读性和清晰度,因为它们将相关的数据组织在一起,使代码更易于理解。
VO通常用于表示领域模型中的值,如日期、货币金额、坐标等,用来处理服务器响应给客户端的数据,以及在不同层次之间传递数据,例如控制器和视图之间。它们的设计强调了数据的不可变性和一致性,从而提高了代码的质量和可维护性。比如:UserListVO(id,username,nickname);
登录成功后的列表页显示当前用户信息。