哈喽~大家好呀,这篇来看看Spring 项目起步讲解。
🥇个人主页:个人主页
🥈 系列专栏:【Java EE框架】
🥉与这篇相关的文章:
【JAVAEE框架】Mybatis项目起步讲解 【JAVAEE框架】Mybatis项目起步讲解_程序猿追的博客-CSDN博客 【JAVAEE框架】Mybatis常用操作(CRUD) 【JAVAEE框架】Mybatis常用操作(CRUD)_程序猿追的博客-CSDN博客 【JAVAWEB开发】基于Java+Servlet+Ajax+jsp网上购物系统设计实现 【JAVAWEB开发】基于Java+Servlet+Ajax+jsp网上购物系统设计实现_程序猿追的博客-CSDN博客
目录
一、前言补充
1、ResultMap 映射。
补充上篇 Mybatis 的——ResultMap,在 JavaWeb项目中使用了 ResultMap 没做具体的讲解。
当实体类的成员变量与 DB 字段名对不上时,使用 resultMap 映射。
什么意思?
实体类的成员变量的变量名是A, DB 字段名是A1,连接 DB 时由于名称对不上,页面就不会显示数据,所以,使用 ResultMap 映射,解决此类问题
1、属性说明
- id属性 ,resultMap标签的标识。
- type属性 ,返回值的全限定类名,或类型别名。
- autoMapping属性 ,值范围true(默认值)|false, 设置是否启动自动映射功能,自动映射功能就是自动查找与字段名小写同名的属性名,并调用setter方法。而设置为false后,则需要在
resultMap
内明确注明映射关系才会调用对应的setter方法。
示例
<resultMap id="brandResultMap" type="brand">
<result column="A" property="A1"></result>
</resultMap>
扩:当我们对多表操作的时候,表与表之间可能会出现对不上的情况,这时需要使用 association 与 collection
示例
<!-- mybatis中的标签association主要用于解决“有一个”类型的关系,它表示一个对象至少有一个关联对象。
比如一般情况下,每个人都一个身份证,可能有些人没有(比如黑户和婴儿),人和身份证的关系就可以使用association表示。-->
<!--collection主要是应对表关系是一对多的情况-->
<resultMap id="smbmsUser" type="smbmsUser">
<id property="id" column="id"></id>
<association property="role" column="userrole" resultMap="smbmsRole"></association>
<collection property="addresses" column="id" ofType="smbmsAddress" resultMap="smbmsAddress"></collection>
</resultMap>
2、Mybatis一级缓存二级缓存
2.1、一级缓存
Mybatis 的一级缓存是指 Session 缓存。一级缓存的作用域默认是 SqlSession 。Mybatis默认开启一级缓存。
在同一个SqlSession中,执行相同的查询SQL,第一次会去数据库进行查询,并写到缓存中;第二次以后则直接去一级缓存中取。
当执行的SQL查询中间发生了增删改的操作,mybatis 会把 SqlSession 的缓存清空。
意思是说:执行相同的操作,第一次会把结果写到缓存中,第二次执行时直接从缓存拿数据,Mybatis默认开启一级缓存
一级缓存失效的情况:
1、SqlSession不同;
2、SqlSession相同,查询条件不同。因为缓存条件不同,缓存中还没有数据。
3、SqlSession相同,在两次相同查询条件中间执行过增删改操作。
4、SqlSession相同,手动清空了一级缓存。(如果SqlSession去执行commit操作(执行插入。更新、删除),清空SqlSession中的一级缓存,这样做的目的是为了让缓存中存储的是最新的消息,避免脏读。)
关闭一级缓存
<!-- 设置一级缓存的作用范围是一条sql语句执行期间,执行完毕清空一级缓存-->
<setting name="localCacheScope" value="STATEMENT"/>
2.2、二级缓存
Mybatis的二级缓存是指mapper映射文件。二级缓存的作用域是同一个nameSpace下的mapper映射文件内容,多个SqlSession共享。Mybatis需要手动设置启动二级缓存。
一个会话,查询一条数据,这个数据会被放在当前会话的一级缓存中;如果会话被关闭了,一级缓存汇总的数据会被保存到二级缓存。新的会话查询信息就会参照二级缓存。
二级缓存的使用原则:
1、只能在一个命名空间下使用二级缓存。由于二级缓存中的数据是基于nameSpace的,即不同nameSpace中的数据互不干扰。在多个nameSpace中若均存在对同一个表的操作,那么这多个nameSpace中的数据可能就会出现不一致现象。
2、在单表上使用二级缓存。如果一个表与其他表有关联关系,那么就非常有可能存在多个nameSpace对同一数据的操作。而不同nameSpace中的数据互不干扰,所以就有可能出现多个nameSpace中的数据不一致现象。
3、查询多于修改时使用二级缓存。在查询操作远远多于增删改操作的情况下可以使用二级缓存。因为任何增删改操作都将刷新二级缓存,对二级缓存的频繁刷新将降低系统性能。
开启二级缓存
<!--全局开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
二、Spring 核心概念
1、介绍
Spring理念 : 使现有技术更加实用 . 本身就是一个大杂烩 , 整合现有的框架技术
官网 : http://spring.io/
官方下载地址 : https://repo.spring.io/libs-release-local/org/springframework/spring/
GitHub : https://github.com/spring-projects
pom导入
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
2、优点
2.1、低侵入式设计
2.2、独立于各种应用服务器
2.3、依赖注入特性将组件关系透明化,降低了耦合度
2.4、面向切面编程特性允许将通用任务进行集中式处理
2.5、与第三方框架的良好整合
3、体系结构
组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:
- 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
- Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
- Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能 , 集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理任何支持 AOP的对象。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中。
- Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
- Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
- Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
- Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
Spring设计理念
Spring是面向Bean的编程
Spring 两大核心技术
控制反转(IoC:Inversion of Control ) /依赖注入(DI:Dependency Injection )
面向切面编程(AOP:Aspect Oriented Programming)
三、快速使用
1、applicationcontext.xml 作用
我们学Spring的主要目的还是因为Spring能充当我们容器管理的作用,这个作用主要体现在:
控制反转: Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
面向切面的编程(AOP): Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
容器: Spring 包含并管理应用中对象的生命周期和配置。
MVC框架: Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
事务管理: Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
异常处理: Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。
这里不详细讲解Spring框架,但作用大概就这几个,当然还有管理各类ORM框架等,不在这里讨论。
由于applicationContext.xml文件 Spring的配置文件,所以applicationContext.xml的作用当然就是用来配置Spring框架所需的信息了。
2、详细讲解
2.1、beans
applicationContext.xml文件的根元素,所有的内容都需要包含在beans的标签中。
2.2、xmlns
这是xml namespace即xml命名空间的简称,主要用于引入一些.xsd文件(也就是说xmlns后面的连接就是连接到相应的.xsd文件网站的,.xsd文件里面有特定的配置,比如xmlns:aop="http://www.springframework.org/schema/aop"就是加载aop切面的),xmlns冒号后面的是这个.xsd的前缀,如果后续使用的时候,直接就<aop: 如aop:config即可。这是xml namespace即xml命名空间的简称,主要用于引入一些.xsd文件(也就是说xmlns后面的连接就是连接到相应的.xsd文件网站的,.xsd文件里面有特定的配置,比如xmlns:aop="http://www.springframework.org/schema/aop"就是加载aop切面的),xmlns冒号后面的是这个.xsd的前缀,如果后续使用的时候,直接就<aop: 如aop:config即可。
2.3、xsi:schemaLocation
其中xsi是xmlns:xsi中的xsi,schemaLocation是http://www.w3.org/2001/XMLSchema-instance中的一个属性(了解即可,不需要深入),这个xsi:schemaLocation的作用就是帮你定位到对应的.xsd文件的。
2.4、bean标签
id属性:用于指定Bean的名称,在Bean被依赖时使用,在获取Bean时使用等
name属性:用于指定Bean的别名
class属性:用于指定Bean的来源,即创建要创建的Bean的class类(需要全限定名)
singleton属性:用于指定当前Bean的创建模式,若值为true表示为单例模式,false表示原型模式(prototype)
depends-on属性:用于指定当前Bean的依赖Bean,强制指定的Bean在当前Bean初始化之前先完成初始化
init-method属性:用于指定当前Bean的初始化方法,在Bean实例创建好后,首先会调用其指定名称的方法
destory-method属性:用于指定当前Bean的销毁方法,在Bean即将被销毁之前会自动调用该属性指定的方法
lazy-init属性:用于指定当前Bean的初始化时间,若值为true表示在初次调用时才会自动创建实例并初始化,false表示在IoC容器创建的时候就会完成创建和初始化
autowire属性:用于指定当前Bean的依赖关系的自动注入方式,其有五个值:
byName值:表示通过id名称来自动匹配;
byType值:表示通过class指定的类型来自动装配;
constructor值:表示使用构造函数的参数进行自动装配(参数的类型匹配);
autodetect值:表示自动进行选择匹配方式,首先进行constructor自动装配,若不存在构造方法则使用byType方式进行自动装配;
no值:表示不适用自动装配。
dependency-check属性:用于指定Bean的依赖检查模式,检查依赖关系是否完整,与自动装配合用,其有四个值:
simple值:表示针对基本类型、字符串、集合进行依赖检查
object值:表示对引用对象进行依赖检查
all值:表示对基本类型、字符串、集合、引用对象全部进行依赖检查
none值:表示不进行任何依赖检查,默认情况。
2.5、property标签
name属性:用于指定属性的名称,与类中的set方法后方的名称一致
value属性:用于指定该属性的值,用于指定的值是基本类型、字符串类型
ref属性:用于指定该属性的值,用于指定的值是引用对象类型(即其他的Bean),ref后面的值为另一个Bean的id
value标签:用于指定属性的值,类型为基本类型、字符串类型,值为标签内的文本内容,可以使用null值将属性的值设置为null
3、代码示例
建个基础的 Maven 项目结构,在pom写入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.22</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.22</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.22</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.3.22</version>
</dependency>
新建实体类,user与adderss
User
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private int age;
private Address address;
}
adderss
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Address {
private String province;
private String city;
private String county;
}
applicationcontext.xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<bean id="Address" class="com.itxzw.model.Address">
<property name="province" value="江西"/>
<property name="city" value="南昌"/>
<property name="county" value="青山湖"/>
</bean>
<bean id="User" class="com.itxzw.model.User">
<property name="name" value="xzw"/>
<property name="age" value="20" />
<property name="address" ref="Address"/>
</bean>
</beans>
编text类
@Test
public void text01(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Object user = context.getBean("User");
System.out.println(user);
}
效果
4、示例讲解
bean 其实就是个容器,你要使用spring,我就在容器里面拿出来,你有我就拿,没有就是默认的初始值。
bean 的 id 就是你这个容器的名字了,唯一且首字母小写,class就是你实体类的引用路径,property——> name 为 实体类里面的成员变量赋值(换句话讲,我先把值放到容器里面,你要用我就拿出来),这是基本数据类型的使用,如果我是引用数据类型呢?
像user里面有address类的引用,这要如何赋值呢?
我们容器申明id为address,然后在user里面使用ref引用进来
<property name="address" ref="address"/>
property作用:Bean定义可以具有零个或多个属性。属性元素对应于bean类公开的JavaBean setter方法。 Spring支持原语,对相同或相关工厂中的其他bean的引用,列表,映射和属性。
总结图
不积跬步无以至千里,趁年轻,使劲拼,给未来的自己一个交代!向着明天更好的自己前进吧!