SSM整合

目录

  • 一、SSM整合
    • 1.1 步骤分析
    • 1.2 常见疑惑
    • 1.3 准备工作
    • 1.4 相关配置
    • 1.5 编写Controller,Service,Dao
  • 二、案例
    • 2.1 响应格式统一
    • 2.2 查询所有用户
    • 2.3 分页查询用户
    • 2.4 插入用户
    • 2.5 删除用户
    • 2.6 更新用户
  • 三、异常统一处理
  • 四、拦截器
  • 五、声明式事务
  • 六、AOP

一、SSM整合

1.1 步骤分析

①Spring整合上Mybatis

把Service层Dao层都注入Spring容器中

②引入配置SpringMVC

把Controller层注入SpringMVC容器中

③让web项目启动时自动读取Spring配置文件来创建Spring容器

可以使用ContextLoaderListener来实现Spring容器的创建。

1.2 常见疑惑

  • 为什么要用两个容器?
    因为Controller如果不放在MVC容器中会没有效果,无法处理请求。而Service如果不放在Spring容器中,声明式事务也无法使用。

  • SpringMVC容器中的Controller需要依赖Service,能从Spring容器中获取到所依赖的Service对象嘛?
    Spring容器相当于是父容器,MVC容器相当于是子容器。子容器除了可以使用自己容器中的对象外还可以使用父容器中的对象。

  • 是如何实现这样父子容器的关系的?
    具体可以看源码解析阶段的视频。但是我们目前可以用代码模拟下。

  • 是什么时候让两个容器产生这种父子容器的关系的?
    在ContextLoaderListener中,会在创建好容器后把容器存入servletContext域。这样在DispatcherServlet启动时,创建完SpringMVC容器后会从servletContext域中获取到Spring容器对象,设置为其父容器,这样子容器就能获取到父容器中的bean了。详情请见源码解析视频。

1.3 准备工作

引入所有依赖

 		<!--Spring-context--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.9.RELEASE</version></dependency><!--AOP相关依赖--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.13</version></dependency><!-- spring-jdbc --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.9.RELEASE</version></dependency><!-- mybatis整合到Spring的整合包 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.4</version></dependency><!--mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.4</version></dependency><!--log4j依赖,打印mybatis日志--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!--日志--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency><!--分页查询,pagehelper--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>4.0.0</version></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!-- druid数据源 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.16</version></dependency><!-- junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!-- spring整合junit的依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.1.9.RELEASE</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version><scope>provided</scope></dependency><!-- servlet依赖 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!--springmvc的依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.9.RELEASE</version></dependency><!-- jackson,帮助进行json转换--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version></dependency><!--commons文件上传,如果需要文件上传功能,需要添加本依赖--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency><!-- Spring5和Thymeleaf整合包--><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.12.RELEASE</version></dependency>

1.4 相关配置

