ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)

文章大纲

一、课程介绍
二、整合淘淘商城ssm项目
三、Mybatis分页插件PageHelper使用
四、整合测试
五、项目源码与资料下载
六、参考文章

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)_第1张图片

一、课程介绍

一共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之后,新建一个数据库

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)_第2张图片

导入.sql文件
  在该文章的资料下载内容中找到taotao.sql文件,在数据库操作工具中选择数据库名,右键选择运转SQL文件

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)_第3张图片

  选择文件路径

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)_第4张图片

  导入数据成功

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)_第5张图片

3. 整合思路

3.1 持久层
  mybatis整合spring,通过spring管理SqlSessionFactory、mapper代理对象。需要mybatis和spring的整合包。

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)_第6张图片

3.2 业务逻辑层
  所有的实现类都放到spring容器中管理。由spring创建数据库连接池,并有spring管理实务。

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)_第7张图片

3.3 表现层
  Springmvc整合spring框架,由springmvc管理controller

4. 持久层整合实战

  在taotao-manager-web项目的资源文件下新建SqlMapConfig.xml配置文件

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)_第8张图片





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

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)_第9张图片



    
    
    

    
    
        
        
        
        
        
        
    

    
    

        
        

        
        

    

    
    

        
        

    


  在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配置文件

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)_第10张图片



    
    

  在taotao-manager-web项目的资源文件下新建applicationContext-trans.xml配置进行事务管理

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)_第11张图片



    
    
    
        
        
        
        
    
    
    
    
        
            
            
            
            
            
            
            
            
            
            
        
    
    
    
    
        
    

6. 表现层整合实战

  在taotao-manager-web项目的资源文件下新建Springmvc.xml配置文件

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)_第12张图片



    
    
    
        
        
    

  在taotao-manager-web项目的web.xml中添加以下内容



    taotao-manager-web
    
        login.html
    
    
    
        contextConfigLocation
        classpath:spring/applicationContext*.xml
    
    
        org.springframework.web.context.ContextLoaderListener
    

    
    
        CharacterEncodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            utf-8
        
        
    
    
        CharacterEncodingFilter
        /*
    


    
    
        taotao-manager
        org.springframework.web.servlet.DispatcherServlet
        
        
            contextConfigLocation
            classpath:spring/springmvc.xml
        
        1
    
    
        taotao-manager
        /
    

7. 整合静态页面

  在文章的资料下载内容中,将css、jsp、js等资源拷贝到taotao-manager-web项目中

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)_第13张图片

  由于在web.xml中定义的url拦截形式为“/”表示拦截所有的url请求,包括静态资源例如css、js等。所以需要在springmvc.xml中添加资源映射标签:

    
    

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


    
        
            
                src/main/java
                
                    **/*.properties
                    **/*.xml
                
                false
            
        
    

温馨提示:如果不添加此内容,在项目编译后,target文件夹中会漏掉mapper.xml文件内容,导致项目访问失败

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

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)_第14张图片

例如:
在applicationContext-service中配置:



会扫描@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相关依赖

       
            com.github.pagehelper
            pagehelper
        

1. SqlMapConfig.xml中配置插件


        


    
    
        
        
    


2. 代码中使用分页功能

设置分页信息

//获取第1页,10条内容,默认查询总数count
    PageHelper.startPage(1, 10);

    //紧跟着的第一个select方法会被分页
List list = countryMapper.selectIf(1);

获取分页信息

//分页后,实际返回的结果list类型是Page,如果想取出分页信息,需要强制转换为Page,
Page listCountry = (Page)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 list = mapper.selectByExample(example);
        //取商品列表
        for (TbItem tbItem : list) {
            System.out.println(tbItem.getTitle());
        }
        //取分页信息
        PageInfo 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 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);
}



  
    
    
    
    
    
    
    
    
    
    
    
  
  
    
      
        
          
            
              
                
                  and ${criterion.condition}
                
                
                  and ${criterion.condition} #{criterion.value}
                
                
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                
                
                  and ${criterion.condition}
                  
                    #{listItem}
                  
                
              
            
          
        
      
    
  
  
    
      
        
          
            
              
                
                  and ${criterion.condition}
                
                
                  and ${criterion.condition} #{criterion.value}
                
                
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                
                
                  and ${criterion.condition}
                  
                    #{listItem}
                  
                
              
            
          
        
      
    
  
  
    id, title, sell_point, price, num, barcode, image, cid, status, created, updated
  
  
  
  
    delete from tb_item
    where id = #{id,jdbcType=BIGINT}
  
  
    delete from tb_item
    
      
    
  
  
    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 into tb_item
    
      
        id,
      
      
        title,
      
      
        sell_point,
      
      
        price,
      
      
        num,
      
      
        barcode,
      
      
        image,
      
      
        cid,
      
      
        status,
      
      
        created,
      
      
        updated,
      
    
    
      
        #{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},
      
    
  
  
  
    update tb_item
    
      
        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},
      
    
    
      
    
  
  
    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}
    
      
    
  
  
    update tb_item
    
      
        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 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}
  

温馨提示:
该项目很多的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 list = itemMapper.selectByExample(example);
        //取total
        PageInfo pageInfo = new PageInfo(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进行运行。

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)_第15张图片

项目启动完成

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)_第16张图片

在浏览器中输入localhost:8080,即可看到以下内容

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)_第17张图片

6. 总结

  在淘淘商城中,前端网页使用的都是jsp,但是在实际的项目中,我们更多的是使用前后端分离方式,所以我们只要能将项目运行起来,然后将我们的重点放在后端技术实现上即可。

五、项目源码与资料下载

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

六、参考文章

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

你可能感兴趣的:(ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创))