系統整體設計
系統功能模塊劃分
系統用到的數據表設計如下,首先head_line用於儲存頭條顯示的信息。shop是店鋪表,area爲其所屬區域表,shop_category爲商店類別表。product爲商品表,product_category爲商品類別表,product_img爲商品圖片信息表。person_info爲用戶信息表,wechat_account爲微信賬戶表,local_account爲本地賬戶表。
創建實體類
首先需要在數據庫中創建以上的表,例如部分表的設計如下
然後利用IDEA的JPA接口可以實現自動創建相應地Java類,如下所示,首先在Project Structure中點擊“+”選擇JPA,然後選擇provider爲Hibernate之後就會在左下角出現Persistence的圖標,選擇創建By data schema,然後選擇類生成的包、導入的數據表即可自動生成一個類,並且自動生成類的get/set方法。
package com.tory.shop.entity;
import java.util.Date;
public class Shop {
private Integer shopId;
private String shopName;
private String shopDescribe;
private String shopAddr;
private String shopImg;
private String shopPhone;
private Date createTime;
private Date lastEditTime;
private Integer priority;
private Integer enableStatus; //店鋪狀態:-1、不可用,0、審覈中,1、可用
private String adviceMessage; //管理員給店鋪的提示信息
private Area area;
private PersonInfo owner;
private ShopCategory shopCategory;
public Integer getShopId() {
return shopId;
}
public void setShopId(Integer shopId) {
this.shopId = shopId;
}
public String getShopName() {
return shopName;
}
public void setShopName(String shopName) {
this.shopName = shopName;
}
public String getShopDescribe() {
return shopDescribe;
}
public void setShopDescribe(String shopDescribe) {
this.shopDescribe = shopDescribe;
}
public String getShopAddr() {
return shopAddr;
}
public void setShopAddr(String shopAddr) {
this.shopAddr = shopAddr;
}
public String getShopImg() {
return shopImg;
}
public void setShopImg(String shopImg) {
this.shopImg = shopImg;
}
public String getShopPhone() {
return shopPhone;
}
public void setShopPhone(String shopPhone) {
this.shopPhone = shopPhone;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getLastEditTime() {
return lastEditTime;
}
public void setLastEditTime(Date lastEditTime) {
this.lastEditTime = lastEditTime;
}
public Integer getPriority() {
return priority;
}
public void setPriority(Integer priority) {
this.priority = priority;
}
public Integer getEnableStatus() {
return enableStatus;
}
public void setEnableStatus(Integer enableStatus) {
this.enableStatus = enableStatus;
}
public String getAdviceMessage() {
return adviceMessage;
}
public void setAdviceMessage(String adviceMessage) {
this.adviceMessage = adviceMessage;
}
public Area getArea() {
return area;
}
public void setArea(Area area) {
this.area = area;
}
public PersonInfo getOwner() {
return owner;
}
public void setOwner(PersonInfo owner) {
this.owner = owner;
}
public ShopCategory getShopCategory() {
return shopCategory;
}
public void setShopCategory(ShopCategory shopCategory) {
this.shopCategory = shopCategory;
}
}
maven構建項目
創建Java工程項目如下所示。首先src/main/java目錄下存放主要的java文件,例如包括控制器類包controller、dao包、主要實體類entity、枚舉enums、攔截器interceptor、服務類service、工具類util的包。resources文件夾用於存放xml配置文件等資源。webapp爲web應用的文件夾,resources文件夾用於存放web頁面的靜態資源,WEB-INF存放頁面。test目錄爲測試文件的目錄,其中java和resources目錄與src/main下的相對應。
接着通過maven添加項目依賴。首先引入Java項目所需要的基本包:提供servlet服務的javax.servlet-api、提供json解析的jackson-databind、spring所需的Map工具類commons-collections、日誌輸出工具logback-classic包、測試模塊junit
接着引入8個Spring相關的包:核心工具類spring-core、bean管理類spring-beans、上下文管理類spring-context、數據庫訪問類spring-jdbc、事務管理類spring-tx、web開發相關類spring-web、MVC框架類spring-mvc、測試相關類spring-test。
最後引入數據庫交互相關的包:鏈接MySQL的mysql-connector-java、數據庫連接池c3p0、mybatis核心包mybatis、與spring交互的mybatis-spring
SSM框架配置
接着由下到上配置SSM框架的相關文件,首先在resources文件夾下新建數據庫連接配置文件jdbc.properties,在該文件中指定數據庫的連接驅動、url、用戶名和密碼
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/shop_demo
jdbc.username=root
jdbc.password=1234
接着對mybatis進行配置,如下所示爲mybatis-config.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!--設置控制檯輸出日誌-->
<setting name="logImpl" value="STDOUT_LOGGING" />
<!--獲取自增主鍵值-->
<setting name="useGeneratedKeys" value="true"/>
<!--查詢語句使用數據庫字段名-->
<setting name="useColumnLabel" value="true"/>
<!--開啓駝峯命名轉換-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
在往上來到了spring的DAO層,在spring-dao.xml文件中首先根據jdbc.properties文件創建c3p0類型的數據庫連接源dataSource,然後將該數據源注入並創建Mybatis的SqlSessionFactory對象,然後完成mybatis對Spring的DAO接口映射。
值得注意的是,在加載xml資源文件時需要在前面增加"classpath:",項目打包之後resource目錄下的文件會放到target/classes目錄下,因此需要從該路徑下加載。否則有時候IDEA的自動提示會找得到該文件,而且在測試代碼中可以正常運行,但是打包發佈項目就會報錯找不到.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"
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">
<!--引入jdbc.properties文件中配置的數據庫變量-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置c3p0數據庫連接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!--注入引入jdbc.properties文件中的數據庫變量-->
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!--對c3p0進行設置-->
<property name="maxPoolSize" value="30"/>
<property name="checkoutTimeout" value="10000"/>
<property name="autoCommitOnClose" value="false"/> <!--關閉連接後不自動提交-->
<property name="acquireRetryAttempts" value="2"/> <!--自動重連嘗試次數-->
</bean>
<!--配置Mybatis的SqlSessionFactory對象-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--注入數據源-->
<property name="dataSource" ref="dataSource"/>
<!--引入配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!--掃描數據庫實體的java類-->
<property name="typeAliasesPackage" value="com.tory.shop.entity"/>
<!--掃描實體對應的mapper文件-->
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<!--配置DAO接口注入到Spring容器-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--注入sqlSessionFactory對象名,注意是隻是名字,等到spring初始化完成後在創建對象-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!--掃描DAO類所在的包-->
<property name="basePackage" value="com.tory.shop.dao"/>
</bean>
</beans>
接着向上配置spring的服務層,如下所示爲spring-service.xml文件,在其中掃描service類並且開啓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"
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">
<!--掃描service包下所有的service類-->
<context:component-scan base-package="com.tory.shop.service"/>
<!-- 事務管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 開啓基於註解的事務管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
再往上配置spring的MVC管理模塊,如下所示爲spring-mvc.xml,在其中掃描所有的controller類,配置web的靜態資源目錄,並且定義視圖解析器
<?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 http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--開啓SpringMVC的註解模式-->
<mvc:annotation-driven/>
<!--掃描controller類-->
<context:component-scan base-package="com.tory.shop.controller"/>
<!-- 映射靜態資源目錄,將靜態資源交給default-servlet-handler處理 -->
<mvc:resources mapping="/resources/**" location="/resources"/>
<mvc:default-servlet-handler/>
<!--定義視圖解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/html/"/>
<property name="suffix" value=".html"/>
</bean>
</beans>
最後是總的web配置文件,如下所示爲web.xml文件,在其中註冊spring的DispatcherServlet並映射管理所有的路徑請求
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1" metadata-complete="true">
<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:spring/spring-*.xml</param-value>
</init-param>
</servlet>
<!--映射管理所有的路徑-->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
驗證測試
首先實現Area的Dao層來完成與數據庫的交互操作,創建AreaDao接口,由於使用Mybatis框架,所以該接口不需要實現
package com.tory.shop.dao;
import com.tory.shop.entity.Area;
import java.util.List;
public interface AreaDao {
List<Area> queryArea();
}
接着在resources/mapper下創建AreaDao對應的映射配置文件AreaDao.xml,並且實現queryArea方法的SQL語句
<?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.tory.shop.dao.AreaDao">
<select id="queryArea" resultType="com.tory.shop.entity.Area">
SELECT area_id,area_name,priority,create_time,last_edit_time
FROM tb_area ORDER BY priority
</select>
</mapper>
通過Service層調用Dao操作,如下所示爲AreaService接口及其實現類AreaServiceImpl
package com.tory.shop.service;
import com.tory.shop.entity.Area;
import java.util.List;
public interface AreaService {
List<Area> getAreaList();
}
package com.tory.shop.service.impl;
import com.tory.shop.dao.AreaDao;
import com.tory.shop.entity.Area;
import com.tory.shop.service.AreaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service //添加註解才能被Spring的Bean管理髮現
public class AreaServiceImpl implements AreaService {
@Autowired
private AreaDao areaDao;
public List<Area> getAreaList() {
return areaDao.queryArea();
}
}
最後在Controller層定義對特定請求路徑的響應方法,通過調用AreaService獲得數據列表並以Json的形式返回給客戶
package com.tory.shop.controller.superadmin;
import com.tory.shop.entity.Area;
import com.tory.shop.service.AreaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
@RequestMapping("/area") //類的路由映射
public class AreaController {
@Autowired
private AreaService areaService;
@RequestMapping("/list") //方法的路由映射
@ResponseBody //返回Json格式的數據
public List<Area> getList(){
return areaService.getAreaList();
}
}
在瀏覽器中訪問上述路徑,得到結果如下,證明SSM框架運行成功並從數據庫中取得數據返回給客戶: