当前位置: 首页 > news >正文

【SSM框架 二】Spring

文章目录

  • 二、Spring
    • 1、简介
    • 2、IOC理论思想
    • 3、Hello Spring
    • 4、IOC创建对象的方式
      • 4.1 无参构造构造器注入
      • 4.2 有参构造器注入
    • 5、Spring的配置
      • 5.1 别名
      • 5.2 Bean的配置
      • 5.3 import
    • 6、DI依赖注入
      • 6.1 构造方法注入
      • 6.2 set方法注入
      • 6.3 扩展注入
      • 6.4、Bean的作用域
    • 7、Bean的自动装配
      • 7.1 正常装配
      • 7.2 自动装配
      • 7.3 使用注解自动装配
        • 7.3.1 要使用注解的准备
        • 7.3.2 注解解释
    • 8、使用注解开发
    • 9、使用java的方式配置spring
    • 10、代理模式
      • 10.1 静态代理
      • 10.2 动态代理
    • 11、AOP实现方式
      • 11.1 什么是AOP
      • 11.2 Aop在Spring中的作用
      • 11.3 使用Spring实现AOP
        • 11.3.1 使用前需要导入依赖包
        • 11.3.2 方式一:使用原生的spring api接口
        • 11.3.3 方式二:自定义类
        • 11.3.4 方式三:使用注解实现
    • 12、整合Mybatis
      • 12.1 回忆mybatis
      • 12.2 mybatis-spring
      • 12.3 获得SqlSession的方式二
    • 13、声明式事务
      • 13.1 spring中的事务管理

二、Spring

1、简介

Spring是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架

  • 2002年,首次推出Spring框架的雏形,interface21框架

  • 2004年3月24日,Spring框架以interface21为基础,经过重新设计发布了1.0正式版

  • 开源的免费框架

  • 轻量级非入侵式框架

  • 支持对事务的处理,对框架整合的支持

  • 官方网站:https://spring.io/

  • 5.2.23官方文档:https://docs.spring.io/spring-framework/docs/current/reference/html/

  • api文档:https://docs.spring.io/spring-framework/docs/current/javadoc-api/

  • 老版本文档:https://docs.spring.io/spring-framework/docs/5.0.10.RELEASE/spring-framework-reference/(更改地址中间的版本号访问响应版本)

  • 老版本jar包下载地址:https://repo.spring.io/ui/native/release/org/springframework/spring

  • github下载地址:https://github.com/spring-projects/spring-framework

  • maven仓库

    • <!-- 使用该库可以帮你下载其他spring的库(包含aop,beans,context,core,expression,web) -->
      <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
      <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.23</version>
      </dependency>
      
    • <!-- 和Mybatis整合时,需要的库 -->
      <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
      <dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.23</version>
      </dependency>			
      

2、IOC理论思想

IOC全称是Inversion of Control,控制反转

它是一种设计思想,由容器将设计好的对象交给容器控制,而非对象内部直接new

传统的Java设计中,直接会在对象的内部通过new进行对象的创建,是程序主动创建以来对象;

对Ioc来说,有一个专门的容器专门管理这些对象的生命周期,控制对象的创建;所以在Ioc中,是通过Ioc容器控制对象,由Ioc容器控制外部资源的获取

3、Hello Spring

bean.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- id为bean对象的名字,可以随便取,和getbean()的参数保持一致-->
<!-- class为该bean对象的类型全限名--><bean id="hello1" class="com.daban.pojo.Hello">
<!--     该对象里的属性赋值,实体类里必须有set方法,才可以-->
<!--        name为属性名-->
<!--        value为属性值(基本类型使用)-->
<!--        ref为引用另一个对象的bean的id(非基本类型使用)--><property name="str" value="我是注入的字符串"/><property name="t" ref="tid"/></bean><bean id="tid" class="com.daban.pojo.T"><property name="i" value="1"/></bean>
</beans>

测试类

