ssm(Spring、Springmvc、Mybatis)實戰之淘淘商城-第二天(非原創)


文章大綱

一、課程介紹
二、整合淘淘商城ssm項目
三、Mybatis分頁插件PageHelper使用
四、整合測試
五、項目源碼與資料下載
六、參考文章

 

一、課程介紹

一共14天課程
(1)第一天:電商行業的背景。淘淘商城的介紹。搭建項目工程。Svn的使用。
(2)第二天:框架的整合。后台管理商品列表的實現。分頁插件。
(3)第三天:后台管理。商品添加。商品類目的選擇、圖片上傳、富文本編輯器的使用。
(4)第四天:商品規格的實現。
(5)第五天:商城前台系統的搭建。首頁商品分類的展示。Jsonp。
(6)第六天:cms系統的實現。前台大廣告位的展示。
(7)第七天:cms系統添加緩存。Redis。緩存同步。
(8)第八天:搜索功能的實現。使用solr實現搜索。
(9)第九天:商品詳情頁面的展示。
(10)第十天:單點登錄系統。Session共享。
(11)第十一天:購物車訂單系統的實現。
(12)第十二天:nginx。反向代理工具。
(13)第十三天:redis集群的搭建、solr集群的搭建。系統的部署。
(14)項目總結。

二、整合淘淘商城ssm項目

1. 后台所用技術

框架:Spring + SpringMVC + Mybatis
前端:EasyUI
數據庫:mysql

2. 數據庫操作

2.1 創建數據庫
  使用Navicat for MySQL工具,連接mysql之后,新建一個數據庫

 

導入.sql文件
  在該文章的資料下載內容中找到taotao.sql文件,在數據庫操作工具中選擇數據庫名,右鍵選擇運轉SQL文件

 

  選擇文件路徑

 

  導入數據成功

 

3. 整合思路

3.1 持久層
  mybatis整合spring,通過spring管理SqlSessionFactory、mapper代理對象。需要mybatis和spring的整合包。

 

3.2 業務邏輯層
  所有的實現類都放到spring容器中管理。由spring創建數據庫連接池,並有spring管理實務。

 

3.3 表現層
  Springmvc整合spring框架,由springmvc管理controller

 

4. 持久層整合實戰

  在taotao-manager-web項目的資源文件下新建SqlMapConfig.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> </configuration> 

  在taotao-manager-web項目的資源文件下新建applicationContext-dao.xml配置文件

 
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 數據庫連接池 --> <!-- 加載配置文件 --> <context:property-placeholder location="classpath:properties/*.properties"/> <!-- 數據庫連接池 使用的是阿里巴巴的,其他的也可以,只是這個比較高效--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <property name="driverClassName" value="${jdbc.driver}"/> <property name="maxActive" value="10"/> <property name="minIdle" value="5"/> </bean> <!-- 配置SqlsessionFactory 使用的是單例模式--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 加載mybatis的配置文件 --> <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"/> <!-- 配置數據源 --> <property name="dataSource" ref="dataSource"/> </bean> <!-- 配置包掃描器,掃描mapper接口生成代理對象放到spring容器中 basePackage 屬性是讓你為映射器接口文件設置基本的包路徑。 你可以使用分號或逗號 作為分隔符設置多於一個的包路徑。每個映射器將會在指定的包路徑中遞歸地被搜索到。 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 指定要掃描的包 --> <property name="basePackage" value="com.taotao.mapper"/> </bean> </beans> 

  在taotao-manager-web項目的資源文件下新建db.properties來管理Service實現類

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/taotao?characterEncoding=utf-8 jdbc.username=root jdbc.password=root 

溫馨提示:
  在上面的配置文件中,我們使用了阿里巴巴封裝的的數據庫連接池。Druid是目前最好的數據庫連接池,在功能、性能、擴展性方面,都超過其他數據庫連接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已經在阿里巴巴部署了超過600個應用,經過多年多生產環境大規模部署的嚴苛考驗。

