项目介绍+SSM环境搭建

1.项目功能/界面

  • SSM整合项目界面:使用Vue完成
  • 技术栈:前后端分离开发,前端框架Vue3+后端框架SSM
    1. 前端框架-Vue3
    2. 后端框架-SSM(SpringMVC+Spring+MyBatis)
    3. 数据库-MySQL
    4. 项目依赖管理-Maven
    5. 分页-pagehelper
    6. 逆向工程-MyBatis Generator
    7. 其他...

2.项目基础环境搭建

2.1创建项目

(1)创建maven项目(注意配置maven的仓库镜像,不然创建的时候会很慢),File--New--Project--Maven




(2)手动创建java和test相关目录

(3)pom.xml文件中引入项目基本的jar包

<!--部分-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency> <!--引入SpringMVC,也会自动导入spring的库-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.8</version>
</dependency> <!--引入spring-jdbc,支持事务相关-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.8</version>
</dependency> <!--引入spring aspect-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.8</version>
</dependency> <!--引入mybatis库-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency> <!--引入druid数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency> <!--mysql的驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
</dependencies>

(4)给项目配置Tomcat


(5)启动tomcat,测试成功

2.2项目全局配置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>
<!--(1)配置启动Spring容器:主要配置和业务逻辑相关的,比如数据源,事务控制等-->
<context-param>
<param-name>contextConfigLocation</param-name>
<!--指定文件位置-->
<param-value>classpath:applictionContext.xml</param-value>
</context-param> <!--(2)ContextLoaderListener 监听器,它的作用:
1.当启动web容器时,自动装配 applictionContext的配置信息
2.它实现了ServletContextListener 接口,
启动容器时,ContextLoaderListener自动会读取名为“contextConfigLocation”的参数配置
-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <!--(3)配置SpringMVC的前端控制器,拦截所有的请求
因为这里没有指定SpringMVC的配置文件,这里就会按照servlet-name-servlet.xml的方式来获取
-->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--3.1如果我们没有配置contextConfigLocation,
就默认按照默认机制/WEB-INF/springDispatcherServlet-servlet.xml去找-->
<!--3.2在web项目启动时,就自动地加载DispatcherServlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> <!--(4)配置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>
<!--过滤器会执行request.setCharacterEncoding(encoding)-->
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!--过滤器会执行response.setCharacterEncoding(encoding)-->
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!--(5)配置HiddenHttpMethodFilter,使用rest风格的url,
作用是把以post请求提交的delete和put请求进行转换-->
<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> </web-app>

如果web.xml的<web-app>报红,选择只是高亮syntax即可,本身是没有问题的,只是DTD本身的约束

2.3SpringMVC配置

WEB-INF 目录下创建SpringMVC的配置文件 springDispatcherServlet-servlet.xml

文件的命名要根据上面web.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"> <!--(1)配置自动扫描com.li.furn包-->
<context:component-scan base-package="com.li.furn">
<!--springmvc只扫描Controller-->
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan> <!--(2)配置默认视图解析器,指定页面返回-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置属性 suffix(后缀) 和 prefix(前缀)-->
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".html"/>
<property name="order" value="10"/>
</bean> <!--(3)加入两个常规配置-->
<!--支持SpringMVC的高级功能,比如:JSR303校验,映射动态请求-->
<mvc:annotation-driven/>
<!--将SpringMVC不能处理的请求,交给tomcat处理,比如css,js-->
<mvc:default-servlet-handler/>
</beans>

2.4配置Spring和MyBatis,并完成整合

(1)在resource目录下创建jdbc.properties,配置连接mysql的信息

# The key value is arbitrary
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/furn_ssm?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8
jdbc.user=root
jdbc.pwd=123456

(2)在pom.xml文件引入mybatis整合spring的适配包

<!--引入mybatis整合spring的适配包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>

(3)在resource目录下创建 Spring 的配置文件 applicationContext.xml

右键-->New-->XML Configuration-->Spring Config