①整合Spring和Mybatis
在resources目录下创建Spring核心配置文件: 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"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!--扫描组件(除控制层)--><context:component-scan base-package="com.lx"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan><!--引入jdbc.properties配置文件--><context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder><!--配置数据源--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></bean><!--配置事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!--开启事务的注解驱动将使用注解@Transactional标识的方法或类中所有的方法进行事务管理--><tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven><!--配置SqlSessionFactoryBean,可以直接在Spring的IOC中获取SqlSessionFactory--><bean class="org.mybatis.spring.SqlSessionFactoryBean"><!--设置MyBatis的核心配置文件的路径--><property name="configLocation" value="classpath:mybatis-config.xml"></property><!--设置数据源--><property name="dataSource" ref="dataSource"></property><!--设置类型别名所对应的包--><property name="typeAliasesPackage" value="com.lx.pojo"></property><!--设置映射文件的路径,只有映射文件的包和mapper接口的包不-致时需要设置--><!-- <property name="mapperlocations" value="classpath:mappers/*.xml"></property>--></bean><!--开启aop注解支持--><aop:aspectj-autoproxy></aop:aspectj-autoproxy><!--配置mapper接口的扫描,可以将指定包下所有的mapper接口,通过sqlSession创建代理实现类对象,并将这些对象交给IOC容器管理--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.lx.mapper"></property></bean>
</beans>

在resources目录下创建jdbc.properties 文件,内容如下:

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/ssm_db?serverTimezone=UTC
jdbc.username=root
jdbc.password=root

在resources目录下创建mybatis-config.xml ,内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><!--将下划线映射为驼峰--><setting name="mapUnderscoreToCamelCase" value="true"/></settings><!--配置分页插件--><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin></plugins>
</configuration>

在resources目录下创建log4j.xml,内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"><param name="Encoding" value="UTF-8" /><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" /></layout></appender><logger name="java.sql"><level value="debug" /></logger><logger name="org.apache.ibatis"><level value="info" /></logger><root><level value="debug" /><appender-ref ref="STDOUT" /></root>
</log4j:configuration>

②SpringMVC配置文件
在resources目录下创建springmvc.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"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--扫描控制层组件--><context:component-scan base-package="com.lx.controller"></context:component-scan><!--配置Thymeleaf视图解析器,前后端不分离项目使用--><bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="order" value="1"/><property name="characterEncoding" value="UTF-8"/><property name="templateEngine"><bean class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><!-- 视图前缀--><property name="prefix" value="/WEB-INF/templates/"/><!--视图后缀--><property name="suffix" value=".html"/><property name="templateMode" value="HTML5"/><property name="characterEncoding" value="UTF-8" /></bean></property></bean></property></bean><!--配置默认的servlet处理静态资源--><mvc:default-servlet-handler /><!--开启mvc注解驱动,解决响应乱码--><mvc:annotation-driven><mvc:message-converters><bean class="org.springframework.http.converter.StringHttpMessageConverter"><constructor-arg value="utf-8"/></bean></mvc:message-converters></mvc:annotation-driven><!--配置视图控制器 前后端不分离项目使用--><mvc:view-controller path="/" view-name="index"></mvc:view-controller><!--配置文件上传解析器 前后端不分离项目使用--><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
</beans>

③Spring整合入web项目,配置web,xml
~~~~~~       让web项目启动的时候就能够创建Spring容器。可以使用Spring提供的监听器ContextLoaderListener,所以我们需要再web.xml中配置这个监听器,并且配置上Spring配置文件的路径。


web.xml

<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name><!--配置spring的编码过滤器--><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--配置处理请求方式的过滤器,前后端不分离使用--><filter><filter-name>HiddenHttpMethodFilter</filter-name><filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class></filter><filter-mapping><filter-name>HiddenHttpMethodFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--配置springmvc的前端控制器--><servlet><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!--将DispatcherServlet的初始化时间提前到服务器启动时--><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>DispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!--配置Spring的监听器,在服务器启动时加载Spring的配置文件--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!--设置Spring配置文件自定义的位置和名称--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param>
</web-app>

1.5 编写Controller,Service,Dao

我们来编写根据id查询用户的接口来进行测试
Controller层

@RestController
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/user/{id}")public User findById(@PathVariable("id") Integer id){User user = userService.findById(id);return user;}
}

Service层

public interface UserService {User findById(Integer id);
}
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;public User findById(Integer id) {return userDao.findById(id);}
}

Dao层

public interface UserDao {/*** 根据id查询用户* @param id* @return*/User findById(Integer id);
}

mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.lx.dao.UserDao"><select id="findById" resultType="com.lx.domain.User">select * from user where id = #{id}</select>
</mapper>

二、案例

2.1 响应格式统一

~~~~~~       我们要保证一个项目中所有接口返回的数据格式的统一。这样无论是前端还是移动端开发获取到我们的数据后都能更方便的进行统一处理。

~~~~~~       所以我们定义以下结果封装类