import com.daban.pojo.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Mytest {public static void main(String[] args) {// 获取spring的上下文对象// 参数可以有多个xml文件ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");// 由上下文对象得到bean对象// 第一个参数为对象的名字(对应xml的bean标签中的id值)// 第二个参数为该bean对象的类型,避免了强制类型转换Hello hello = applicationContext.getBean("hello1", Hello.class);System.out.println(hello.toString());}
}

4、IOC创建对象的方式

4.1 无参构造构造器注入

​ 默认使用无参构造器

4.2 有参构造器注入

三种方式,只能使用其中之一

  • 变量索引+值的方式

    • <constructor-arg index="0" value="野山鸡">
      
  • 类型+值的方式,如果两个String就不太好分辨,不推荐

    • <constructor-arg type="java.lang.String" value="野山鸡"/>
      
  • 变量名+值的方式

    • <constructor-arg name="name" value="野山鸡"/>
      

总结:在配置文件被加载的时候,容器中管理的对象就已经被初始化了

5、Spring的配置

5.1 别名

给bean的id取一个别名。设置别名后,使用别名和原先的名字都可以

<alias name="user" alias="user2"/>

5.2 Bean的配置

属性作用备注
idbean的唯一标识,类似与对象名
classbean所对应的类全限名
name取别名,可以取多个,和alisa标签类似

5.3 import

一般用于团队开发使用,把其他多个配置文件合并到一个配置文件中,加载配置文件时,只加载一个就行

<import resource="bean2.xml"/>

6、DI依赖注入

6.1 构造方法注入

详看《IOC创建对象的方式》

6.2 set方法注入

<?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="student" class="com.daban.pojo.Student"><!--基本类型--><property name="name" value="青山"/><!--类类型--><property name="address" ref="address"/><!--数组类型--><property name="book"><array><value>西游记</value><value>三国演义</value><value>红楼梦</value><value>水浒传</value></array></property><!--列表类型--><property name="hobbys"><list><value>唱歌</value><value>弹吉他</value><value>骑行</value></list></property><!--map类型--><property name="card"><map><entry key="身份证" value="12345512351512553"/><entry key="银行卡" value="662522512525221"/></map></property><!--set类型--><property name="games"><set><value>吃鸡</value><value>LOL</value></set></property><!--properties类型--><property name="info"><props><prop key="username">张三</prop><prop key="password">112233</prop></props></property><!--null类型--><property name="wife"><null/></property></bean><bean id="address" class="com.daban.pojo.Address"><property name="address" value="陕西西安"/></bean>
</beans>

6.3 扩展注入

  • p命名空间注入(和set方法注入作用一样)

    • 需要加入p的命名空间
      xmlns:p=“http://www.springframework.org/schema/p”

    • <bean id="user" class="com.daban.pojo.User" p:age="12" p:name="雪山"/>
      
  • c命名空间注入(和构造器方法注入作用一样)

    • 需要加入c的命名空间
      xmlns:c=“http://www.springframework.org/schema/c”

    • <bean id="user" class="com.daban.pojo.User" c:age="12" c:name="青山"/>
      <bean id="user" class="com.daban.pojo.User"  c:_0="青山" c:_1="13" />
      

6.4、Bean的作用域

bean标签的属性中设置scope

作用域描述备注
singleton单例模式每次从容器中get,就会的到同一个对象
prototype原型模式每次从容器中get,就会的到一个新对象
request再一次请求中
session再一次会话中
application在一个应用中

7、Bean的自动装配

Spring中装配的三种方式

  • 在xml中显式的配置
  • 在java中显式的配置
  • 隐式的自动装配

7.1 正常装配

<bean id="person" class="com.daban.pojo.Person"><property name="name" value="川崎"/><property name="cat" ref="cat"/><property name="dog" ref="dog"/>
</bean>
<bean id="cat" class="com.daban.pojo.Cat"/>
<bean id="dog" class="com.daban.pojo.Dog"/>

7.2 自动装配

<!--    使用autowire属性来自动装配byName:查找该对象set方法后的值对应的beanid(保证id唯一)byType:查找该对象和自己属性类型相同的bean(有多个同类型,将无法装配,对应属性bean的id可以省略)
--><bean id="person" class="com.daban.pojo.Person" autowire="byName"><property name="name" value="川崎"/></bean><bean id="cat" class="com.daban.pojo.Cat"/><bean id="dog" class="com.daban.pojo.Dog"/>

7.3 使用注解自动装配

7.3.1 要使用注解的准备

  • 导入需要的约束context

    • xm<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd">
      
  • 配置注解支持,加入如下,开能开启注解

    • <context:annotation-config/>
      

7.3.2 注解解释

注解解释备注
@Autowired直接使用在需要装配的属性上使用后可以省去set方法
@Qualifier(value = “xxx”)匹配id为value值的bean自动装配环境复杂bean不唯一时使用
@Resourcejava的自动装配先用名字查询,查不到使用类型
@Nullable该字段可以为null

8、使用注解开发

使用注解必须保证aop包的导入

必须导入约束context

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--    驱动支持,相当于开关--><context:annotation-config/>
<!--    指定要扫描的包,这个包下的注解会生效--><context:component-scan base-package="com.daban.pojo"/>
注解描述备注
@Component放在类上,说明被spring管理,将该类放在容器中就是bean
@Value(“XXX”)属性注入,属性上复杂的属性建议使用配置文件
@Repository和@Component一样,只是在dao层使用这个
@Service和@Component一样,只是在Service层使用这个
@Controller和@Component一样,只是在Controller层使用这个
@Scope(“xxx”)bean的作用域

9、使用java的方式配置spring

实体类

package com.daban.pojo;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
//@Component注册一个组件,在这里可以省略
@Component
public class User {@Value("hhhhh")private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +'}';}
}

配置类

package com.daban.config;import com.daban.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;//@Configuration代表这是一个配置类,可省略
//@Bean相当于注册一个bean,id就是方法名,class就是方法返回值
@Configuration
public class MyConfig {@Beanpublic User getUser(){return new User();}
}

测试类

import com.daban.config.MyConfig;
import com.daban.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class MyTest {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);User user = context.getBean("getUser", User.class);System.out.println(user.toString());}
}

10、代理模式

SpringAOP的底层就使用代理模式

10.1 静态代理

角色分析:

  • 抽象角色:一般会使用接口或抽象类来实现
  • 真是角色:被代理的对象
  • 代理角色:去代理正式角色,代理的过程中,会做一些附属操作
  • 客户:访问代理对象的人

静态代理模式的优点:

  • 可以是真是角色操作更加纯粹,不用关心一些公共业务
  • 公共业务交给代理角色,实现了业务的分工
  • 公共业务发生扩展时,方便集中管理

静态代理模式的缺点:

  • 一个真实角色就要产生一个代理角色,代码量会翻倍,开发效率变低(使用动态代理解决)

代码步骤:

1、接口

package com.daban.demo01;public interface Rent {public void rent();
}

2、真实角色

package com.daban.demo01;public class Host implements Rent {private int NO;public Host() {}public Host(int NO) {this.NO = NO;}@Overridepublic void rent() {System.out.println(NO+"号房东要出租房子");}
}

3、代理角色

package com.daban.demo01;public class Proxy implements Rent{private Host host;public Proxy() {}public Proxy(Host host) {this.host = host;}@Overridepublic void rent() {seeHouse();fare();host.rent();}public void seeHouse(){System.out.println("中介带你看房");}public void fare(){System.out.println("收取中介费");}
}

4、客户端访问代理角色

package com.daban.demo01;public class Client {public static void main(String[] args) {Proxy proxy = new Proxy(new Host(2));proxy.rent();}
}