<?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"
xmlns:aop="http://www.springframework.org/schema/aop"
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
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd"> <!--spring的配置文件:主要配置和业务逻辑有关的,比如数据源,事务控制等--> <!--(1)配置扫描com.li.furn包(控制器除外,它由springmvc管理)-->
<context:component-scan base-package="com.li.furn">
<!--排除扫描 @Controller注解-->
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan> <!--(2)配置数据源-->
<!--2.1引入外部的属性文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--2.2配置数据源对象-DataSource-->
<bean class="com.alibaba.druid.pool.DruidDataSource" id="pooledDataSource">
<!--给数据源对象配置属性值-->
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.pwd}"/>
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
</bean> <!--!!(3)配置spring和mybatis的整合
3.1在项目中要引入mybatis整合到spring的适配库 mybatis-spring-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
<!--指定mybatis的全局配置文件mybatis-config.xml-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!--指定数据源-->
<property name="dataSource" ref="pooledDataSource"/>
<!--指定mybatis的 mapper.xml文件的位置
我们在开发中通常把 mapper.xml放在类路径下 resource/mapper
所以这里指定的value是 classpath:mapper/*.xml-->
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean> <!--(4)配置扫描器,将mybatis接口的实现加入到ioc容器中-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--扫描所有的dao接口的实现,将入到ioc容器中,这里的dao接口就是mapper接口
(mapper接口放在com.li.furn.dao下,因为mybatis处于DAO层,用于操作数据库)-->
<property name="basePackage" value="com.li.furn.dao"/>
</bean> <!--(5)配置事务管理器对象-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
id="transactionManager">
<property name="dataSource" ref="pooledDataSource"/>
</bean> <!--(6)配置开启基于注解的事务(这里使用xml+切入表达式),并指定切入点-->
<!--6.1指定事务规则,即指定事务如何切入-->
<tx:advice id="txAdvice">
<tx:attributes>
<!--*代表所有方法都是事务方法-->
<tx:method name="*"/>
<!--以get开头的所有方法,我们认为是只读的,进行调优-->
<tx:method name="get*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!--6.2配置切入表表达式,引用上面的事务规则,即在匹配切入表达的方法中使用上述的事务规则-->
<aop:config>
<!--切入表达式-->
<aop:pointcut id="txPoint" expression="execution(* com.li.furn.service..*(..))"/>
<!--配置事务规则,使用上面的txAdvice,指定规则对txPoint进行切入-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
</aop:config> </beans>

(4)在resource目录下创建mapper目录,存放xxxMapper.xml文件

(5)在resource目录下创建mybatis的配置文件 mybatis-config.xml(原因和上面一致,因为在spring配置文件中指定了路径)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--暂时为空-->
</configuration>

2.5创建表,使用逆向工程生成Bean、XxMapper和XxMapper.xml

(1)创建数据库和表

-- 创建数据库
CREATE DATABASE furn_ssm;
USE furn_ssm;
-- 创建家居表
CREATE TABLE furn(
`id` INT(11) PRIMARY KEY AUTO_INCREMENT, #id
`name` VARCHAR(64) NOT NULL, #家居名
`maker` VARCHAR(64) NOT NULL, #厂商
`price` DECIMAL(11,2) NOT NULL, #价格
`sales` INT(11) NOT NULL, #销量
`stock` INT(11) NOT NULL, #库存
`img_path` VARCHAR(256) NOT NULL #照片路径
);
-- 初始化家居数据
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '北欧风格小桌子' , '熊猫家居' , 180 , 666 , 7 , 'assets/images/product-image/6.jpg');
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '简约风格小椅子' , '熊猫家居' , 180 , 666 , 7 , 'assets/images/product-image/4.jpg');
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '典雅风格小台灯' , '蚂蚁家居' , 180 , 666 , 7 , 'assets/images/product-image/14.jpg');
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '温馨风格盆景架' , '蚂蚁家居' , 180 , 666 , 7 , 'assets/images/product-image/16.jpg'); SELECT * FROM furn;

(2)使用MyBatis Generator 逆向生成bean mapper接口和mapper.xml

如果逆向工程生成的代码不能满足需求,再自己编写

2.1)修改Mybatis-config.xml,增加typeAliases别名配置,配置日志输出

<configuration>
<!--配置mybatis自带的日志输出,查看原生的sql-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases>
<!--直接引入包,包下面的所有类名都可以作为别名使用-->
<package name="com.li.furn.bean"/>
</typeAliases>
</configuration>

2.2)在pom.xml引入MyBatis Generator包

<!--引入mybatis逆向工程的依赖包-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>

2.3)在项目目录下创建mbg.xml(mybatis generator),并参考文档进行配置

文档和模板:MyBatis Generator Core – MyBatis Generator XML Configuration File Reference

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3"> <!--生成没有注释的 bean-->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator> <!--配置数据库连接信息,按照你的实际情况配置-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/furn_ssm?characterEncoding=utf8"
userId="root"
password="123456">
</jdbcConnection> <javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver> <!--指定Javabean生成的位置
targetPackage 是包名,targetProject是包所在的路径-->
<javaModelGenerator targetPackage="com.li.furn.bean"
targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator> <!--指定sql映射文件(xml文件)生成的位置-->
<sqlMapGenerator targetPackage="mapper" targetProject=".\src\main\resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator> <!--指定dao接口生成的位置,也就是mapper接口-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.li.furn.dao"
targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator> <!--指定要逆向生成的表和生成策略
tableName是数据库的表名,domainObjectName是生成的Javabean的类名-->
<table tableName="furn" domainObjectName="Furn"/>
</context>
</generatorConfiguration>

2.4)在test目录下创建一个MBGTest.java,该文件可以生成相关bean、mapper接口和mapper.xml

文件模板:MyBatis Generator Core – Running MyBatis Generator With Java

package com.li.furn.test;

import org.junit.Test;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback; import java.io.File;
import java.util.ArrayList;
import java.util.List; /**
* @author 李
* @version 1.0
*/
public class MBGTest {
@Test
public void generator() throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
//这里根据自己的情况指定配置的 mbg.xml文件
//如果下面这样访问,需要将文件放在项目目录下
File configFile = new File("mbg.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator =
new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}

运行上述方法后,可以看到成功生成了指定的文件:这样我们就可以直接使用逆向工程成功的方法操作数据库,而不必在接口和映射文件来回编写代码。

(3)使用Junit测试Spring和MyBatis是否整合成功,能否通过MyBatis添加furn到数据库

3.1)修改bean:Furn.java,分别添加全参和无参构造器(略)