@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseResult<T> {/*** 状态码*/private Integer code;/*** 提示信息,如果有错误时,前端可以获取该字段进行提示*/private String msg;/*** 查询到的结果数据,*/private T data;public ResponseResult(Integer code, String msg) {this.code = code;this.msg = msg;}public ResponseResult(Integer code, T data) {this.code = code;this.data = data;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public T getData() {return data;}public void setData(T data) {this.data = data;}public ResponseResult(Integer code, String msg, T data) {this.code = code;this.msg = msg;this.data = data;}
}

2.2 查询所有用户

@RestController
public class UserController {@Autowiredprivate UserService userService;//省略其他无关代码@GetMapping("/user")public ResponseResult findAll(){List<User> list = userService.findAll();return new ResponseResult(200,"操作成功",list);}
}
public interface UserService {User findById(Integer id);List<User> findAll();
}
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;//省略其他无关代码public List<User> findAll() {return userDao.findAll();}
}
public interface UserDao {//省略其他无关代码List<User> findAll();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.lx.dao.UserDao"><select id="findAll" resultType="com.lx.domain.User">select * from user</select>
</mapper>

2.3 分页查询用户

~~~~~~       分页查询的结果除了要包含查到的用户数据外还要有当前页数,每页条数,总记录数这些分页数据。

分页数据封装类

public class PageResult<T> {private Integer currentPage;private Integer pageSize;private Integer total;private List<T> data;public PageResult(Integer currentPage, Integer pageSize, Integer total, List<T> data) {this.currentPage = currentPage;this.pageSize = pageSize;this.total = total;this.data = data;}public Integer getCurrentPage() {return currentPage;}public void setCurrentPage(Integer currentPage) {this.currentPage = currentPage;}public Integer getPageSize() {return pageSize;}public void setPageSize(Integer pageSize) {this.pageSize = pageSize;}public Integer getTotal() {return total;}public void setTotal(Integer total) {this.total = total;}public List<T> getData() {return data;}public void setData(List<T> data) {this.data = data;}
}
@RestController
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/user/{pageSize}/{pageNum}")public ResponseResult findByPage(@PathVariable("pageSize") Integer pageSize,@PathVariable("pageNum") Integer pageNum){PageResult pageResult =  userService.findByPage(pageSize,pageNum);return new ResponseResult(200,"操作成功",pageResult);}}
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;public PageResult findByPage(Integer pageSize, Integer pageNum) {PageHelper.startPage(pageNum,pageSize);List<User> list = userDao.findAll();PageInfo pageInfo = new PageInfo(list);PageResult pageResult = new PageResult(pageInfo.getPageNum(),pageInfo.getPageSize(), (int) pageInfo.getTotal(),list);return pageResult;}
}

2.4 插入用户

	@PostMapping("/user")public ResponseResult insertUser(@RequestBody User user){userService.insertUser(user);return new ResponseResult(200,"操作成功");}

service层

    void insertUser(User user);
  public void insertUser(User user) {userDao.insertUser(user);}

Dao层

void insertUser(User user);

在mapper映射文件中

    <insert id="insertUser">insert into user values(null,#{username},#{age},#{address})</insert>

2.5 删除用户

Controller层

    @DeleteMapping("/user/{id}")public ResponseResult deleteUser(@PathVariable("id") Integer id){userService.deleteUser(id);return new ResponseResult(200,"操作成功");}

Service层

在Service接口中增加方法定义

    void deleteUser(Integer id);

实现类中实现该方法:

    public void deleteUser(Integer id) {userDao.deleteUser(id);}

Dao层

在接口中定义方法

    void deleteUser(Integer id);

在mapper映射文件中

    <delete id="deleteUser">delete from user where id = #{id}</delete>

2.6 更新用户

Controller层

    @PutMapping("/user")public ResponseResult updateUser(@RequestBody User user){userService.updateUser(user);return new ResponseResult(200,"操作成功");}

Service层

在Service接口中增加方法定义

    void updateUser(User user);

实现类中实现该方法:

    public void updateUser(User user) {userDao.updateUser(user);}

Dao层

在接口中定义方法

    void updateUser(User user);

在mapper映射文件中

    <update id="updateUser">update user set username = #{username},age = #{age},address = #{address} where id = #{id}</update>

三、异常统一处理

我们可以使用@ControllerAdvice实现对异常的统一处理。让异常出现时也能返回响应一个JSON。

代码如下:

@ControllerAdvice
public class SGControllerAdvice {@ExceptionHandler(Exception.class)@ResponseBodypublic ResponseResult handleException(Exception e){return new ResponseResult(500,e.getMessage());}
}

四、拦截器

public class MyHandlerInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle");return true;}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion");}
}

springmvc.xml

<!--配置拦截器--><mvc:interceptors><mvc:interceptor><!----><mvc:mapping path="/**"/><!--配置排除拦截的路径--><!--<mvc:exclude-mapping path="/"/>--><!--配置拦截器对象注入容器--><bean class="com.lx.interceptor.MyHandlerInterceptor"></bean></mvc:interceptor></mvc:interceptors>