10.2 动态代理

  • 动态代理和静态代理角色一样
  • 动态代理类是动态生成的,不是我们创建的
  • 动态代理分为两大类:
    • 基于接口的动态代理:JDK动态代理【这里使用这个】
    • 基于类的动态代理:cglib

基本示例:

接口:

package com.daban.demo02;public interface Rent {public void rent();
}

实现类:

package com.daban.demo02;public class Host implements Rent  {private int NO;public Host() {}public Host(int NO) {this.NO = NO;}@Overridepublic void rent() {System.out.println(NO+"号房东要出租房子");}
}

动态生成类:

package com.daban.demo02;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;//使用这个类自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {//被代理的接口private Rent rent;public void setRent(Rent rent) {this.rent = rent;}//生成得到的代理类public Object getProxy(){return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(),this);}//处理代理实例,并返回结果@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {seeHouse();Object result = method.invoke(rent, args);fare();return result;}public void seeHouse(){System.out.println("中介带你看房");}public void fare(){System.out.println("收取中介费");}
}

测试类:

package com.daban.demo02;public class Client {public static void main(String[] args) {//真实角色Host host = new Host(3);//用这个来生成代理类ProxyInvocationHandler handler = new ProxyInvocationHandler();handler.setRent(host);//生成代理类Rent proxy =(Rent)handler.getProxy();proxy.rent();}
}

通用示例:

接口:

package com.daban.demo03;public interface UserService {void add();void delete();void update();void select();
}

实现类

package com.daban.demo03;public class UserServiceImp implements UserService{@Overridepublic void add() {System.out.println("增加用户");}@Overridepublic void delete() {System.out.println("删除用户");}@Overridepublic void update() {System.out.println("修改用户");}@Overridepublic void select() {System.out.println("查询用户");}
}

动态生成类(通用了):

package com.daban.demo03;import com.daban.demo02.Rent;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;//使用这个类自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {//被代理的接口private Object target;public void setTarget(Object target) {this.target = target;}//生成得到的代理类public Object getProxy(){return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(),this);}//处理代理实例,并返回结果@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {log(method.getName());Object result = method.invoke(target, args);return result;}//增加想要的附属功能,不用改变原代码public void log(String msg){System.out.println("执行了"+msg+"方法");}
}

测试类:

package com.daban.demo03;public class Client {public static void main(String[] args) {UserServiceImp userServiceImp = new UserServiceImp();ProxyInvocationHandler handler = new ProxyInvocationHandler();handler.setTarget(userServiceImp);UserService proxy = (UserService) handler.getProxy();proxy.add();}
}

11、AOP实现方式

11.1 什么是AOP

什么是AOP:面向切面编程

11.2 Aop在Spring中的作用

名词:

  • 横切关注点:跨越应用程序多个模块的方法和功能。如日志,安全,缓存,事务
  • 切面(ASPECT):横切关注点被模块化的对象,他是一个类。(例如Log类)
  • 通知(Advice):切面必须要完成的工作,即它类中的一个方法。(例如Log类中的方法)
  • 目标(Target):被通知对象。(接口)
  • 代理(Proxy):向目标对象应用通知之后创建的对象。(生成的代理类)
  • 切入点(PointCut):切面通知执行地点的定义
  • 连接点(JointPoint):与切入点匹配的执行点

SpringAOP中,通过Advice定义横切逻辑,支持五种类型的Advice

通知类型连接点实现接口
前置通知方法方法前org.springframework.aop.MethodBeforeAdvice
后置通知方法后org.springframework.aop.AfterReturningAdvice
环绕通知方法前后org.aopalliance.intercept.MethodInterceptor
异常抛出通知方法抛出异常org.springframework.aop.ThrowsAdvice
引介通知类中增加新的方法属性org.springframework.aop.IntroductionInterceptor

即,AOP在不改变源代码的情况下,增加新功能

11.3 使用Spring实现AOP

11.3.1 使用前需要导入依赖包

<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.9.1</version><scope>runtime</scope>
</dependency>

11.3.2 方式一:使用原生的spring api接口

  1. 准备业务接口
package com.daban.service;public interface UserService {void add();void delete();void update();void select();
}
  1. 准备业务实现类
package com.daban.service;public class UserServiceImp implements UserService{@Overridepublic void add() {System.out.println("增加了一个用户");}@Overridepublic void delete() {System.out.println("删除了一个用户");}@Overridepublic void update() {System.out.println("改变了一个用户");}@Overridepublic void select() {System.out.println("查询了一个用户");}
}
  1. 准备需要切入的类
package com.daban.log;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
//需要切入的类需要实现相应的接口,11.2中五种接口都可以,扮演不同的方式
public class Log implements MethodBeforeAdvice {/*** method:要执行的目标对象的方法* args:参数* target:目标对象*/@Overridepublic void before(Method method, Object[] args, Object target) throws Throwable {System.out.println(target.getClass().getName()+"的"+method.getName()+"方法被执行");}
}
  1. 准备配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!--注册bean--><bean id="userService" class="com.daban.service.UserServiceImp"/><bean id="log" class="com.daban.log.Log"/><bean id="afterLog" class="com.daban.log.AfterLog"/><!--方式一、使用原生的spring api接口--><!--配置aop,需要导入aop的约束--><aop:config><!--切入点配置--><!--expression表达式:execution(* com.daban.service.UserServiceImp.*(..))--><!--id为切入点的名字--><aop:pointcut id="pointcut" expression="execution(* com.daban.service.UserServiceImp.*(..))"/><!--执行环绕增加--><!--advice-ref:要切入的类--><!--pointcut-ref:要切入的位置--><aop:advisor advice-ref="log" pointcut-ref="pointcut"/><aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/></aop:config>
  1. 测试类