3.2)在test目录下增加测试文件,测试逆向工程生成的方法是否可用。

@Test
public void insertSelective() {
//初始化spring容器
ApplicationContext ioc =
new ClassPathXmlApplicationContext("applicationContext.xml");
//获取到 FurnMapper的代理对象(类型=class com.sun.proxy.$Proxy17)
FurnMapper furnMapper = ioc.getBean(FurnMapper.class);
//添加数据
Furn furn = new Furn(null, "小电灯", "一等家居",
new BigDecimal(66), 123, 45,
"/assets/images/product-image/1.jpg");
int affected = furnMapper.insertSelective(furn);
System.out.println("操作影响行数=" + affected + ",操作成功!");
}

测试成功:

2.6注意事项和细节说明

关于逆向生成的方法中,insertSelective() 和 insert() 方法的区别:

  1. insertSelective-选择性保存数据

比如User中有三个字段:id,name,age,但是在插入数据时只设置了name字段:

User u = new User();
u.setName("张三")
insertSelective(u);

它在底层发出的sql语句为:insert into db_user (id,name) value (null,"张三");,也就是说生成的sql的字段是有选择性的,会根据你设置的值来生成(ps:这里的id是自增长的)

  1. insert 则是无论设置多少个字段,统一都要添加一遍,即使是一个。如:
User u = new User();
u.setName("张三")
insert(u);

底层生成的sql语句为:insert into db_user (id,name,age) value (null,'张三',null,null)

因此在使用insert方法时要注意,如果表的字段不允许为null,调用方法时又没有设置值,就会出错。通常情况下推荐使用 insertSelective() 方法。