五、声明式事务

已经做好了相应的配置,只要在service方法上加上注解即可
    @Transactionalpublic void test() {userDao.insertUser(new User(null,"test1",11,"cc"));
//        System.out.println(1/0);userDao.insertUser(new User(null,"test2",12,"cc2"));}

六、AOP

~~~~~~       注意,自己去使用AOP进行增强时,应该是对Service进行增强。不能对Controller进行增强,因为切面类会被放入父容器,而我们的Controller是在子容器中的。父容器不能访问子容器。

~~~~~~       并且我们如果需要对Controller进行增强,使用拦截器也会更加的好用。

@Aspect
@Component
public class MyAspect {//定义切点@Pointcut("execution(* com.sangeng.service..*.*(..))")public void pt(){}//进行增强@Before("pt()")public void before(){System.out.println("before");}
}

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

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

相关文章

leetcode2809. 使数组和小于等于 x 的最少时间 排序+0-1背包

https://leetcode.cn/problems/minimum-time-to-make-array-sum-at-most-x/ 给你两个长度相等下标从 0 开始的整数数组 nums1 和 nums2 。每一秒&#xff0c;对于所有下标 0 < i < nums1.length &#xff0c;nums1[i] 的值都增加 nums2[i] 。操作 完成后 &#xff0c;你…

DOM基础获取元素+事件基础+操作元素

一.DOM简介 DOM&#xff0c;全称“Document Object Model&#xff08;文档对象模型&#xff09;”&#xff0c;它是由W3C定义的一个标准。 在实际开发中&#xff0c;我们有时候需要实现鼠标移到某个元素上面时就改变颜色&#xff0c;或者动态添加元素或者删除元素等。其实这些效…

c++开发 高质量 面试题分享

1 编译和解释型语言分别有什么特点,各举例一种类型 编译型语言和解释型语言是两种不同的程序设计语言的类型,它们的主要区别在于程序的执行方式和效率。编译型语言是指将源代码通过编译器转换成机器码,然后直接在目标平台上运行的语言。解释型语言是指将源代码通过解释器逐…

AOP前置通知加return后的影响

总结1 前置通知before没有返回值&#xff0c;返回类型为void&#xff0c;即return&#xff1b;所以加不加return都可&#xff0c;无非是返回个空。因此不影响目标代码及其它通知执行。 总结2 前置通知报错的话&#xff0c;目标代码和后置通知不会执行&#xff0c;但是最终通…

Python爬虫(八)_Requests的使用

Requests&#xff1a;让HTTP服务人类 虽然Python的标准库中urllib2模块中已经包含了平常我们使用的大多数功能&#xff0c;但是它的API使用起来让人感觉不太好&#xff0c;而Requests自称"HTTP for Humans"&#xff0c;说明使用更简单方便。 Requests唯一的一个非转…

一周 AIGC 丨苹果下架多款 AIGC 应用,阿里云开源通义千问 70 亿参数模型

多个 AIGC 应用在苹果应用商店下架&#xff0c;包含数据采集和使用不够规范等问题。阿里云开源通义千问 70 亿参数模型&#xff0c;包括通用模型 Qwen-7 B 和对话模型 Qwen-7 B-Chat。腾讯混元大模型开始应用内测&#xff0c;内部多个业务线接入测试。百度智能云“千帆大模型平…

93 | Python 设计模式 —— 建造者模式

文章目录 什么是建造者模式?建造者模式的四个角色Python建造者模式示例建造者模式的优点建造者模式的适用场景案例1:股票价格监控案例2:天气预报系统总结当构建复杂对象时,经常会遇到对象的创建过程非常复杂、包含多个步骤、或者有不同的配置选项。这时,使用建造者模式是一…

【PostgreSQL内核学习(十一)—— OpenGauss源码学习(CopyTo)】

可优化语句执行 概述什么是列存储&#xff1f;列存的优势 相关函数CopyToCStoreCopyToCopyStatetupleDescCStoreScanDesc CStoreBeginScanRelationSnapshotProjectionInfo GetCStoreNextBatchRunScanFillVecBatchCStoreIsEndScan CStoreEndScan 声明&#xff1a;本文的部分内容…

ArcGIS API for JavaScript 调用自定义地图模板总结

ArcGIS API for JavaScript 调用自定义地图模板总结 3.9版本4.24版本 3.9版本 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Hello World</title><link rel"stylesheet" href&qu…

面试之快速学习SQL-基础增删改查语句

1. SELECT SELECT column1,column2,column3 FROM table_name;SELECT * FROM table_name;2. SQL SELECT DISTINCT 语句 在表中&#xff0c;可能会包含重复值。这并不成问题&#xff0c;不过&#xff0c;有时您也许希望仅仅列出不同&#xff08;distinct&#xff09;的值。 SE…

54款宝藏级AIGC工具分享(claude,Midjourney,Stable Diffusion等)

随着ChatGPT的一波又一波高潮&#xff0c;生成式AI逐渐进入人们视野&#xff0c;并开始大行其道&#xff0c;正如人们所说&#xff1a;AI用的好&#xff0c;天天下班早&#xff01; 当然&#xff0c;有效的利用AI不但能下班早&#xff0c;还能在上班时间摸鱼&#xff0c;就如潘…

【web逆向】全报文加密流量的去加密测试方案

aHR0cHM6Ly90ZGx6LmNjYi5jb20vIy9sb2dpbg 国密混合 WEB JS逆向篇 先看报文&#xff1a;请求和响应都是全加密&#xff0c;这种情况就不像参数加密可以方便全文搜索定位加密代码&#xff0c;但因为前端必须解密响应的密文&#xff0c;因此万能的方法就是搜索拦截器&#xff0c…

nginx的优化

一.、隐藏版本号 1、修改配置文件 /usr/local/nginx/conf/nginx.conf 在http模块下加入 server_tokens off; 2、在源码包&#xff08;安装包&#xff09;改 /src/core/nginx.h ldefine NGINX_VERSION "1.1.1”" #修改版本号 define NGINX_VER "burun/&qu…

0基础学习VR全景平台篇 第78篇:全景相机-拍摄VR全景

新手入门圆周率科技&#xff0c;成立于2012年&#xff0c;是中国最早投身嵌入式全景算法研发的团队之一&#xff0c;亦是全球市场占有率最大的全景算法供应商。相继推出一体化智能屏、支持一键高清全景直播的智慧全景相机--Pilot Era和Pilot One&#xff0c;为用户带来实时畅享…

【个人记录】CentOS7 编译安装最新版本Git

说明 使用yum install git安装的git版本是1.8&#xff0c;并不是最新版本&#xff0c;使用gitlab-runner托管时候会拉项目失败&#xff0c;这里使用编译源码方式安装最新版本的git。 基础环境安装 echo "nameserver 8.8.8.8" >> /etc/resolv.conf curl -o /…

算法基础之插入排序

1、插入排序基本思想 插入排序的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。插入排序在实现上&#xff0c;通常采用in-place排序&#xff08;即只需用到O(1)的额外空间的排序&#xff09;&a…

Shell编程基础(十五)文本三剑客(sed)

文本三剑客&#xff08;sed&#xff09; 使用场景基本语法实例命令列表 使用场景 sed提供了一种面交互的方式修改文件内容。 它是一行一行处理&#xff0c;可以通过正则匹配要修改的部分 基本语法 基本语法 sed [-opt] command files(多个文件 空格隔开) sed 使用正则 sed -…

【论文阅读】UNICORN:基于运行时来源的高级持续威胁检测器(NDSS-2020)

UNICORN: Runtime Provenance-Based Detector for Advanced Persistent Threats NDSS-2020 哈佛大学 Han X, Pasquier T, Bates A, et al. Unicorn: Runtime provenance-based detector for advanced persistent threats[J]. arXiv preprint arXiv:2001.01525, 2020. 源码&…

vue3 excel 导出功能

1.安装 xlsx 库 npm install xlsx2.创建导出函数 src/utils/excelUtils.js import * as XLSX from xlsx;const exportToExcel (fileName, datas, sheetNames) > {// 创建工作簿const wb XLSX.utils.book_new()for (let i 0; i < datas.length; i) {let data datas…

24届近5年上海交通大学自动化考研院校分析

今天给大家带来的是上海交通大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、上海交通大学 学校简介 上海交通大学是我国历史最悠久、享誉海内外的高等学府之一&#xff0c;是教育部直属并与上海市共建的全国重点大学。经过120多年的不懈努力&#xff0c;上海交…