使用IntelliJ IDEA开发SpringMVC网站(三)数据库配置

news/2024/5/9 17:31:59/文章来源:https://blog.csdn.net/bat1992/article/details/70270517

六、数据库配置

      下面,就要通过一个简单的例子,来介绍SpringMVC如何集成Spring Data JPA(由 Hibernate JPA 提供),来进行强大的数据库访问,并通过本章节的讲解,更加深刻地认识Controller是如何进行请求处理的,相信看完这一章节,你就可以开始你的开发工作了。

准备工作:

    在src\main\java中新建两个包:com.gaussic.model、com.gaussic.repository,将在后面用上,如下图所示:

1、创建Mysql数据库

      本文的讲解使用Mysql数据库,如果使用其它数据库的读者,可以去网上参考其他的配置教程,在此不做太多的叙述。数据库是一个底层的东西,底层的细节对上层的抽象并没有太大的影响,因此,只要配置好数据库,本章的内容仍然是适用于所有数据库的(貌似如此)。

      假设我们现在要建立一个小小的博客系统,其数据库ER图如下所示(当然这只是一个小小的例子,真实的博客系统比这要复杂的多):

    新建一个数据库springdemo,在数据库中,有两张表:

    (1)用户表user:用户登录信息,主键id设为自增

    (2)博文表blog:储存用户发表的博文,主键id设为自增,其中有一个外键user_id链接到user表。

    详细表结构如下图所示:

使用MySQL Workbench添加外键流程:

注意:在添加外键时,应该根据需求设置,例如右边红框中的Foreign Key Options,默认在Delete时是NO ACTION,说明在删除一个用户时,如果数据库中存在该用户的文章,那么就无法删除该用户,也无法删除该用户的所有文章,而如果将该选项改为CASCADE,那么删除该用户,就会同时删除该用户所有的文章。通常后者是不太可取的,因为如果发生了删除用户的误操作,很有可能该用户的内容被连带删除,且不可逆,这也是实现真实系统时需要考虑的原因之一。

2、IntelliJ IDEA导入数据库

    对于此前所接触的一些常用的框架中,一张数据表往往对应一个Java Bean。在SpringMVC中,这个Java Bean相当于model。那么,这个类是否需要自己来写呢?不需要,利用IntelliJ IDEA可以帮我们自动的生成这些JavaBean。

    首先,右键项目,选择Add Framework Support:

下拉选择JavaEE Persistence,右边provider选择Hibernate:

注:这一部分有一点过时,更新的项目中直接把数据库的配置放在了mvc-dispatcher-servlet.xml中,但依然要做这一步的操作,为了这一步可以使用Persistence的工具。

关于新的配置,可以翻到博客底部。

    在这一步结束后,我们可以发现,在resources里面生成了persistence.xml配置文件,左边栏出现了一个Persistence标题(若没有请点击左下角那个灰框):

    persistemce.xml具体如下:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"><persistence-unit name="NewPersistenceUnit"><provider>org.hibernate.ejb.HibernatePersistence</provider><properties><property name="hibernate.connection.url" value=""/><property name="hibernate.connection.driver_class" value=""/><property name="hibernate.connection.username" value=""/><property name="hibernate.connection.password" value=""/><property name="hibernate.archive.autodetection" value="class"/><property name="hibernate.show_sql" value="true"/><property name="hibernate.format_sql" value="true"/><property name="hbm2ddl.auto" value="update"/></properties></persistence-unit>
</persistence>

    我们先不着急填写这个配置文件。点开左边栏的Persistence,显示如下图所示:

右键项目名,选择Generate Persistence Mapping,再选择By Database Schema:

出现如下界面,其主要需要配置的地方如下图红框所示:

    点击Choose Data Source右边的三个点选择数据源,在弹出的界面左上角选择“+”,选择Mysql:

在如下界面填写主机、端口号、数据库名、用户名、密码,如果驱动丢失点击下面的Download可以下载驱动,点击 Test Connection可以测试数据库是否连接成功:

    在以上界面配置完成后,点OK,第一次使用需要Setup Master Password:

    

    回到如下页面,package填写model包(1),勾选Prefer primitive type使用原始数据类型(2),勾选Show default relationships以显示所有数据库关系(3),再点击刷新按钮(4),将会找到数据库中的两个表,勾选两个数据表(5),再勾选Generate Column Defination以生成每一列的描述信息(6)。选中blog表然后点击“+”号按钮,添加外键关系(7)。

    点击OK后,在Database Schema Mapping中可以发现多出了两个关系,如图所示:

   再点击OK,稍后,打开model包,可以看到生成了两个Java Bean,在SpringMVC中称为两个实体,它们对应了数据库的两张表:

BlogEntity如下所示(注意把java.sql.Date改为java.util.Date):

package com.gaussic.model;import javax.persistence.*;
import java.util.Date;/*** Created by dzkan on 2016/3/8.*/
@Entity
@Table(name = "blog", schema = "springdemo", catalog = "")
public class BlogEntity {private int id;private String title;private String content;private Date pubDate;private UserEntity userByUserId;@Id@Column(name = "id", nullable = false)public int getId() {return id;}public void setId(int id) {this.id = id;}@Basic@Column(name = "title", nullable = false, length = 100)public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}@Basic@Column(name = "content", nullable = true, length = 255)public String getContent() {return content;}public void setContent(String content) {this.content = content;}@Basic@Column(name = "pub_date", nullable = false)public Date getPubDate() {return pubDate;}public void setPubDate(Date pubDate) {this.pubDate = pubDate;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;BlogEntity that = (BlogEntity) o;if (id != that.id) return false;if (title != null ? !title.equals(that.title) : that.title != nullreturn false;if (content != null ? !content.equals(that.content) : that.content != nullreturn false;if (pubDate != null ? !pubDate.equals(that.pubDate) : that.pubDate != nullreturn false;return true;}@Overridepublic int hashCode() {int result = id;result = 31 * result + (title != null ? title.hashCode() : 0);result = 31 * result + (content != null ? content.hashCode() : 0);result = 31 * result + (pubDate != null ? pubDate.hashCode() : 0);return result;}@ManyToOne@JoinColumn(name = "user_id", referencedColumnName = "id", nullable = false)public UserEntity getUserByUserId() {return userByUserId;}public void setUserByUserId(UserEntity userByUserId) {this.userByUserId = userByUserId;}
}

    再看UserEntity:

package com.gaussic.model;import javax.persistence.*;
import java.util.Collection;/*** Created by dzkan on 2016/3/8.*/
@Entity
@Table(name = "user", schema = "springdemo", catalog = "")
public class UserEntity {private int id;private String nickname;private String password;private String firstName;private String lastName;private Collection<BlogEntity> blogsById;@Id@Column(name = "id", nullable = false)public int getId() {return id;}public void setId(int id) {this.id = id;}@Basic@Column(name = "nickname", nullable = false, length = 45)public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}@Basic@Column(name = "password", nullable = false, length = 45)public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Basic@Column(name = "first_name", nullable = true, length = 45)public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}@Basic@Column(name = "last_name", nullable = true, length = 45)public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;UserEntity that = (UserEntity) o;if (id != that.id) return false;if (nickname != null ? !nickname.equals(that.nickname) : that.nickname != nullreturn false;if (password != null ? !password.equals(that.password) : that.password != nullreturn false;if (firstName != null ? !firstName.equals(that.firstName) : that.firstName != nullreturn false;if (lastName != null ? !lastName.equals(that.lastName) : that.lastName != nullreturn false;return true;}@Overridepublic int hashCode() {int result = id;result = 31 * result + (nickname != null ? nickname.hashCode() : 0);result = 31 * result + (password != null ? password.hashCode() : 0);result = 31 * result + (firstName != null ? firstName.hashCode() : 0);result = 31 * result + (lastName != null ? lastName.hashCode() : 0);return result;}@OneToMany(mappedBy = "userByUserId")public Collection<BlogEntity> getBlogsById() {return blogsById;}public void setBlogsById(Collection<BlogEntity> blogsById) {this.blogsById = blogsById;}
}

3、配置数据库

    既然数据库已经导入了,那么前期准备工作基本完成,还需要进行最终的配置。

    首先,打开mvc-dispatcher-servlet.xml,添加下列配置(如果某些地方报错,请选中并按Alt + Insert补全配置):

<!-- 表示JPA Repository所在的包 -->
<jpa:repositories base-package="com.gaussic.repository"/><!-- 链接到persistence.xml -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"><property name="persistenceUnitName" value="defaultPersistenceUnit"/>
</bean><!-- 事务管理 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean><!-- 开启事务管理注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

    讲解:

    (1) jpa:repositories:这一部分涉及到数据库的接口,将在后面详解;

    (2)entityManagerFactory:实体管理器工厂,读取persistence.xml配置;

    (3)transactionManager:事务管理器,利用entityManager进行事务管理;

    (4)tx:annotation-driven:打开事务管理器的注解驱动,可以使用注解的方法操纵数据库。

整体如下所示:

<?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"xmlns:jpa="http://www.springframework.org/schema/data/jpa"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!--指明 controller 所在包,并扫描其中的注解--><context:component-scan base-package="com.gaussic.controller"/><!-- 静态资源(js、image等)的访问 --><mvc:default-servlet-handler/><!-- 开启注解 --><mvc:annotation-driven/><!--ViewResolver 视图解析器--><!--用于支持Servlet、JSP视图解析--><bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/><property name="prefix" value="/WEB-INF/pages/"/><property name="suffix" value=".jsp"/></bean><!-- 表示JPA Repository所在的包 --><jpa:repositories base-package="com.gaussic.repository"/><!-- 链接到persistence.xml --><bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"><property name="persistenceUnitName" value="defaultPersistenceUnit"/></bean><!-- 事务管理 --><bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="entityManagerFactory"/></bean><!-- 开启事务管理注解 --><tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

    下面,填充persistence.xml,将persistence-unit的name改为 defaultPersistenceUnit。在下面的文件中,我添加了一些更为详细的配置:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"><persistence-unit name="defaultPersistenceUnit"  transaction-type="RESOURCE_LOCAL"><provider>org.hibernate.ejb.HibernatePersistence</provider><properties><!-- 使用MySQL方言 --><property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/><!-- 数据库连接的URL地址 --><property name="hibernate.connection.url"value="jdbc:mysql://localhost:3306/springdemo"/><!-- 数据库连接的驱动 --><property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/><!-- 数据库连接的用户名 --><property name="hibernate.connection.username" value="root"/><!-- 数据库连接的密码 --><property name="hibernate.connection.password" value="111111"/><!-- 显示SQL语句 --><property name="hibernate.show_sql" value="true"/><property name="hibernate.connection.useUnicode" value="true"/><property name="hibernate.connection.characterEncoding" value="UTF-8"/><!-- 在显示SQL语句时格式化语句 --><property name="hibernate.format_sql" value="true"/><property name="hibernate.use_sql_comments" value="false"/><!-- 自动输出schema创建DDL语句 --><property name="hibernate.hbm2ddl.auto" value="update"/><!-- 数据库连接超时后自动重连 --><property name="hibernate.connection.autoReconnect" value="true"/><property name="connection.autoReconnectForPools" value="true"/><property name="connection.is-connection-validation-required" value="true"/></properties></persistence-unit>
</persistence>

    现在,重新启动tomcat,如果没有报错,说明数据库已经配置完成了,接下来就要讲解数据库的相关开发工作。

 

更新:

      阅读评论发现许多同学的persistence.xml出现了问题,因为出现问题的原因可能有很多,如果没有完全的报错以及代码的话,我这边很难解决问题,一个办法就是在GitHub Issues上面提问并贴出代码,我这边尽量解答。另一个办法就是下载最新的代码运行看有没有什么问题。

       最后一个办法,尝试另外一种配置方法,无需persistence.xml,直接在mvc-dispatcher-servlet.xml中配置数据库,如下所示:

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><property name="persistenceUnitName" value="defaultPersistenceUnit"/><property name="packagesToScan" value="com.gaussic.model" /><property name="jpaVendorAdapter"><bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/></property><property name="jpaProperties"><props><prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop><prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/springdemo?useSSL=false</prop><prop key="hibernate.connection.username">root</prop><prop key="hibernate.connection.password">111111</prop><prop key="hibernate.show_sql">false</prop><prop key="hibernate.connection.useUnicode">true</prop><prop key="hibernate.connection.characterEncoding">UTF-8</prop><prop key="hibernate.format_sql">true</prop><prop key="hibernate.use_sql_comments">true</prop><prop key="hibernate.hbm2ddl.auto">update</prop><prop key="hibernate.connection.autoReconnect">true</prop><prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop><prop key="connection.autoReconnectForPools">true</prop><prop key="connection.is-connection-validation-required">true</prop><prop key="hibernate.c3p0.validate">true</prop><prop key="hibernate.connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</prop><prop key="hibernate.c3p0.min_size">5</prop><prop key="hibernate.c3p0.max_size">600</prop><prop key="hibernate.c3p0.timeout">1800</prop><prop key="hibernate.c3p0.max_statements">50</prop><prop key="hibernate.c3p0.preferredTestQuery">SELECT 1;</prop><prop key="hibernate.c3p0.testConnectionOnCheckout">true</prop><prop key="hibernate.c3p0.idle_test_period">3000</prop></props></property></bean>

          删除persistence.xml,直接修改entityManagerFactory bean为如上图所示。这个方法可以摆脱persistence.xml的困扰,但是有一个小小的问题,如果之前没有添加Java EE Persistence这个框架的,文中的Persistence工具栏将不会显示。一个解决办法就是,先修改mvc-dispatcher-servlet,然后再添加Java EE Persistence框架,等能够看到Persistence工具栏后,删除persistence.xml,余下的步骤可以继续操作。

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

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

相关文章

使用IntelliJ IDEA开发SpringMVC网站(四)用户管理

七、用户管理 既然我们要做一个博客管理系统&#xff0c;当然要首先实现我们的用户管理。在上一文中&#xff0c;我们已经配置好了数据库。接下来&#xff0c;就要实现网站的一些业务逻辑。 1、JPA操作定义 在实现用户管理操作之前&#xff0c;需要讲解一下JPA的开发工作。 首先…

个人网站搭建保姆级教学:Hexo + Kaze + Gitee Pages

前 言 建网站本身是一个很大的工程&#xff0c;涉及前端页面的搭建&#xff0c;网站数据的存储&#xff0c;还要购置服务器资源&#xff0c;甚至是后期的维护&#xff0c;过程相当繁琐。 不过如果仅仅是想搭建个人的网站&#xff0c;写写博客&#xff0c;想要美观&#xff0c…

搭建 Drupal 个人网站的图文教学

操作场景 Drupal 是使用 PHP 语言编写的开源内容管理框架&#xff08;CMF&#xff09;&#xff0c;由内容管理系统&#xff08;CMS&#xff09;及 PHP 开发框架&#xff08;Framework&#xff09;共同构成。Drupal 具备强大的定制化开发能力&#xff0c;您可使用 Drupal 作为个…

云服务器,网站域名没有备案为啥就无法访问呢?

不是阿里云的要备案&#xff0c;而且只要是服务器在国内的&#xff0c;就都要备案才可以正常使用的哦&#xff01; 下面咱们逐个解答题主的问题&#xff1a; 1、备案指的是域名备案还是ip备案还是阿里云租的服务器备案&#xff1f; 备案指的是域名的备案&#xff0c;因为备案…

利用爬虫爬取看看豆网站站的数据信息

其实很早我就开始关注爬虫技术&#xff0c;这两天特别学习了一下&#xff0c;并且做了一个简单的demo。爬取了看看豆网站的数据信息。总共11751本书&#xff0c;爬取了不到3个小时&#xff0c;基本每秒爬取1条。速度慢的原因主要是单线程&#xff0c;使用mysql数据库。想要提高…

利用爬虫爬取 zol网站热门手机

使用了20几分钟&#xff0c;爬取了zol相关的热门手机型号、特点、价格、上市时间、屏幕大小相关信息。对最新的热门手机做了一个简单的统计。如果你想知道任何其他的信息&#xff0c;可以给我留言。我已经把我的相关代码传导了github上。欢迎下载。另附其中还有关于LOL英雄数据…

又拍网架构-又一个用到PYTHON的网站

又拍网是一个照片分享社区&#xff0c;从2005年6月至今积累了260万用户&#xff0c;1.1亿张照片&#xff0c;目前的日访问量为200多万。5年的发展历程里经历过许多起伏&#xff0c;也积累了一些经验&#xff0c;在这篇文章会介绍一些在技术上的积累。 又拍网和大多数Web2.0站点…

web网站搜索框的搜索实现

js 添加一个按钮 &#xff0c;给按钮&#xff0c;添加&#xff0c;onclick事件"aiqiyi()" function aiqiyi(){ var t获取搜索框值&#xff1b; window.location.href"http://so.iqiyi.com/so/q_"t; http://so.iqiyi.com/so/q_ 是爱奇艺的搜索&#xff…

IIS+php环境下TinkPHP5的网站配置总结(萌新亲测)

环境介绍 Win7;我用的是ThinkPHP5.0框架&#xff1b;phpStudy2008集成环境&#xff0c;它会集成php5.2到7.2的所有版本&#xff0c;所以免去了安装php的步骤。一开始我在本地用的是Apachephp环境运行的网站&#xff0c;这是没有任何问题的&#xff0c;但是服务器的环境是IISph…

六款堪称神器的网站

导读网站是通往互联网世界的一大工具&#xff0c;在这片信息的海洋上&#xff0c;总有那么几款产品&#xff0c;如海岛般骄傲伫立&#xff0c;带给人不一样的感觉。当然&#xff0c;本文的标题是有失公允的&#xff0c;世界是优秀的产品不计其数&#xff0c;要分类罗列出来简直…

APP设计与网站着陆页设计

APP设计 可用性的四要素 o 功能性&#xff1a;这个产品能够正常工作吗&#xff1f; o 可学习性&#xff1a;这个产品在不经过额外学习的情况下能够顺利使用吗&#xff1f; o 灵活性&#xff1a;除了完成主要的任务之外&#xff0c;这个产品能做更多的事情吗&#xff1…

win2012 服务器IIS 8.0 搭建FTP,VS2015发布网站(一)FTP设置

沉寂了段时间&#xff0c;想明白了一些事情&#xff0c;现在准备学学asp.net5当前微软的主流mvc5开发网站 现在想用nopcommerce 搭建商城&#xff0c;作为业余时间的爱好玩玩 首先&#xff0c;打开服务器管理器&#xff0c;点击添加角色和功能 web服务器IIS里面这些选项打勾 然…

win2012 服务器IIS 8.0 搭建FTP,VS2015发布网站(二)Visual Studio发布网站

书接上文&#xff0c;右键项目&#xff0c;点击发布 发布web里面&#xff0c;点击 自定义 输入配置文件名称 发布方法-选择FTP 服务器-填写ftp://ftp服务器地址:端口&#xff0c;例子:ftp://baidu.com:21端口号一定要加 站点路径-如果ftp的根路径是/&#xff0c;网站绝对路径…

python爬取前程无忧招聘网站数据搭建Hadoop、Flume、Kafka、Spark用Hive做数据分析Sqoop存储到Mysql并实现可视化

文章目录 一、项目总体要求二、环境搭建1、安装包准备2、安装jdk&#xff08;1&#xff09;查询是否安装java&#xff08;2&#xff09;卸载jdk&#xff08;3&#xff09;安装jdk&#xff08;4&#xff09;配置jdk环境变量 3、配置ssh免密登录&#xff08;1&#xff09;进入到我…

爬取我爱我家网站二手房信息

items文件定义爬取数据&#xff1a; apartment scrapy.Field() total_price scrapy.Field() agent scrapy.Field() image_urls scrapy.Field() images scrapy.Field()spider文件&#xff1a; # -*- coding: utf-8 -*- import scrapy from pachong2.items import Pachong…

使用httpwebrequest发送数据到网站

怎样通过HttpWebRequest 发送 POST 请求到一个网页服务器&#xff1f;例如编写个程序实现自动用户登录&#xff0c;自动提交表单数据到网站等。 假如某个页面有个如下的表单&#xff08;Form&#xff09;&#xff1a; <form name"form1" action" http://www.…

大型电子商务网站架构

大型电子商务网站架构 (转自&#xff1a;http://www.cnblogs.com/skydau/archive/2009/08/30/1556701.html) 7.同一个网站的多语言该如何处理是好,使用配置文件然后cookie或url来判别?客户是自己公司&#xff0c;使用标准方法即可 8.电子商务网站最多的就是 商品的打折方式和…

小型电子商务网站设计原则

最近谈得最多的话题莫过于大规模&#xff0c;大数据量&#xff0c;高性能&#xff0c;高并发等架构话题&#xff0c;其实一个电子商务网站开始时一定是小规模&#xff0c;小数据量&#xff0c;用不着把架构弄得过于复杂。高度设计、过度扩展(高德纳大爷也说过&#xff0c;"…

正确地定制您的网站 ndash; 文件替代机制,zencart

很多用户对zen cart做了自己的修改&#xff0c;非常好&#xff01;但同时&#xff0c;一些用户修改了很多重要的文件&#xff0c;例如&#xff1a; /includes/filenames.php /includes/languages/schinese.php /includes/languages/schinese/*.php 等等… 友情提示&#xff…

网站集成支付宝

&#xff08;本文转载于http://stephen830.javaeye.com/blog/254827 ) 国内电子商务系统实现的基本流程如下&#xff1a; 客户在系统内下订单 -> 系统根据订单生成支付宝接口url -> 客户通过url使用支付宝&#xff08;网上银行&#xff09;付款 -> 支付宝将客户的付款…