day01-项目介绍+SSM环境搭建的更多相关文章

  1. Java开发学习心得(一):SSM环境搭建

    目录 Java开发学习心得(一):SSM环境搭建 1 SSM框架 1.1 Spring Framework 1.2 Spring MVC Java开发学习心得(一):SSM环境搭建 有一点.NET的开 ...

  2. Django 01 django基本介绍及环境搭建

    Django 01 django基本介绍及环境搭建 #http服务器 #用来接收用户请求,并将请求转发给web应用框架进行处理 #Web应用框架 #处理完请求后在发送给http服务器,http服务器在 ...

  3. [springboot 开发单体web shop] 1. 前言介绍和环境搭建

    前言介绍和环境搭建 简述 springboot 本身是为了做服务化用的,我们为什么要反其道使用它来开发一份单体web应用呢? 在我们现实的开发工作中,还有大量的业务系统使用的是单体应用,特别是对于中小 ...

  4. Maven介绍及环境搭建

    Maven介绍及环境搭建 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建.报告和文档的软件项目管理工具. 下载Maven boot:类加载器框架,Maven使用它加在自 ...

  5. 026 SSM综合练习02--数据后台管理系统--数据库表创建及SSM环境搭建

    1.数据库准备 本项目我们Oracle数据库,Oracle 为每个项目创建单独user,oracle数据表存放在表空间下,每个用户有独立表空间. (1)采用数据库管理员账号:SYSTEM,再配合数据库 ...

  6. Maven快速入门(一)Maven介绍及环境搭建

    做开发的程序员都知道,在系统开发需要各自各样的框架.工具.其中有一种工具不管你是初级程序员还是高级程序员都必须熟练掌握的,那就是项目管理工具(maven.ant.gradle).接下来就总结Maven ...

  7. Python介绍及环境搭建

    摘自http://www.cnblogs.com/sanzangTst/p/7278337.html Python零基础学习系列之二--Python介绍及环境搭建   1-1.Python简介: Py ...

  8. 本人亲测-SSM环境搭建(使用eclipse作为示例,过程挺全的,可作为参考)

    本人亲测-SSM环境搭建(使用eclipse作为示例,过程挺全的,可作为参考) 本人亲测-SSM环境搭建(使用eclipse作为示例,过程挺全的,可作为参考) 本人亲测-SSM环境搭建(使用eclip ...

  9. App自动化测试-1.App自动化介绍和环境搭建

    App自动化测试-1.App自动化介绍和环境搭建 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-b ...

  10. OpenDaylight开发hello-world项目之开发环境搭建

    OpenDaylight开发hello-world项目之开发环境搭建 OpenDaylight开发hello-world项目之开发工具安装 OpenDaylight开发hello-world项目之代码 ...

随机推荐

  1. ntp.conf详解

    linux系统的ntp.conf文件默认保存在/etc/ntp.conf 版本: [root@dsview ntpstats]# cat /etc/redhat-release CentOS rele ...

  2. ElasticSearch7.3学习(十六)----RestHighLevelClient Java api实现索引的创建、删除、是否存在、关闭、开启

    1.写在前面 注意:导入的包区别,不同的包创建索引的方式不同.博主亲身实践,具体体现在createIndexRequest.mapping()里面.读者可自行试验. import org.elasti ...

  3. MAC使用XQuartz调用图形界面

    DBA经常遇到需要调用图形的操作,通常Windows用户习惯使用Xmanager这类软件,MAC用户习惯使用XQuartz,之前版本系统会自带,现在需要自行下载. 比如在 https://www.xq ...

  4. list集合去重_谈谈Java中Set集合去重的原理

    导读:Java中Set接口是Collectio的子接口,Set集合不允许包含相同的元素.如果添加相同的元素, add()会返回FALSE, 新元素不会加入.Set集合常用于元素为数字.字符串去重等,但 ...

  5. [JVM]逃逸分析

    逃逸分析 JVM的内存分配策略 首先回顾一下JVM的内存分配策略. JVM的内存包括方法区.堆.虚拟机栈.本地方法栈.程序计数器.一般情况下JVM运行时的数据都是存在栈和堆上的.栈用来存放一些基本变量 ...

  6. 【译】使用.NET将WebAssembly扩展到云(一)

    原文 | Richard Lander 翻译 | 郑子铭 WebAssembly(Wasm)是一种令人兴奋的新虚拟机和(汇编)指令格式. Wasm 诞生于浏览器,是 Blazor 项目的重要组成部分. ...

  7. 深入 Nginx 之架构篇[转]

    前言 最近在读 Nginx 相关的书籍,做一下读书笔记. Nginx 作为业界知名的高性能服务器,被广泛的应用.它的高性能正是由于其优秀的架构设计,其架构主要包括这几点:模块化设计.事件驱动架构.请求 ...

  8. oracle 游标变量ref cursor详解

    一 介绍      像游标cursor一样,游标变量ref cursor指向指定查询结果集当前行.游标变量显得更加灵活因为其声明并不绑定指定查询. 其主要运用于PLSQL函数或存储过程以及其他编程语言 ...

  9. jenkins配置github秘钥

    1.登录github,打开Settings 2.点击Developer settings 3.点击Personal access tokens-->Generate new token 4.勾选 ...

  10. 【Android逆向】apk 反编译

    1. Kali搭建apktool环境 1. 访问apktool 官网https://ibotpeaches.github.io/Apktool/install/ 参考红圈里的步骤处理即可 2. 执行命 ...