import com.daban.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyTest {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");//动态代理类代理的是接口,所以这里使用UserService接口,而不使用实现类UserService userService = context.getBean("userService", UserService.class);userService.add();}
}

11.3.3 方式二:自定义类

  1. 准备业务接口,和方式一相同
  2. 准备业务接口的实现,和方式一相同
  3. 自定义一个类(切面)
package com.daban.diy;public class DiyPointcut {public void before(){System.out.println("********方法执行前********");}public void after(){System.out.println("========方法执行后========");}
}
  1. 准备配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!--注册bean--><bean id="userService" class="com.daban.service.UserServiceImp"/><bean id="log" class="com.daban.log.Log"/><bean id="afterLog" class="com.daban.log.AfterLog"/><!--方式二、自定义类--><bean id="diy" class="com.daban.diy.DiyPointcut"/><aop:config><!-- 自定义切面,ref是要引用(切入)的类--><aop:aspect ref="diy"><!--切入点--><aop:pointcut id="pointcut" expression="execution(* com.daban.service.UserServiceImp.*(..)))"/><!-- method:要切入的方法,pointcut-ref:切入点--><aop:after method="after" pointcut-ref="pointcut"/><aop:before method="before" pointcut-ref="pointcut"/></aop:aspect></aop:config>
</beans>
  1. 测试类,和方式一相同

11.3.4 方式三:使用注解实现

  1. 准备业务接口,和方式一相同
  2. 准备业务接口的实现,和方式一相同
  3. 自定义一个类(切面)
package com.daban.diy;import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;@Aspect//标注这个类是一个切面
public class AnnotationPointCut {//设置切入点在要切入的方法上@Before("execution(* com.daban.service.UserServiceImp.*(..)))")public void before(){System.out.println("********注解方式方法执行前********");}@After("execution(* com.daban.service.UserServiceImp.*(..)))")public void after(){System.out.println("========注解方式方法执行后========");}
}
  1. 准备配置文件
<!--方式三、使用注解-->
<bean id="anntation" class="com.daban.diy.AnnotationPointCut"/>
<!-- 开启注解支持-->
<aop:aspectj-autoproxy/>
  1. 测试类,和方式一相同

12、整合Mybatis

12.1 回忆mybatis

步骤:

  1. 导入jar包

​ junit,mybatis,mysql数据库,spring相关,aop植入,mybatis-spring

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.11</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.23</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.9.RELEASE</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.9.1</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.2</version></dependency>
</dependencies>
  1. 写实体类
package com.daban.pojo;import lombok.Data;@Data
public class User {private int id;private String name;private String pwd;
}
  1. 写mybatis核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><typeAliases><package name="com.daban.pojo"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf-8"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><mapper resource="UserMapper.xml"/></mappers>
</configuration>
  1. 编写接口
package com.daban.mapper;import com.daban.pojo.User;import java.util.List;public interface UserMapper {public List<User> getUser();
}
  1. 编写接口对应的mapper文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.daban.mapper.UserMapper"><select id="getUser" resultType="user">select * from mybatis.user</select>
</mapper>
  1. 测试
import com.daban.mapper.UserMapper;
import com.daban.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class MyTest {@Testpublic void test() throws IOException {String resources = "mybatis-config.xml";InputStream resource = Resources.getResourceAsStream(resources);SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resource);SqlSession sqlSession = build.openSession(true);UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> user = mapper.getUser();for (User user1 : user) {System.out.println(user1);}}
}

12.2 mybatis-spring

  1. 导入jar包
  2. 写实体类
  3. 写mybatis核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><typeAliases><package name="com.daban.pojo"/></typeAliases>
</configuration>
  1. 编写接口
package com.daban.mapper;import com.daban.pojo.User;import java.util.List;public interface UserMapper {public List<User> getUser();
}
  1. 编写接口对应的mapper文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.daban.mapper.UserMapper"><select id="getUser" resultType="user">select * from mybatis.user</select>
</mapper
  1. 编写接口的实现类
package com.daban.mapper;import com.daban.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;import java.util.List;public class UserMapperImp implements UserMapper{private SqlSessionTemplate sqlSession;public void setSqlSession(SqlSessionTemplate sqlSession) {this.sqlSession = sqlSession;}@Overridepublic List<User> getUser() {UserMapper mapper = sqlSession.getMapper(UserMapper.class);return mapper.getUser();}
}
  1. 编写spring配置文件
<?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"><!--使用DataSource数据源代理mybatis配置--><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf-8"/><property name="username" value="root"/><property name="password" value="123456"/></bean><!-- 获取SqlSessionFactory对象--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><!-- 绑定mybatis配置文件--><property name="configLocation" value="classpath:mybatis-config.xml"/><!-- 代替了在mybatis配置文件中的mapper注册--><property name="mapperLocations" value="classpath:UserMapper.xml"/></bean><!--这就是我们使用的sqlSession--><bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"><!--由于没有set方法只能使用构造器注入--><constructor-arg index="0" ref="sqlSessionFactory"/></bean><bean id="userMapper" class="com.daban.mapper.UserMapperImp"><property name="sqlSession" ref="sqlSession"/></bean>
</beans>
  1. 测试