5. 業務邏輯層整合

  在taotao-manager-web項目的資源文件下新建applicationContext-service.xml配置文件

 
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 配置包掃描器,掃描@Service主鍵的類 --> <context:component-scan base-package="com.taotao.service"/> </beans> 

  在taotao-manager-web項目的資源文件下新建applicationContext-trans.xml配置進行事務管理

 
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 事務配置 在一個業務的實現過程中,可能需要多條sql完成對數據庫的操作,比如賬戶登錄,需要匹配用戶名和密碼, 然后要增加積分,還要記錄登錄的ip和時間,這可能需要三個sql語句,這三個語句應當是一個整體, 任意一個sql執行不成功,都表示這個業務沒有執行完成,這就有了事務的概念。 事務具有同步的特點,一條sql執行失敗,其他sql都不會執行,即要么都執行,要么都不執行。 --> <!-- 配置事務管理組件 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 數據源 bcp是連接池組件(org.apache.commons.dbcp2.BasicDataSource)的bean --> <property name="dataSource" ref="dataSource" /> </bean> <!--配置切面行為 通知 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 傳播行為 事務傳播行為類型 說明 PROPAGATION_REQUIRED 如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。 PROPAGATION_SUPPORTS 支持當前事務,如果當前沒有事務,就以非事務方式執行。 PROPAGATION_MANDATORY 使用當前的事務,如果當前沒有事務,就拋出異常。 PROPAGATION_REQUIRES_NEW 新建事務,如果當前存在事務,把當前事務掛起。 PROPAGATION_NOT_SUPPORTED 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。 PROPAGATION_NEVER 以非事務方式執行,如果當前存在事務,則拋出異常。 PROPAGATION_NESTED 如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。 事務屬性中的readOnly標志表示對應的事務應該被最優化為只讀事務。 如果值為true就會告訴Spring我這個方法里面沒有insert或者update, 你只需要提供只讀的數據庫Connection就行了 這種執行效率會比read-write的Connection高,所以這是一個最優化提示。 在一些情況下,一些事務策略能夠起到顯著的最優化效果 --> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="create*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> <tx:method name="select*" propagation="SUPPORTS" read-only="true" /> <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice> <!-- 配置切面 切面 com.taotao.service下所有方法 --> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.taotao.service.*.*(..))" /> </aop:config> </beans> 

6. 表現層整合實戰

  在taotao-manager-web項目的資源文件下新建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:p="http://www.springframework.org/schema/p" 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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.taotao.controller" /> <mvc:annotation-driven /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> </beans> 

  在taotao-manager-web項目的web.xml中添加以下內容

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>taotao-manager-web</display-name> <welcome-file-list> <welcome-file>login.html</welcome-file> </welcome-file-list> <!-- 加載spring容器 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 解決post亂碼 --> <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> <!-- springmvc的前端控制器 --> <servlet> <servlet-name>taotao-manager</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- contextConfigLocation不是必須的, 如果不配置contextConfigLocation, springmvc的配置文件默認在:WEB-INF/servlet的name+"-servlet.xml" --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>taotao-manager</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> 

7. 整合靜態頁面

  在文章的資料下載內容中,將css、jsp、js等資源拷貝到taotao-manager-web項目中

 

  由於在web.xml中定義的url攔截形式為“/”表示攔截所有的url請求,包括靜態資源例如css、js等。所以需要在springmvc.xml中添加資源映射標簽:

    <mvc:resources location="/WEB-INF/js/" mapping="/js/**"/> <mvc:resources location="/WEB-INF/css/" mapping="/css/**"/> 

  在taotao-manager-mapper的pom文件下添加以下內容

<!-- 如果不添加此節點mybatis的mapper.xml文件都會被漏掉。 --> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build> 

