B038-Spring基础

news2024/12/23 20:26:31

目录

      • mybatis高级查询(动态sql)
      • spring
        • spring简介
        • IOC和AOP介绍
        • 入门案例
          • 导包
          • 核心配置文件
          • 获取对象
        • 迫切加载和懒加载
        • BeanFactory和ApplicationContext区别和联系
        • spring管理bean
        • DI依赖注入
          • xml注入
          • 注解注入(简单介绍 后面用)
        • Spring测试
        • bean的作用域
        • bean的生命周期
        • 多例默认是懒加载

mybatis高级查询(动态sql)

EmpMapper

public interface EmpMapper {

	List<Emp> findAll();
	
	/**
	 * 根据条件查询
	 */
	List<Emp> findByQuery(Emp emp);
}

EmpMapper.xml

<mapper namespace="cn.itsource.mapper.EmpMapper">

	<!-- List<Emp> findAll() -->
	<select id="findAll" resultType="Emp">
		select * from emp
	</select>
	
	<!-- List<Emp> findByQuery(Emp emp) -->
	<select id="findByQuery" resultType="Emp">
		select * from emp
		<!-- where: 中间加条件 :自动识别是否需要and
			 if: 判断使用 
		-->
		<where>
			<if test="deptno != null">
				and deptno = #{deptno}
			</if>
			<!-- ognl表达式   判断ename不是null,并且不是空字符串
				trim():去除两端空白
				concat():拼接参数
			-->
			<if test="ename != null and ''!=ename.trim()" >
				and ename like concat('%',trim(#{ename}),'%')		
			</if>			
			<if test="address != null and ''!=address.trim()" >
				and address like concat('%',trim(#{address}),'%')		
			</if>
			<if test="sal != null">
				<choose>
					<when test="sal==3000">
						<!-- 查询的就是3000以下的薪水的员工信息 -->
						and sal &lt; 3000
					</when>
					<when test="sal==5000">
						<!-- 查询的就是3000到5000薪水的员工信息 -->
						and sal &gt;= 3000 and sal &lt; 5000
					</when>
					<when test="sal==8000">
						<!-- 查询的就是5000到8000的薪水的员工信息 -->
						and sal &gt;= 5000 and sal &lt; 8000
					</when>
					<when test="sal==8001">
						<!-- 查询的就是8000以上的薪水的员工信息 -->
						and sal &gt;= 8000
					</when>
				</choose>	
			</if>
		</where>
	</select>
	
</mapper>

EmpTest

	@Test
	public void testName() throws Exception {
		SqlSession session = MybatisUtils.getSqlSession();
		EmpMapper mapper = session.getMapper(EmpMapper.class);
//		List<Emp> list = mapper.findAll();
		
		Emp emp = new Emp(null, " 张 ", null, 8001.0, null);
		List<Emp> list = mapper.findByQuery(emp);
		list.forEach(System.out::println);
	}

spring

spring简介

为什么要使用Spring?

1.使代码实现松耦合【低耦合】 -> 减低维护难度
2.在单例和多例之间进行切换非常简单
3.管理事务非常简单
4.提供更加简单的测试

spring
是一个轻量级的开源的IOC和AOP容器框架
不属于哪一层,三层都在用
没有spring,java就可能已经被淘汰

IOC和AOP介绍

spring:是一个轻量级的开源的IOC和AOP容器框架

轻量级:相对于EJB【使用和框架设计都很复杂】来说
IOC:Inverse of control - 控制反转,让spring来创建和管理对象
AOP:面向切面编程,(后面再讲)
容器框架:用来管理对象。创建对象、保存对象、初始化和销毁

入门案例
导包

在这里插入图片描述
新建Java project,根目录新建lib文件夹,导包:core、context、beans、expression、logging

核心配置文件

tips:
schme约束的好处,代码提示,错误提醒;
引入本地约束文件后没有网约束也能生效

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.xsd">
	
</beans>
获取对象

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.xsd">
	
	<bean id="user" class="cn.ming.domain.User"></bean>
	
</beans>

SpringTest

	@Test
	public void testName() throws Exception {
		// 获取spring容器
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		// 获取交给容器管理的类
		Object bean1 = ac.getBean("user");
		User bean2 = (User)ac.getBean("user");
		User bean3 = ac.getBean("user", User.class);
		User bean4 = ac.getBean(User.class);
		System.out.println(bean1+" - "+bean2+" - "+bean3+" - "+bean4);
		//cn.ming.domain.User@3701eaf6 - 
		//cn.ming.domain.User@3701eaf6 - 
		//cn.ming.domain.User@3701eaf6 - 
		//cn.ming.domain.User@3701eaf6
	}
迫切加载和懒加载

迫切加载:在创建容器的时候就创建了对象,如执行代码

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

延迟加载:在获取对象的时候才创建对象,如执行代码

User bean = ac.getBean("user", User.class);

如何将迫切加载转成延迟加载
(1).单个bean配置延迟加载,加lazy-init=“true”

<bean id="user" class="cn.ming.domain.User" lazy-init="true" ></bean>

(2).所有bean配置延迟加载,加default-lazy-init=“true”

<?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.xsd" default-lazy-init="true" >
	
	<bean id="user" class="cn.ming.domain.User" ></bean>
	
</beans>

测试代码见工程

BeanFactory和ApplicationContext区别和联系

联系:ApplicationContext接口继承自BeanFactory,拥有更多的功能
区别:ApplicationContext默认迫切加载,BeanFactory默认懒加载

测试代码见工程

spring管理bean

可以管理自定义的类,也可以管理jdk自带的类,如Date,ArrayList,但不能管理接口,如List

一般我们用spring管理外部bean,api自带的类在项目中自己new

DI依赖注入

含义:IoC是一种思想,它的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的;

Spring中对象的属性字段赋值,这称为依赖注入DI(Dependency Injection)

xml注入

必须有对应的setter方法,所有这种注入方式又称之为属性注入或setter方法注入

applicationContext.xml

	<bean id="dog111" class="cn.ming.domain.Dog">
		<property name="name" value="二哈"></property>		
	</bean>
	
	<bean id="person" class="cn.ming.domain.Person">
		<!--setter方法注入 
			name: 属性名称 - set方法后面的属性
			value: 赋值 - 只能赋值普通字段,不能赋值对象
			ref: 引用外部bean
		-->
		<property name="id" value="123"></property>
		<property name="name" value="王天霸"></property>
		<property name="age" value="20"></property>
		<property name="dog" ref="dog111"></property>
	</bean>

SpringTest

		// 获取容器
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		// 从容器中获取bean   person
		Person p1 = (Person) ac.getBean("person",Person.class);
		System.out.println(p1);		//Person [id=123, name=王天霸, age=20, dog=Dog [name=二哈]]
注解注入(简单介绍 后面用)

将注解写在setter方法上,也可以写在字段上,如果写在字段上可以不需要setter方法;

加上注解后会去配置文件找对应的bean进行注入

@Autowired:为Spring提供的注解,
默认按照类型匹配,也可以指定bean名称

 	@Autowired
	private Dog dog;

 	@Autowired
 	@Qualifier("dog111")
	private Dog dog;

@Resource:由J2EE提供,需要导入包javax.annotation.Resource,spring支持这个注解,
默认按照名字匹配,类型也必须一致

	@Resource
	private Dog dog;

	@Resource(name="dog111")
	private Dog dog;
Spring测试

背景:原始的测试方法代码量多,测试效率低 - 要重复的创建容器对象

案例:
1.导包
spring-aop-4.1.2.RELEASE.jar,spring-aop-4.1.2.RELEASE.jar

2.代码
Student

public class Student {

	public void eat() {
		System.out.println("吃饭中。。。");
	}
}

applicationContext.xml

<bean id="student" class="cn.ming.domain.Student" > </bean>

SpringTest2

@ContextConfiguration("classpath:applicationContext.xml") // 加载核心配置文件  创建容器
@RunWith(SpringJUnit4ClassRunner.class)// 我使用的是spring的测试类
public class SpringTest2 {
	
//	@Autowired
	@Resource
	private Student student;
	
	@Test
	public void testName() throws Exception {
		student.eat();
	}

}
bean的作用域

spring管理的bean,默认是单例的
测试:

	@Autowired
	private Student student1;
	
	@Resource
	private Student student2;
	
	@Test
	public void test1(){
		// spring管理的bean,默认是单例的
		System.out.println(student1==student2);		//true
	}

bean配置加上scope="prototype"可改为多例

<bean id="student" class="cn.ming.domain.Student" scope="prototype"> </bean>
	@Autowired
	private Student student1;
	
	@Resource
	private Student student2;
	
	@Test
	public void test1(){
		// spring管理的bean,默认是单例的
		System.out.println(student1==student2);		//false
	}
bean的生命周期

Spring中Bean的生命周期:Spring中管理的对象从创建到销毁的一个过程

1.实例化和初始化:Spring容器帮我们调用了无参构造【创建对象】和指定的初始化方法【一般做初始化工作】,如果是迫切加载就是创建容器的时候实例化和初始化,如果是懒加载就是获取对象的时候实例化和初始化

2.使用:服务方法在被调用的时候执行

3.销毁:容器关闭的时候调用销毁方法,但是仅仅是的调用了这个方法,并没有销毁这个对象,可以在销毁方法中做一些销毁和清理工作【释放资源,关流,关闭连接】,后期jvm的垃圾回收器真实销毁对象

代码:

LifeBean

public class LifeBean {

	public void init(){
		System.out.println("初始化了。。。。");
	}
	
	public void service(){
		System.out.println("服务方法。。。");
	}
	
	public void destroy(){
		System.out.println("销毁方法。。。。");
	}
}

applicationContext.xml

<!-- init-method="init":指定初始化方法 ; destroy-method="destroy":指定销毁方法-->
<bean id="lifeBean" class="cn.ming.domain.LifeBean" init-method="init" destroy-method="destroy"></bean>

SpringTest2

	@Autowired
	private LifeBean lifeBean; 
	
	@Test
	public void test2(){
		lifeBean.service();
	}	//初始化了。。。。	服务方法。。。	销毁方法。。。。
多例默认是懒加载

因为它不知道创建多少个对象,只能懒加载

测试见工程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1322607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity3d C#利用Editor编辑器拓展实现配置UI背景样式一键设置UI背景样式功能(含源码)

前言 在开发UI滚动列表的时候&#xff0c;经常会有每项的背景图不统一的情况&#xff0c;会间隔重复的情况居多。这种情况下&#xff0c;手动去设置间隔一行的背景图或者颜色是比较麻烦的。在此背景下&#xff0c;笔者尝试写个小工具&#xff0c;在搭建UI时配置一下循环背景的…

如何打造自己的知识付费小程序平台

在当今知识付费的浪潮中&#xff0c;我们经常可以看到各种知识付费平台如雨后春笋般涌现。然而&#xff0c;这些平台往往只是一个过客&#xff0c;让我们短暂停留后&#xff0c;便淹没在信息的海洋中。如果你有一个出色的课程&#xff0c;为什么不让它在一个属于你自己的平台上…

人工智能与自动驾驶:智能出行时代的未来之路

一、前言 首先&#xff0c;我们先来说下什么是人工智能&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门研究如何使计算机系统能够模拟、仿真人类智能的技术和科学领域。它涉及构建智能代理&#xff0c;使其能够感知环境、理解和…

Linux多版本cuda切换

目标 将cuda版本从10.0切换为11.1 步骤 查看当前cuda版本&#xff1a; nvcc -V编辑.bashrc文件&#xff1a; vim ~/.bashrc在文件中添加以下几行&#xff08;若已存在则忽略&#xff09;&#xff1a; export PATH$PATH:/usr/local/cuda/bin export LD_LIBRARY_PATH$LD_LI…

Android解决报错 superclass access check failed: class

Android解决报错 superclass access check failed: class 前言&#xff1a; 最近在打开之前的项目demo时&#xff0c;出现一个错误Cause: superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner 1.错误信息如下&#xff1a; Executio…

【Ehcache技术专题】「入门到精通」带你一起从零基础进行分析和开发Ehcache框架的实战指南(3-储存方式)

这里写目录标题 Ehcache的存储方式堆内存&#xff08;MemoryStore&#xff09;指定可用内存Xml代码Xml代码Xml代码 驱除策略元素过期Xml代码 非堆内存&#xff08;BigMemory&#xff09;磁盘&#xff08;DiskStore&#xff09;指定可用容量Xml代码 元素过期 Ehcache的存储方式 …

外卖系统海外版:技术智能引领全球美食新潮流

随着全球数字化浪潮的推动&#xff0c;外卖系统海外版不仅是食客们品味美食的便捷通道&#xff0c;更是技术智能在美食领域的引领者。本文将深入剖析其背后的技术实现&#xff0c;揭开代码带来的美食革新。 多语言支持&#xff1a;构建全球美食沟通桥梁 def multilingual_su…

【UE5.1】M4自动地形材质+UltraDynamicSky+Oceanology插件的使用记录

目录 效果 步骤 一、项目准备 二、插件使用记录 准备过程 M4自动地形插件使用过程 超动态天空插件使用过程 运行时修改天空效果 运行时修改天气效果 海洋插件使用过程 在海洋中游泳 效果 步骤 一、项目准备 1. 创建一个第三人称游戏工程 2. 将M4文件夹和Ultr…

【Java】网络编程-UDP字典服务器客户端简单代码编写

上文讲了UDP回响服务器客户端简单代码编写 本文将讲述UDP字典服务器客户端简单代码编写。所谓回显&#xff0c;就是指客户端向服务器发送一个报文&#xff0c;从服务器那里得到一条一模一样的回响报文 而我们的字典功能呢&#xff0c;则是实现了输入中文&#xff0c;得到对应…

Spring事务浅析

一:Spring事务简介 什么是事务&#xff1a; 数据库事务是指作为单个逻辑工作单元执行的一系列操作&#xff0c;这些操作要么一起成功&#xff0c;要么一起失败&#xff0c;是一个不可分割的工作单元。 在我们日常工作中&#xff0c;涉及到事务的场景非常多&#xff0c;一个…

MyBatis持久层框架

四、MyBatis持久层框架 目录 一、Mybatis简介 1. 简介2. 持久层框架对比3. 快速入门&#xff08;基于Mybatis3方式&#xff09; 二、日志框架扩展 1. 用日志打印替代sout2. Java日志体系演变3. 最佳拍档用法4. Lombok插件的使用 4.1 Lombok简介4.2 Lombok安装4.3 Lombok使用注…

Kioptrix-1

信息收集 # nmap -sn 192.168.1.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2023-12-18 20:02 CST Nmap scan report for 192.168.1.1 (192.168.1.1) Host is up (0.00025s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap scan report for 0bc…

卷积神经网络的学习与实现

基于matlab的卷积神经网络(CNN)讲解及代码_matlab中如何查看cnn损失函数-CSDN博客 可以看到与BP神经网络相比&#xff0c;卷积神经网络更加的复杂&#xff0c;这里将会以cnn作为学习案例。 1.经典反向传播算法公式详细推导 这里引用经典反向传播算法公式详细推导_反向目标公…

javaSE学习-4-类和对象

1. 面向对象的初步认知 1.1 什么是面向对象 面向对象编程&#xff08;OOP&#xff09;是一种程序设计范式&#xff0c;它将程序中的数据和操作数据的方法封装到对象中。在面向对象的世界里&#xff0c;一切都被视为对象&#xff0c;这些对象可以拥有数据&#xff08;成员变量&…

Unity 通过代码将一张大图切成多个小图的方法

在Unity 中要通过代码将一张贴图切割成多张小图&#xff0c;可以使用以下方法&#xff1a; /// <summary>/// 把一张图片切割成多张使用/// </summary>/// <param name"texture">原图</param>/// <param name"rows">切割的行…

Matlab智能优化算法学习笔记(一)——粒子群算法、模拟退火算法、遗传算法、蚁群算法

文章目录 粒子群算法△ matlab工具箱粒子群函数○ 代码○○ 手搓代码实现粒子群优化 2个变量&#xff08;xy&#xff09;的粒子群优化尝试 定义函数 绘制网格图&#xff08;用来可视化过程&#xff09; 参数初始化&#xff0c;绘制粒子初始位置 开始迭代过程并绘图 获取结果并绘…

计算机毕业设计—基于Koa+vue的高校宿舍管理系统宿舍可视化系统

项目介绍 项目背景 随着科技的发展&#xff0c;智能化管理越来越重要。大学生在宿舍的时间超过了1/3&#xff0c;因此良好的宿舍管理对学生的生活和学习极为关键。学生宿舍管理系统能够合理安排新生分配宿舍&#xff0c;不浪费公共资源&#xff0c;减轻学校管理压力&#xff…

[C++] 多态(下) -- 多态原理 -- 动静态绑定

文章目录 1、多态原理2、动态绑定和静态绑定3、单继承和多继承关系的虚函数表3.1 单继承中的虚函数表5.2 多继承中的虚函数表 上一篇文章我们了解了虚函数表&#xff0c;虚函数表指针&#xff0c;本篇文章我们来了解多态的底层原理&#xff0c;更好的理解多态的机制。 [C] 多态…

JavaSE学习笔记 Day20

JavaSE学习笔记 Day20 个人整理非商业用途&#xff0c;欢迎探讨与指正&#xff01;&#xff01; 上一篇 文章目录 JavaSE学习笔记 Day20十七、数据结构与算法17.1算法17.1.1冒泡排序17.1.2选择排序17.1.3插入排序17.1.4三个排序的区别 17.2顺序表17.2.1顺序表代码实现17.2.2顺…

Python+pip下载与安装

Hi, I’m Shendi Pythonpip下载与安装 最近有识别图片中物体的需求&#xff0c;于是选用了TensorFlow&#xff0c;在一番考虑下&#xff0c;还是选择直接使用Python。 Python下载安装 直接在搜索引擎搜索Python或通过 https://www.python.org 进入官网 在 Downloads 处点击 Al…