import com.daban.mapper.UserMapper;
import com.daban.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import java.io.IOException;
import java.util.List;public class MyTest {@Testpublic void test() throws IOException {ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");UserMapper bean = context.getBean("userMapper",UserMapper.class);List<User> user = bean.getUser();for (User user1 : user) {System.out.println(user1);}}
}

12.3 获得SqlSession的方式二

参见官网http://mybatis.org/spring/zh/sqlsession.html#SqlSessionDaoSupport

13、声明式事务

13.1 spring中的事务管理

  • 声明式事务:aop
<!-- 配置声明式事务-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><constructor-arg ref="dataSource"/>
</bean>
<!-- 结合aop实现事务的植入-->
<!-- 配置事务通知,需要导入tx约束-->
<tx:advice id="txAdvice" transaction-manager="transactionManager"><!-- 给哪些方法配置事务--><!-- 配置事务的传播特性,默认REQUIRED--><tx:attributes><tx:method name="add" propagation="REQUIRED"/><!-- 给所有方法配置--><tx:method name="*" propagation="REQUIRED"/></tx:attributes>
</tx:advice>
<!-- 配置事务的切入点-->
<aop:config><aop:pointcut id="txPointCut" expression="execution(* com.daban.mapper.*.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>
  • 编程式事务:需要在代码中进行事务管理(需要改源代码)

相关文章:

架构读后感

1...

java调用接口

long dateStr = System.currentTimeMillis()/1000; String url=""; //创建参数 JSONObject jsonObject = new JSONObject(); jsonObject.put("Action","1111"); jsonObject.put("DeviceType","2222&…...

Go中的方法

基本介绍 golang中的方法是作用在指定的数据类型上的(和数据类型绑定的),因此自定义类型都可以用方法,而不仅仅是struct。 方法的声明和调用 type A struct{Num int } func(a A) test(){fmt.Println(a.Num) }func(a A) test(){}表示A结构体有一个方法,方法名字为test (a A…...

vue项目引入高德地图报错:Map container div not exist (火狐浏览器不加载地图)

问题描述:谷歌浏览器正常显示地图,火狐浏览器不加载,并且报错: Map container div not exist 错误代码如下: 修改后代码如下: 参考大佬:https://blog.csdn.net/white_777/article/details/128286558...

【HbuilderX】 uniapp实现 android申请权限 和 退出app返回桌面

目录 android申请权限&#xff1a; 监听用户是否开启权限或关闭权限&#xff1a; 退出app返回桌面&#xff1a; android申请权限&#xff1a; 首先在 manifest.json 内添加你所需要用到权限 添加权限插件 permission.js 一次就好1/权限插件 - Gitee.comhttps://gitee.co…...

程序是怎样跑起来的第五章读书笔记

第五章主要讲了内存和磁盘的亲密关系。他从。存储程序方法制的是什么?通过使用内存来提高仿磁盘访问速度的机制称为什么等等问题来。开启了磁盘和内存关系的解读。 程序保存在存储设备中。通过有序的被读出来实现运行。这一机制被称为存储程序方式。内存是计算器的重要组成部分…...

【SSM框架 二】Spring

文章目录二、Spring1、简介2、IOC理论思想3、Hello Spring4、IOC创建对象的方式4.1 无参构造构造器注入4.2 有参构造器注入5、Spring的配置5.1 别名5.2 Bean的配置5.3 import6、DI依赖注入6.1 构造方法注入6.2 set方法注入6.3 扩展注入6.4、Bean的作用域7、Bean的自动装配7.1 正…...

基于java+ssm+vue+mysql的社区流浪猫狗救助网站

项目介绍 随着迅速的发展&#xff0c;宠物饲养也较以前发生很大的变化&#xff0c;社区流浪猫狗救助网站系统以其独有的优势脱颖而出。“社区流浪猫狗救助网站”是以JAVA程序设计语言课为基础的设计出适合社区流浪猫狗救助网站&#xff0c;其开发过程主要包括后台数据库的建立…...

推特营销引流入门指南

一、关注 当您关注另一个Twitter用户时&#xff0c;您进行订阅&#xff0c;即可立即阅读其内容分享。因此&#xff0c;请评估您关注的人&#xff0c;尤其是刚开始时。跟踪新用户的一种简单方法是找到他们的个人资料&#xff0c;然后单击“关注”按钮。 Twitter对于那些疯狂点…...

Seata概述基础

分布式事务原因&#xff1a; 单体架构的spring事务不能跨机器&#xff0c;不能跨数据源 分布式事务的概念&#xff1a; 一个业务流程&#xff0c;在分布式系统&#xff08;微服务&#xff09;中&#xff0c;每个业务模块都是一个分支&#xff0c;保证每个业务分支一起成功&am…...

Python学习基础笔记二十二——生成器

一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值&#xff0c;但是yield又不同于return&#xff0c;return的执行意味着程序的结束&#xff0c;调用生成器函数不会得到返回的具体的值&#xff0c;而是得到一个可迭代的对象。每一次获取这个可迭代对…...

python -- PyQt5(designer)中文详细教程(四)事件和信号

事件 signals and slots也 被其他⼈翻译成信号和槽机制。 所有的应用都是事件驱动的。事件大部分都是由用户的行为产⽣的&#xff0c;当然也有其他的事件产生方式&#xff0c;比如网络的连接&#xff0c;窗口管理器或者定时器等。调⽤应⽤的exec_()⽅法时&#xff0c;应⽤会进⼊…...

你绝对想象不到的端对端通信的几种方式

一、前言 今天要和大家说的是我们常用的一些端对端的通信方式&#xff0c;这里我们会以python和php语言为主&#xff0c;举例说明客户端、浏览器端和服务器端通信&#xff0c;部分代码可能展示不全&#xff0c;不过我会放在文末链接供大家下载测试&#xff0c;下面我们先来让大…...

序列化--Serial

序列化&#xff1a;将数据结构或对象转换成二进制串的过程。 反序列化&#xff1a;将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。 Parcelable 与 Serializeable 的区别 SerializableParcelable通过IO对硬盘操作&#xff0c;速度较慢直接在内存操作&#x…...

BDD - SpecFlow ExternalData Plugin 导入外部测试数据

BDD - SpecFlow ExternalData Plugin 导入外部测试数据引言SpecFlow ExternalData 插件支持的数据源Tags实践创建一个 Class Libary Project添加 NuGet Packages添加测试数据源文件CSV 文件Excel 文件添加 Feature 文件实现 Step Definition执行Scenario 导入测试数据源Scenari…...

[Power Query] 日期和时间处理

Power Query查询编辑器为日期和时间数据提供了强大而快捷的处理方式 例1: 从日期中提取年、月份、日、季度、周、天等信息 数据源 步骤1:将数据源导入到Power BI Desktop&#xff0c;单击【转换数据】选项&#xff0c;进入Power Query查询编辑器界面 步骤2:选中"日期&qu…...

设计模式之抽象工厂模式

利用反射技术简单梳理抽象工厂模式 工厂模式实现 通常我们在实际工作中&#xff0c;经常遇到需要访问数据库的场景。 而常见的数据库又多种多样&#xff0c;怎么样针对不同的数据库来建立不同的数据库连接呢&#xff1f; 我们可以看下用抽象工厂模式加上反射技术来如何实现。…...

JavaWeb_第5章_会话技术_Cookie+Session

JavaWeb_第5章_会话技术_CookieSession 文章目录JavaWeb_第5章_会话技术_CookieSession1&#xff0c;会话跟踪技术的概述2&#xff0c;Cookie2.1 Cookie的基本使用2.2 Cookie的原理分析2.3 Cookie的使用细节2.3.1 Cookie的存活时间2.3.2 Cookie存储中文3&#xff0c;Session3.1…...

跟着实例学Go语言(一)

本教程全面涵盖了Go语言基础的各个方面。一共80个例子&#xff0c;每个例子对应一个语言特性点&#xff0c;非常适合新人快速上手。 教程代码示例来自go by example&#xff0c;文字部分来自本人自己的理解。 本文是教程系列的第一部分&#xff0c;共计20个例子、约1万字。 目…...

数据库基础 - 数据类型、关键字、cmd中操作数据库的命令

cmd中操作数据库的命令 mysql -hlocalhost -用户名 -密码 show database&#xff1b;查询数据库中的小数据库 show 数据库名&#xff1b;查询某一个小数据库 show 表名&#xff1b;查询表的结构 exit 退出数据类型 数值类型 int &#xff1a;整形 double&#xff1a;双精度&…...

2022SDNU-ACM结训赛题解

首先感谢一下各位出题人的精心准备、验题人的辛勤付出、以及选手的积极参加 题解 Problem A 柳予欣的归来【数学】 出题人&#xff1a; bhq 没想到一血是被打完山大的牛客比赛后来结训赛玩的wyx拿走的&#xff01; 题目描述&#xff1a; 计算(∑0<d<pd−1)m(\sum_{0…...

《人类简史》笔记三—— 历史从无正义

目录 一、尽管把人人生而平等喊得震天响&#xff0c;其实还是把人分成了上下等级 二、恶性循环 三、当男人究竟有什么好的&#xff1f; 一、尽管把人人生而平等喊得震天响&#xff0c;其实还是把人分成了上下等级 古时候&#xff1a; 上等人 平民和奴隶 现在&#xff1a;…...

Python实现基于用户的协同过滤推荐算法构建电影推荐系统

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 基于用户的协同过滤推荐&#xff08;User-based CF&#xff09;的原理假设&#xff1a;跟你喜好相似的人…...

阿里巴巴专场——第322场周赛题解

目录 模拟法&#xff1a;6253.回环句 排序后模拟&#xff1a;6254. 划分技能点相等的团队 BFS&#xff1a;6255. 两个城市间路径的最小分数 BFS&#xff1a;6256. 将节点分成尽可能多的组 模拟法&#xff1a;6253.回环句 这道题直接按照题目的意思暴力模拟即可&#xff1a;…...

【机器学习】支持向量回归

有任何的书写错误、排版错误、概念错误等&#xff0c;希望大家包含指正。 在阅读本篇之前建议先学习&#xff1a; 【机器学习】支持向量机【上】硬间隔 【机器学习】支持向量机【下】软间隔与核函数 支持向量回归 支持向量回归&#xff08;support vector regression&#xf…...

Linux安装mysql

1、 查看是否已经安装 Mysql rpm -qa | grep mysql 如果你查看出来有东西&#xff0c;可以使用下面命令将其删除 rpm -e 文件名 2 、下载官方 Mysql 包 wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 如果安装有提示&#xff1a;Cannot…...

JeecgBoot搭建(低代码)

环境安装 后端&#xff1a;JDK: 1.8 (小于11)、Maven: 3.5、MySql: 5.7、Redis: 3.2 前端&#xff1a;Node Js: 14.18 / 16、Npm: 5.6.0、Yarn: 1.21.1 、Pnpm 工具&#xff1a; IDEA、Navicat、Git、TortoiseGit拉取代码 后端&#xff1a;git clone https://gitee.com/jeecg/…...

【java】3-获取线程引用与线程的属性

1.获取线程的引用 在创建一个线程之后&#xff0c;我们很有必要去获取当前线程实例的引用&#xff0c;以便能够观察到线程的一些属性&#xff0c;或是对于当前线程进行一系列的操作 调用Thread类的静态方法currentThread&#xff0c;我们便能拿到当前线程的引用 Thread.curr…...

2022-12-04一周学习

这周基本上还是在对前端学习的更多一点&#xff0c;主要是之前没有重视vue3的学习,现在在补上来&#xff0c;学习了vue3的一些知识&#xff0c;前端的权限管理&#xff0c;设置路由守卫&#xff0c;pinia&#xff0c;还学习了redis的一些基本操作&#xff0c;之前只是照搬了别人…...

CG-34 浊度传感器 简单说明

产品概述 浊度传感器是一种智能监测水中悬浮物对光线透过时所发生的阻碍程度的仪器。允许在水中的测量点进行无人值守的操作。采用自清洗设计&#xff0c;可清除水中附着物以及气泡聚集而影响测量结果。具有优异的抗污染能力&#xff0c;即使恶劣的环境长期在线监测&#xff0c…...

跟着实例学Go语言(二)

本教程全面涵盖了Go语言基础的各个方面。一共80个例子&#xff0c;每个例子对应一个语言特性点&#xff0c;非常适合新人快速上手。 教程代码示例来自go by example&#xff0c;文字部分来自本人自己的理解。 本文是教程系列的第二部分&#xff0c;共计20个例子、约1.2万字。 …...

linux+window+macos下的JDK安装

1. Linux中安装JDK &#xff08;1&#xff09;下载Linux版本的jdk压缩包 &#xff08;2&#xff09;解压 tar -zxvf 压缩包名 例如&#xff1a; tar -zxvf jdk-8u251-linux-x64.tar.gz&#xff08;3&#xff09;在系统配置文件配置java 编辑profile配置文件 vim /etc/prof…...

DiffuSEEG:一种基于stable diffusion 的SEEG数据补全方法

目录一. 立体脑电图&#xff08;SEEG&#xff09;1.1 SEEG概念1.2 SEEG作用1.3 SEEG的适用场景1.4 操作方法一. 立体脑电图&#xff08;SEEG&#xff09; 1.1 SEEG概念 立体脑电图&#xff08;SEEG&#xff09;&#xff1a;是一种借助外科微创的方法将电极植入到大脑不同的部…...

kubernetes—Service介绍

Service介绍 在kubernetes中&#xff0c;pod是应用程序的载体&#xff0c;我们可以通过pod的ip来访问应用程序&#xff0c;但是pod的ip地址不是固定的&#xff0c;这也就意味着不方便直接采用pod的ip对服务进行访问。 为了解决这个问题&#xff0c;kubernetes提供了Service资…...

AlphaFold2源码解析(7)--模型之Evoformer

AlphaFold2源码解析(7)–模型之Evoformer 这篇文章我们主要药讲解AlphaFold2的Evoformer的代码细节。 Evoformer Stack 该网络有一个双塔结构&#xff0c;在MSA堆栈中具有轴向的自我注意&#xff1b;在Pair堆栈中具有三角形的乘法更新和三角形的自我注意&#xff1b;以及外积…...

docker 安装 redis 6.0.8 cluster 实战 (3主3从) 动态扩容

这里将上篇博客搭建的3主3从 扩容为 4主4从 1. 新建两个node节点 docker run -d \ --net host \ --privileged \ --name redis-node-7 \ --log-opt max-size100m \ --log-opt max-file3 \ -v /root/docker/redis-node-7/data:/data \ redis:6.0.8 \ --cluster-enabled yes \ -…...

20221204

You are so much more than how you look. 你比你的外表更有魅力 Never give up until the fight is over. 永远不要放弃&#xff0c;要一直战斗到最后一秒。 whats done cannot be undone 覆水难收 If I was going somewhere, I was running。 如果我要去哪儿&#xff…...

CN_数据链路层流量控制@可靠的传输机制@ARP协议

文章目录流量控制技术(协议)停止-等待流量控制滑动窗口流量控制发送窗口接收窗口基本原理可靠的传输机制确认机制ACK超时重传机制RTOARQ处理差错自动重传请求ARQ协议&#x1f388;ARQ具体协议单帧ARQ协议停止-等待协议SW-ARQ例连续ARQ协议后退N帧协议(GBN)GBN多帧滑动窗口累计确…...

程序人生 | 与足球共舞的火柴人(致敬格拉利什,赋予足球更深的意义)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…...

安装ubuntu20.04, CUDA11.4, cnDNN, tensorflow, pytorch

ubuntu22.04默认python为3.11 ubuntu20.04默认python为3.8 第一步&#xff0c;分区安装系统 efi引导区, 逻辑分区&#xff0c;512M root: 主分区&#xff0c;512M swap: 逻辑分区&#xff0c;64G home:逻辑分区&#xff0c;320G /:逻辑分区, 130G&#xff0c; CUDA是安装…...

shell脚本受限执行

shell 中运行的脚本或脚本的个代码断会禁用一些正常 shell 中可以执行的命令.这是限制脚本用户的权限和最小化运行脚本导致的破坏的安全措施.受限的内容包括&#xff1a;使用 cd 命令更改工作目录. 更改环境变量$PATH, $SHELL, $BASH_ENV,或$ENV 的值. 读或更改 shell 环境选项…...

HTTP 速查手册

一、通用身份验证 # 服务端返回401&#xff0c;并告知验证类型为Basic GET 401 Unauthorized WWW-Authenticate: Basic realm"description"# 浏览器输入验证信息后&#xff0c;请求头中携带验证信息 Authorization: Basic xxxxxxxxxx二、Cookie # 服务端返回set-co…...

【计算机视觉】 摄像机标定

摄像机标定 齐次坐标 齐次坐标&#xff0c;将欧氏空间的无穷远点&#xff0c;与投影空间中有实际意义的消失点&#xff0c;建立起映射关系。 把齐次坐标转化为笛卡尔坐标的方法&#xff1a;是前面n-1个坐标分量分别除以最后一个分量即可 一些解释和性质&#xff1a; 比较好的…...

【Redis】Redis安装步骤和特性以及支持的10种数据类型(Redis专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…...

DHTMLX Diagram JavaScript/HTML5 Pro Library:5.0

Diagram — JavaScript/HTML5 Diagram Library Ω578867473 破解版DHTMLX Diagram comprises a set of interactive HTML5 UI components such as organization charts, flowcharts, decision trees, block diagrams, mind maps, etc. Consisting of nodes and connectors, di…...

GPS卫星位置解算

本文介绍了基于C语言的GPS卫星位置解算原理与程序设计。针对每个原理、公式、代码设计进行了详细讲解&#xff0c;希望能够给测绘学子们带来帮助。 参考书籍&#xff1a; 李征航 黄劲松&#xff1a;GPS测量与数据处理&#xff08;第三版&#xff09; 目录 基础原理 1&#xf…...

大数据:Sqoop 简介与安装

一、Sqoop 简介 Sqoop 是一个常用的数据迁移工具&#xff0c;主要用于在不同存储系统之间实现数据的导入与导出&#xff1a; 导入数据&#xff1a;从 MySQL&#xff0c;Oracle 等关系型数据库中导入数据到 HDFS、Hive、HBase 等分布式文件存储系统中&#xff1b; 导出数据&am…...

[附源码]计算机毕业设计文曦家教预约系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…...

HK1 BOX刷入 Armbian系统作为服务器

HK1 BOX刷入 Armbian系统作为服务器 1 安装Armbian到EMMC 硬件 HK1 BOX s905 x3 固件版本选择 Armbian_23.02.0_Aml_s905x3_bullseye_5.15.80_server_2022.12.01用usb启动&#xff0c;tf/sd有的设备不行&#xff0c;有干扰&#xff0c;有可能从TF卡无法启动系统。 用usb启…...

CEC2015:动态多目标野狗优化算法求解CEC2015(提供完整MATLAB代码,含GD、IGD、HV和SP评价指标)

一、动态多目标优化问题简介 现实世界中&#xff0c;许多优化问题不仅具有多属性&#xff0c;而且与时间相关&#xff0c;即随着时间的变化&#xff0c;优化问题本身也发生改变&#xff0c;这类问题称为动态多目标优化问题&#xff08;dynamic multi-objective optimization p…...

【蓝桥杯选拔赛真题31】python三位数组合个数 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python三位数组合个数 一、题目要求 1、编程实现 2、输入输出...

SpringBoot项目--如何不停服更新应用?

原文网址&#xff1a;SpringBoot项目--如何不停服更新应用&#xff1f;_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java后端项目如何不停机更新服务。 在生产环境中&#xff0c;一般都会每个服务部署多个实例。只要多于1个实例&#xff0c;就可以不停服更新应用。 不停服…...

MVVM与Vue响应式原理

Vue的响应式实现原理 MVVM M&#xff1a;模型 》data中的数据 V&#xff1a;视图 》模板 VM&#xff1a;视图模型 》Vue实例对象 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0EWNM16D-1670161519474)(C:\Users\lucas\Desktop\学习\图片\mode…...

vue和react的生命周期

vue和react的生命周期 一、Vue的生命周期二、React的生命周期2.1.类组件2.2.函数式组件一、Vue的生命周期 初始化阶段(组件创建、数据初始化)、挂载、更新、销毁 父子组件生命周期执行顺序 初次加载组件时:父beforeCreate – 父created – 父beforeMount – 子beforeCreate …...

浏览器高度兼容性

浏览器的卷去高度 1.标准模式 document.documentElement.scrollTop 2.非标准模式 document.body.scrollTop 浏览器高度兼容性 1.标准模式下 浏览器的实际高度&#xff1a; document.body.clientHeight 浏览器的可视高度&#xff1a;document.documentElement.clientHeight 2.非…...

关于天干地支及其计算

以天干地支计算日期是我国悠良的传统文化&#xff0c;最近在看如何计算人的生辰八字&#xff0c;写了个程序&#xff0c;但是只能算年的干支&#xff0c;月、日的干支计算方法太复杂了&#xff0c;望之只能却步&#xff0c;还是乖乖去查万年历比较好。这里记下关于干支的一些东…...

对于爬虫的学习

本地爬取 package MyApi.a08regexdemo;import java.util.regex.Matcher; import java.util.regex.Pattern;public class RegexDemo03 {public static void main(String[] args) {//要求&#xff1a;找出里面所有javaxxString str"Java自从95年问世以来&#xff0c;经历了…...

VUE基础知识九 ElementUI项目

ElementUI官网 一 项目 最终完成的效果&#xff1a; 切换上边的不同按钮&#xff0c;下方显示不同的表格数据 在src/components下新建不同业务组件的文件夹 1.1 搭建项目 使用脚手架搭建项目后&#xff0c;引入ElementUI&#xff08;搭建、引入ElementUI步骤在第七节里已…...

JS清空数组方法

清空数组的方法有多种&#xff0c;以下是几种常见的方式&#xff1a; 1.使用 array.length 属性将数组的长度设为0&#xff0c;这样会移除数组中的所有元素&#xff1a; var arr [1, 3, 5]; arr.length 0; console.log(arr); // [] 2. 使用 array.splice() 方法&#xff0c;…...

进阶了解C++(4)——多态

在上篇文章中&#xff0c;简单的介绍了多态中的概念以及其相关原理。本文将针对多态中其他的概念进一步进行介绍&#xff0c;并且更加深入的介绍关于多态的相关原理。 目录 1. 抽象类&#xff1a; 2. 再谈虚表&#xff1a; 3. 多继承中的虚函数表&#xff1a; 1. 抽象类&am…...

【Redis】redis通用命令

redis连接命令&#xff08;客户端&#xff09; 要在 redis 服务上执行命令需要一个 redis 客户端。Redis 客户端在我们之前安装redis 的src目录下&#xff0c;具体为/usr/local/redis/src。注意此redis实例没有设置密码&#xff0c;如果设置了密码需要先使用命令AUTH执行验证或…...

Netty入门指南:从零开始的异步网络通信

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Netty入门指南&#xff1a;从零开始的异步网络通信 前言Netty简介由来&#xff1a;发展历程&#xff1a;异步、事件驱动的编程模型&#xff1a; 核心组件解析通信协议高性能特性异步编程范式性能优化与…...