溫馨提示:如果不添加此內容,在項目編譯后,target文件夾中會漏掉mapper.xml文件內容,導致項目訪問失敗

8. Springmvc和spring的父子容器關系

 

例如:
在applicationContext-service中配置:

<!-- 掃描包加載Service實現類 --> <context:component-scan base-package="com.taotao"></context:component-scan> 

會掃描@Controller、@Service、@Repository、@Compnent

Springmvc.Xml中不掃描。因為配置的是在spring容器中
結論:springmvc。不能提供服務,因為springmvc子容器中沒有controller對象。如果沒有spring容器,則可以把所有注解放在spring mvc容器中。為什么要用spring和spring mvc容器,是為了擴展性強。

三、Mybatis分頁插件PageHelper使用

  PageHelper目前支持Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六種數據庫分頁,使用前需要導入maven相關依賴

       <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> </dependency> 

1. SqlMapConfig.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> <plugins> <!-- com.github.pagehelper為PageHelper類所在包名 --> <plugin interceptor="com.github.pagehelper.PageHelper"> <!-- 設置數據庫類型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六種數據庫--> <property name="dialect" value="mysql"/> </plugin> </plugins> </configuration> 

2. 代碼中使用分頁功能

設置分頁信息

//獲取第1頁,10條內容,默認查詢總數count PageHelper.startPage(1, 10); //緊跟着的第一個select方法會被分頁 List<Country> list = countryMapper.selectIf(1); 

獲取分頁信息

//分頁后,實際返回的結果list類型是Page<E>,如果想取出分頁信息,需要強制轉換為Page<E>, Page<Country> listCountry = (Page<Country>)list; listCountry.getTotal(); 

分頁測試

public class TestPageHelper { @Test public void testPageHelper() { //創建一個spring容器 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml"); //從spring容器中獲得Mapper的代理對象 TbItemMapper mapper = applicationContext.getBean(TbItemMapper.class); //執行查詢,並分頁 TbItemExample example = new TbItemExample(); //分頁處理 PageHelper.startPage(2, 10); List<TbItem> list = mapper.selectByExample(example); //取商品列表 for (TbItem tbItem : list) { System.out.println(tbItem.getTitle()); } //取分頁信息 PageInfo<TbItem> pageInfo = new PageInfo<>(list); long total = pageInfo.getTotal(); System.out.println("共有商品:"+ total); } } 

四、整合測試

對應的jsp為:
item-list.jsp

請求的url:
/item/list
請求的參數:
page=1&rows=30
響應的json數據格式:
Easyui中datagrid控件要求的數據格式為:
{total:”2”,rows:[{“id”:”1”,”name”,”張三”},{“id”:”2”,”name”,”李四”}]}

1. 在taotao-common中創建EasyUIDataGridResult.java

package com.taotao.common.pojo;

import java.util.List; /** * 查詢商品列表的數據包裝 * * Easyui中datagrid控件要求的數據格式為: {total:”2”,rows:[{“id”:”1”,”name”,”張三”},{“id”:”2”,”name”,”李四”}]} */ public class EasyUIDataGridResult { private long total;//總的商品列表數量 滿足Easyui中datagrid控件要求 private List<?> rows;//每個列表的數據字段 public EasyUIDataGridResult(long total, List<?> rows) { this.total = total; this.rows = rows; } public long getTotal() { return total; } public void setTotal(long total) { this.total = total; } public List<?> getRows() { return rows; } public void setRows(List<?> rows) { this.rows = rows; } } 

2. 在taotao-manager-mapper項目中新建TbItemMapper.java和TbItemMapper.xml

package com.taotao.mapper; import com.taotao.pojo.TbItem; import com.taotao.pojo.TbItemExample; import java.util.List; import org.apache.ibatis.annotations.Param; public interface TbItemMapper { int countByExample(TbItemExample example); int deleteByExample(TbItemExample example); int deleteByPrimaryKey(Long id); int insert(TbItem record); int insertSelective(TbItem record); List<TbItem> selectByExample(TbItemExample example); TbItem selectByPrimaryKey(Long id); int updateByExampleSelective(@Param("record") TbItem record, @Param("example") TbItemExample example); int updateByExample(@Param("record") TbItem record, @Param("example") TbItemExample example); int updateByPrimaryKeySelective(TbItem record); int updateByPrimaryKey(TbItem record); } 
<?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.taotao.mapper.TbItemMapper" > <resultMap id="BaseResultMap" type="com.taotao.pojo.TbItem" > <id column="id" property="id" jdbcType="BIGINT" /> <result column="title" property="title" jdbcType="VARCHAR" /> <result column="sell_point" property="sellPoint" jdbcType="VARCHAR" /> <result column="price" property="price" jdbcType="BIGINT" /> <result column="num" property="num" jdbcType="INTEGER" /> <result column="barcode" property="barcode" jdbcType="VARCHAR" /> <result column="image" property="image" jdbcType="VARCHAR" /> <result column="cid" property="cid" jdbcType="BIGINT" /> <result column="status" property="status" jdbcType="TINYINT" /> <result column="created" property="created" jdbcType="TIMESTAMP" /> <result column="updated" property="updated" jdbcType="TIMESTAMP" /> </resultMap> <sql id="Example_Where_Clause" > <where > <foreach collection="oredCriteria" item="criteria" separator="or" > <if test="criteria.valid" > <trim prefix="(" suffix=")" prefixOverrides="and" > <foreach collection="criteria.criteria" item="criterion" > <choose > <when test="criterion.noValue" > and ${criterion.condition} </when> <when test="criterion.singleValue" > and ${criterion.condition} #{criterion.value} </when> <when test="criterion.betweenValue" > and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} </when> <when test="criterion.listValue" > and ${criterion.condition} <foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," > #{listItem} </foreach> </when> </choose> </foreach> </trim> </if> </foreach> </where> </sql> <sql id="Update_By_Example_Where_Clause" > <where > <foreach collection="example.oredCriteria" item="criteria" separator="or" > <if test="criteria.valid" > <trim prefix="(" suffix=")" prefixOverrides="and" > <foreach collection="criteria.criteria" item="criterion" > <choose > <when test="criterion.noValue" > and ${criterion.condition} </when> <when test="criterion.singleValue" > and ${criterion.condition} #{criterion.value} </when> <when test="criterion.betweenValue" > and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} </when> <when test="criterion.listValue" > and ${criterion.condition} <foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," > #{listItem} </foreach> </when> </choose> </foreach> </trim> </if> </foreach> </where> </sql> <sql id="Base_Column_List" > id, title, sell_point, price, num, barcode, image, cid, status, created, updated </sql> <select id="selectByExample" resultMap="BaseResultMap" parameterType="com.taotao.pojo.TbItemExample" > select <if test="distinct" > distinct </if> <include refid="Base_Column_List" /> from tb_item <if test="_parameter != null" > <include refid="Example_Where_Clause" /> </if> <if test="orderByClause != null" > order by ${orderByClause} </if> </select> <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" > select <include refid="Base_Column_List" /> from tb_item where id = #{id,jdbcType=BIGINT} </select> <delete id="deleteByPrimaryKey" parameterType="java.lang.Long" > delete from tb_item where id = #{id,jdbcType=BIGINT} </delete> <delete id="deleteByExample" parameterType="com.taotao.pojo.TbItemExample" > delete from tb_item <if test="_parameter != null" > <include refid="Example_Where_Clause" /> </if> </delete> <insert id="insert" parameterType="com.taotao.pojo.TbItem" > insert into tb_item (id, title, sell_point, price, num, barcode, image, cid, status, created, updated) values (#{id,jdbcType=BIGINT}, #{title,jdbcType=VARCHAR}, #{sellPoint,jdbcType=VARCHAR}, #{price,jdbcType=BIGINT}, #{num,jdbcType=INTEGER}, #{barcode,jdbcType=VARCHAR}, #{image,jdbcType=VARCHAR}, #{cid,jdbcType=BIGINT}, #{status,jdbcType=TINYINT}, #{created,jdbcType=TIMESTAMP}, #{updated,jdbcType=TIMESTAMP}) </insert> <insert id="insertSelective" parameterType="com.taotao.pojo.TbItem" > insert into tb_item <trim prefix="(" suffix=")" suffixOverrides="," > <if test="id != null" > id, </if> <if test="title != null" > title, </if> <if test="sellPoint != null" > sell_point, </if> <if test="price != null" > price, </if> <if test="num != null" > num, </if> <if test="barcode != null" > barcode, </if> <if test="image != null" > image, </if> <if test="cid != null" > cid, </if> <if test="status != null" > status, </if> <if test="created != null" > created, </if> <if test="updated != null" > updated, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides="," > <if test="id != null" > #{id,jdbcType=BIGINT}, </if> <if test="title != null" > #{title,jdbcType=VARCHAR}, </if> <if test="sellPoint != null" > #{sellPoint,jdbcType=VARCHAR}, </if> <if test="price != null" > #{price,jdbcType=BIGINT}, </if> <if test="num != null" > #{num,jdbcType=INTEGER}, </if> <if test="barcode != null" > #{barcode,jdbcType=VARCHAR}, </if> <if test="image != null" > #{image,jdbcType=VARCHAR}, </if> <if test="cid != null" > #{cid,jdbcType=BIGINT}, </if> <if test="status != null" > #{status,jdbcType=TINYINT}, </if> <if test="created != null" > #{created,jdbcType=TIMESTAMP}, </if> <if test="updated != null" > #{updated,jdbcType=TIMESTAMP}, </if> </trim> </insert> <select id="countByExample" parameterType="com.taotao.pojo.TbItemExample" resultType="java.lang.Integer" > select count(*) from tb_item <if test="_parameter != null" > <include refid="Example_Where_Clause" /> </if> </select> <update id="updateByExampleSelective" parameterType="map" > update tb_item <set > <if test="record.id != null" > id = #{record.id,jdbcType=BIGINT}, </if> <if test="record.title != null" > title = #{record.title,jdbcType=VARCHAR}, </if> <if test="record.sellPoint != null" > sell_point = #{record.sellPoint,jdbcType=VARCHAR}, </if> <if test="record.price != null" > price = #{record.price,jdbcType=BIGINT}, </if> <if test="record.num != null" > num = #{record.num,jdbcType=INTEGER}, </if> <if test="record.barcode != null" > barcode = #{record.barcode,jdbcType=VARCHAR}, </if> <if test="record.image != null" > image = #{record.image,jdbcType=VARCHAR}, </if> <if test="record.cid != null" > cid = #{record.cid,jdbcType=BIGINT}, </if> <if test="record.status != null" > status = #{record.status,jdbcType=TINYINT}, </if> <if test="record.created != null" > created = #{record.created,jdbcType=TIMESTAMP}, </if> <if test="record.updated != null" > updated = #{record.updated,jdbcType=TIMESTAMP}, </if> </set> <if test="_parameter != null" > <include refid="Update_By_Example_Where_Clause" /> </if> </update> <update id="updateByExample" parameterType="map" > update tb_item set id = #{record.id,jdbcType=BIGINT}, title = #{record.title,jdbcType=VARCHAR}, sell_point = #{record.sellPoint,jdbcType=VARCHAR}, price = #{record.price,jdbcType=BIGINT}, num = #{record.num,jdbcType=INTEGER}, barcode = #{record.barcode,jdbcType=VARCHAR}, image = #{record.image,jdbcType=VARCHAR}, cid = #{record.cid,jdbcType=BIGINT}, status = #{record.status,jdbcType=TINYINT}, created = #{record.created,jdbcType=TIMESTAMP}, updated = #{record.updated,jdbcType=TIMESTAMP} <if test="_parameter != null" > <include refid="Update_By_Example_Where_Clause" /> </if> </update> <update id="updateByPrimaryKeySelective" parameterType="com.taotao.pojo.TbItem" > update tb_item <set > <if test="title != null" > title = #{title,jdbcType=VARCHAR}, </if> <if test="sellPoint != null" > sell_point = #{sellPoint,jdbcType=VARCHAR}, </if> <if test="price != null" > price = #{price,jdbcType=BIGINT}, </if> <if test="num != null" > num = #{num,jdbcType=INTEGER}, </if> <if test="barcode != null" > barcode = #{barcode,jdbcType=VARCHAR}, </if> <if test="image != null" > image = #{image,jdbcType=VARCHAR}, </if> <if test="cid != null" > cid = #{cid,jdbcType=BIGINT}, </if> <if test="status != null" > status = #{status,jdbcType=TINYINT}, </if> <if test="created != null" > created = #{created,jdbcType=TIMESTAMP}, </if> <if test="updated != null" > updated = #{updated,jdbcType=TIMESTAMP}, </if> </set> where id = #{id,jdbcType=BIGINT} </update> <update id="updateByPrimaryKey" parameterType="com.taotao.pojo.TbItem" > update tb_item set title = #{title,jdbcType=VARCHAR}, sell_point = #{sellPoint,jdbcType=VARCHAR}, price = #{price,jdbcType=BIGINT}, num = #{num,jdbcType=INTEGER}, barcode = #{barcode,jdbcType=VARCHAR}, image = #{image,jdbcType=VARCHAR}, cid = #{cid,jdbcType=BIGINT}, status = #{status,jdbcType=TINYINT}, created = #{created,jdbcType=TIMESTAMP}, updated = #{updated,jdbcType=TIMESTAMP} where id = #{id,jdbcType=BIGINT} </update> </mapper> 

溫馨提示:
該項目很多的mapper都是使用了mybatis的逆向工程生成的,但是在實際操作中,我們應該自己編寫,不依賴於工具

3. 在taotao-manager-service中創建ItemService.java和ItemServiceImpl.java

package com.taotao.service; import com.taotao.common.pojo.EasyUIDataGridResult; import com.taotao.common.pojo.TaotaoResult; import com.taotao.pojo.TbItem; import com.taotao.pojo.TbItemDesc; /** * 商品查詢(查詢單條記錄、查詢列表)、添加操作類 * * @author Administrator * */ public interface ItemService { /** * 根據商品id查詢商品具體內容 * * @param itemId 商品ID * * @return */ TbItem getItemById(long itemId); /** * 查詢商品列表 * * @param page 頁數 * * @param rows 每頁的數目 * @return */ EasyUIDataGridResult getItemList(int page, int rows); /** * 商品添加功能實現 * * @param item 商品詳細字段 * * @param itemDesc 商品描述 * * @param itemParams * @return */ TaotaoResult addItem(TbItem item, TbItemDesc itemDesc, String itemParams); } 
package com.taotao.service.impl; import java.util.Date; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.taotao.common.pojo.EasyUIDataGridResult; import com.taotao.common.pojo.TaotaoResult; import com.taotao.common.utils.ExceptionUtil; import com.taotao.common.utils.IDUtils; import com.taotao.mapper.TbItemDescMapper; import com.taotao.mapper.TbItemMapper; import com.taotao.mapper.TbItemParamItemMapper; import com.taotao.pojo.TbItem; import com.taotao.pojo.TbItemDesc; import com.taotao.pojo.TbItemExample; import com.taotao.pojo.TbItemExample.Criteria; import com.taotao.pojo.TbItemParamItem; import com.taotao.service.ItemService; /** * 商品查詢(查詢單條記錄、查詢列表)、添加操作類 * * @author Administrator * */ @Service public class ItemServiceImpl implements ItemService { @Autowired TbItemMapper itemMapper;//商品表操作 @Autowired TbItemDescMapper itemDescMapper;//商品描述表 分開的目的是為了提高查詢效率。 @Autowired private TbItemParamItemMapper itemParamItemMapper; @Override public TbItem getItemById(long itemId) { TbItem item = itemMapper.selectByPrimaryKey(itemId); return item; } /** * 查詢商品列表 * * @param page 頁數 * * @param rows 每頁的數目 * @return */ @Override public EasyUIDataGridResult getItemList(int page, int rows) { //分頁處理 PageHelper.startPage(page, rows); //執行查詢 TbItemExample example = new TbItemExample(); //添加條件 //Criteria criteria = example.createCriteria(); //criteria.andIdEqualTo(123l); List<TbItem> list = itemMapper.selectByExample(example); //取total PageInfo<TbItem> pageInfo = new PageInfo<TbItem>(list); long total = pageInfo.getTotal(); //創建返回值對象 EasyUIDataGridResult result = new EasyUIDataGridResult(total, list); return result; } /** * 添加商品 */ @Override public TaotaoResult addItem(TbItem item, TbItemDesc itemDesc, String itemParams) { try { //生成商品id //可以使用redis的自增長key,在沒有redis之前使用時間+隨機數策略生成 Long itemId = IDUtils.genItemId(); //補全不完整的字段 item.setId(itemId); item.setStatus((byte) 1); Date date = new Date(); item.setCreated(date); item.setUpdated(date); //把數據插入到商品表 itemMapper.insert(item); //添加商品描述 itemDesc.setItemId(itemId); itemDesc.setCreated(date); itemDesc.setUpdated(date); //把數據插入到商品描述表 itemDescMapper.insert(itemDesc); //把商品的規格參數插入到tb_item_param_item中 TbItemParamItem itemParamItem = new TbItemParamItem(); itemParamItem.setItemId(itemId); itemParamItem.setParamData(itemParams); itemParamItem.setCreated(date); itemParamItem.setUpdated(date); itemParamItemMapper.insert(itemParamItem); } catch (Exception e) { e.printStackTrace(); return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e)); } return TaotaoResult.ok(); } } 

4. 在taotao-manager-web中創建ItemController.java

@Controller @RequestMapping("/item") public class ItemController { @Autowired private ItemService itemService; @RequestMapping("/list") //設置相應的內容為json數據 @ResponseBody public EasyUIResult getItemlist(@RequestParam(defaultValue="1")Integer page, @RequestParam(defaultValue="30")Integer rows) throws Exception { //查詢商品列表 EasyUIResult result = itemService.getItemList(page, rows); return result; } } 

5. 運行項目

  在項目運行前,如果我們的taotao-parent和taotao-common項目代碼有更新時,要重新install到本地倉庫中,taotao-manager是聚合的父項目,且我們再taotao-manager-web中使用了maven內置的tomcat,所以我們運行聚合項目可以直接運行taotao-manager,maven會自動識別pom、jar、war類型項目,之后完成項目啟動,如果使用的是本地tomcat,也可以直接將編譯的taotao-manager-web.war包放入tomcat進行運行。

 

項目啟動完成

 

在瀏覽器中輸入localhost:8080,即可看到以下內容

 

6. 總結

  在淘淘商城中,前端網頁使用的都是jsp,但是在實際的項目中,我們更多的是使用前后端分離方式,所以我們只要能將項目運行起來,然后將我們的重點放在后端技術實現上即可。

五、項目源碼與資料下載

鏈接:https://pan.baidu.com/s/1VuRGe69_R4uqO-SRf2v-5w
提取碼:pr3f

六、參考文章

http://yun.itheima.com/course?hm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM