SpringBoot入门系列~Spring-Data-JPA基本增删改查功能实现

入门案例:实现商品的增删改查操作

1、修改属性配置文件为可读性较强有层次感的.yml文件:application.yml

 1 #配置项目访问路径和端口
 2 server:
 3   port: 8088
 4   context-path: /
 5 
 6 #自定义属性测试:注意冒号后面要加空格,不然无法编译通过会报错
 7 resMsg: 操作成功
 8 
 9 #spring-jpa-data数据库配置信息   org.springframework.boot.autoconfigure.jdbc.DataSourceProperties
10 spring:
11   jpa:
12     show-sql: true
13     hibernate:
14       ddl-auto: update
15   datasource:
16     driver-class-name: com.mysql.jdbc.Driver
17     url: jdbc:mysql://localhost:3306/spring-boot
18     username: root
19     password: admin1009

2、基于前一章节内容创建GoodsInfoBean实体生成数据库表结构

 1 package com.sun.spring.boot.pojo;
 2 
 3 import java.math.BigDecimal;
 4 
 5 import javax.persistence.Column;
 6 import javax.persistence.Entity;
 7 import javax.persistence.GeneratedValue;
 8 import javax.persistence.Id;
 9 import javax.persistence.Table;
10 
11 /**
12  * 商品基本信息实体
13 * @ClassName: GoodsInfoBean  
14 * @author sunt  
15 * @date 2017年11月8日 
16 * @version V1.0
17  */
18 @Entity
19 @Table(name = "T_GOODS")
20 public class GoodsInfoBean {
21 
22     /**
23      * 商品编码
24      */
25     @Id
26     @GeneratedValue
27     @Column(name = "F_GOODS_NUM")
28     private Integer goodsNum;
29     
30     /**
31      * 商品名称
32      */
33     @Column(name = "F_GOODS_NAME",length = 50,nullable = false)
34     private String goodsName;
35     
36     /**
37      * 商品价格
38      */
39     @Column(name = "F_GOODS_PRICE", precision = 12, scale = 2, nullable = false)
40     private BigDecimal goodsPrice;
41 
42     public Integer getGoodsNum() {
43         return goodsNum;
44     }
45 
46     public void setGoodsNum(Integer goodsNum) {
47         this.goodsNum = goodsNum;
48     }
49 
50     public String getGoodsName() {
51         return goodsName;
52     }
53 
54     public void setGoodsName(String goodsName) {
55         this.goodsName = goodsName;
56     }
57 
58     public BigDecimal getGoodsPrice() {
59         return goodsPrice;
60     }
61 
62     public void setGoodsPrice(BigDecimal goodsPrice) {
63         this.goodsPrice = goodsPrice;
64     }
65     
66 }

3、创建dao接口IGoodsInfoDao

集成jpa底层接口即可

 1 package com.sun.spring.boot.dao;
 2 
 3 import org.springframework.data.jpa.repository.JpaRepository;
 4 import org.springframework.stereotype.Repository;
 5 
 6 import com.sun.spring.boot.pojo.GoodsInfoBean;
 7 
 8 /**
 9  * 商品dao接口
10 * @ClassName: IGoodsInfoDao  
11 * @author sunt  
12 * @date 2017年11月8日 
13 * @version V1.0
14  */
15 @Repository
16 public interface IGoodsInfoDao extends JpaRepository<GoodsInfoBean, Integer>{
17 
18 }

4、创建services接口以及所需要的接口方法

 1 package com.sun.spring.boot.service;
 2 
 3 import java.util.List;
 4 
 5 import com.sun.spring.boot.pojo.GoodsInfoBean;
 6 
 7 /**
 8 * 商品基本信息业务接口 
 9 * @ClassName: IGoodsInfoService  
10 * @author sunt  
11 * @date 2017年11月8日 
12 * @version V1.0
13  */
14 public interface IGoodsInfoService {
15 
16     /**
17     * 商品列表查询
18     * @Title: queryGoodsList 
19     * @author sunt  
20     * @date 2017年11月8日
21     * @return List<GoodsInfoBean>
22      */
23     List<GoodsInfoBean> queryGoodsList();
24     
25     /**
26      * 添加商品
27     * @Title: saveGoods 
28     * @author sunt  
29     * @date 2017年11月9日
30     * @param bean
31     * @return void
32      */
33     void saveGoods(GoodsInfoBean bean);
34     
35     /**
36     * 通过商品编码查询商品信息
37     * @Title: queryGoodsByNum 
38     * @author sunt  
39     * @date 2017年11月9日
40     * @param goodsNum 商品编码
41     * @return GoodsInfoBean
42      */
43     GoodsInfoBean queryGoodsByNum(Integer goodsNum);
44     
45     /**
46      * 修改商品信息
47     * @Title: updateGoods 
48     * @author sunt  
49     * @date 2017年11月9日
50     * @param bean
51     * @return void
52      */
53     void updateGoods(GoodsInfoBean bean);
54     
55     /**
56      * 根据商品编码删除商品基本信息
57     * @Title: deleteGoodsByNum 
58     * @author sunt  
59     * @date 2017年11月9日
60     * @param goodsNum 商品编码
61     * @return void
62      */
63     void deleteGoodsByNum(Integer goodsNum);
64 }

5、service实现

 1 package com.sun.spring.boot.service.impl;
 2 
 3 import java.util.List;
 4 
 5 import org.apache.log4j.Logger;
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.stereotype.Service;
 8 
 9 import com.sun.spring.boot.dao.IGoodsInfoDao;
10 import com.sun.spring.boot.pojo.GoodsInfoBean;
11 import com.sun.spring.boot.service.IGoodsInfoService;
12 
13 /**
14  * 商品基本信息service实现
15 * @ClassName: GoodsInfoServiceImpl  
16 * @author sunt  
17 * @date 2017年11月8日 
18 * @version V1.0
19  */
20 @Service
21 public class GoodsInfoServiceImpl implements IGoodsInfoService{
22 
23     /**
24      * 日志
25      */
26     private Logger logger = Logger.getLogger(GoodsInfoServiceImpl.class);
27     
28     @Autowired
29     private IGoodsInfoDao goodsInfoDao;
30 
31     @Override
32     public List<GoodsInfoBean> queryGoodsList() {
33         logger.info("执行商品列表页查询...");
34         
35         List<GoodsInfoBean> list = goodsInfoDao.findAll();
36         
37         if(null != list && list.size() > 0) {
38             return list;
39         }
40         
41         return null;
42     }
43 
44     @Override
45     public void saveGoods(GoodsInfoBean bean) {
46         logger.info("执行商品的保存操作...");
47         goodsInfoDao.save(bean);
48     }
49 
50     @Override
51     public GoodsInfoBean queryGoodsByNum(Integer goodsNum) {
52         logger.info("查询的商品编码【" + goodsNum + "】");
53         
54         if(null != goodsNum) {
55             return goodsInfoDao.getOne(goodsNum);
56         }
57         return null;
58     }
59 
60     @Override
61     public void updateGoods(GoodsInfoBean bean) {
62         logger.info("更新商品基本信息...");
63         goodsInfoDao.save(bean);
64     }
65 
66     @Override
67     public void deleteGoodsByNum(Integer goodsNum) {
68         logger.info("删除的商品编码【" + goodsNum + "】");
69         goodsInfoDao.delete(goodsNum);
70     }
71     
72     
73 }

6、创建Controller注入service接口

package com.sun.spring.boot.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.sun.spring.boot.pojo.GoodsInfoBean;
import com.sun.spring.boot.service.IGoodsInfoService;

/**
* 商品信息控制层
* Spring4.3中引进了{@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping},来帮助简化常用的HTTP方法的映射,
* 并更好地表达被注解方法的语义。以@GetMapping为例,Spring官方文档说:
  @GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。该注解将HTTP Get 映射到 特定的处理方法上。
* @ClassName: GoodsInfoController  
* @author sunt  
* @date 2017年11月8日 
* @version V1.0
 */
@Controller
@RequestMapping(value = "/goods")
public class GoodsInfoController {

    @Autowired
    private IGoodsInfoService goodsInfoService;
    
    
}

7、查询所有商品信息

首先Controller定义跳转商品列表页的方法,并创建对应的商品模板页面

/**
     * 查询所有商品信息
    * @Title: queryGoodsInfo 
    * @author sunt  
    * @date 2017年11月9日
    * @return ModelAndView
     */
    @RequestMapping(value = "/list")
    public ModelAndView queryGoodsInfo() {
        ModelAndView modelAndView = new ModelAndView();
        
        modelAndView.setViewName("goodsList");
        modelAndView.addObject("goodsList", goodsInfoService.queryGoodsList());
        return modelAndView;
    }

goodsList.ftl

通过FreeMarker常用标签遍历,模板引擎标签一般都有开始与闭合

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset="UTF-8">
 5 <title>商品信息</title>
 6 <script type="text/javascript" src="/jquery-1.7.1.min.js"></script>
 7 <script type="text/javascript">
 8     $(function() {
 9         $('#js-add-goods').on('click', function() {
10             window.location.href = "/goods/toAddGoods"
11         });
12     });
13     
14 </script>
15 </head>
16 <body>
17     <center>
18         <h2>商品基本信息</h2>
19         <button id="js-add-goods">添加商品</button>
20         <table border="1px">
21             <tr>
22                 <th>商品编码</th>
23                 <th>商品名称</th>
24                 <th>商品价格</th>
25                 <th>操作</th>
26             </tr>
27             <!-- 循环操作 -->
28             <#list goodsList as goods>
29                 <tr>
30                     <td>${goods.goodsNum}</td>
31                     <td>${goods.goodsName}</td>
32                     <td>${goods.goodsPrice?string('###.00')}</td> <!-- freemarker格式化数字 -->
33                     <td>
34                         <a href="/goods/toUpdateGoods/${goods.goodsNum}">修改</a>
35                         <a href="/goods/deleteGoods/${goods.goodsNum}">删除</a>
36                     </td>
37                 </tr>
38             </#list>
39         </table>
40     </center>
41 </body>
42 </html>

说明:FreeMarker格式化数字方法

${num?string('0.00')}
如果小数点后不足两位,用 0 代替

${num?string('#.##')}
如果小数点后多余两位,就只保留两位,否则输出实际值
输出为:1239765.46

${num?string(',###.00')}
输出为:1,239,765.46
整数部分每三位用 , 分割,并且保证小数点后保留两位,不足用 0 代替

${num?string(',###.##')}
输出为:1,239,765.46
整数部分每三位用 , 分割,并且小数点后多余两位就只保留两位,不足两位就取实际位数,可以不不包含小数点

${num?string('000.00')}
输出为:012.70
整数部分如果不足三位(000),前面用0补齐,否则取实际的整数位

${num?string('###.00')}
等价于
${num?string('#.00')}
输出为:12.70
整数取实际的位数

 

8、新增商品

Controller定义跳转到新增商品页面的方法-->创建新增商品的模板页面

 1 /**
 2     * 跳转到商品添加页面
 3     * @Title: toAddGoods 
 4     * @author sunt  
 5     * @date 2017年11月9日
 6     * @return ModelAndView
 7      */
 8     @RequestMapping(value = "/toAddGoods")
 9     public ModelAndView toAddGoods() {
10         ModelAndView modelAndView = new ModelAndView();
11         modelAndView.setViewName("addGoods");
12         return modelAndView;
13     }

addGoods.ftl

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>商品添加</title>
</head>
<body>
    <center>
        <h2>商品添加</h2>
        <form action="/goods/saveGoods" method="POST">
            商品名称:<input type="text" name="goodsName"/><br />
            商品价格:<input type="number" name="goodsPrice"><br />
            <input type="submit" value="提交">
        </form>    
    </center>
</body>
</html>

9、Controller新增保存商品的方法

 1 /**
 2     * 添加商品
 3     * 使用 forward 重定向后浏览器地址栏URL不变. 而redirect 的地址栏将改变为跳转后的新地址.
 4     * @Title: saveGoods 
 5     * @author sunt  
 6     * @date 2017年11月9日
 7     * @return String
 8      */
 9     @RequestMapping(value = "/saveGoods", method = RequestMethod.POST)
10     public String saveGoods(GoodsInfoBean bean) {
11         
12         try {
13             goodsInfoService.saveGoods(bean);
14         } catch (Exception e) {
15             e.printStackTrace();
16         }
17         return "redirect:/goods/list";
18     }

9、商品修改

首先跳转到修改页面根据商品编码查询商品的基本信息,并填入到编辑页面

 1 /**
 2     * 跳转到商品修改页面,携带数据
 3     * @PathVariable注解用于获取url中的动态参数
 4     * @Title: toUpdateGoods 
 5     * @author sunt  
 6     * @date 2017年11月9日
 7     * @return ModelAndView
 8      */
 9     @RequestMapping(value = "/toUpdateGoods/{goodsNum}",method = RequestMethod.GET)
10     public ModelAndView toUpdateGoods(@PathVariable("goodsNum") Integer goodsNum) {
11         ModelAndView modelAndView = new ModelAndView();
12         modelAndView.setViewName("updateGoods");
13         modelAndView.addObject("goodsInfo", goodsInfoService.queryGoodsByNum(goodsNum));
14         
15         return modelAndView;
16     }

updateGoods.ftl

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset="UTF-8">
 5 <title>商品修改</title>
 6 </head>
 7 <body>
 8     <center>
 9         <h2>商品修改</h2>
10         <form action="/goods/updateGoods" method="POST">
11             <input type="hidden" name="goodsNum" value="${goodsInfo.goodsNum }">
12             商品名称:<input type="text" name="goodsName" value="${goodsInfo.goodsName }"/><br />
13             商品价格:<input type="text" name="goodsPrice" value="${goodsInfo.goodsPrice?string('###.00')}"><br />
14             <input type="submit" value="修改">
15         </form>    
16     </center>
17 </body>
18 </html>

10、定义修改商品的方法

 1 /**
 2     * 修改商品信息
 3     * @Title: updateGoods 
 4     * @author sunt  
 5     * @date 2017年11月9日
 6     * @return String
 7      */
 8     @RequestMapping(value = "/updateGoods",method = RequestMethod.POST)
 9     public String updateGoods(GoodsInfoBean bean) {
10         try {
11             goodsInfoService.updateGoods(bean);
12         } catch (Exception e) {
13             e.printStackTrace();
14         }
15         return "redirect:/goods/list";
16     }

11、删除商品

  根据商品编码删除指定的商品

 1 /**
 2      * 删除商品
 3     * @Title: deleteGoods 
 4     * @author sunt  
 5     * @date 2017年11月9日
 6     * @return String
 7      */
 8     @RequestMapping(value = "/deleteGoods/{goodsNum}", method = RequestMethod.GET)
 9     public String deleteGoods(@PathVariable("goodsNum") Integer goodsNum) {
10         try {
11             goodsInfoService.deleteGoodsByNum(goodsNum);
12         } catch (Exception e) {
13             e.printStackTrace();
14         }
15         return "redirect:/goods/list";
16     }

12、源码地址:svn://gitee.com/SunnySVN/SpringBoot

访问网页版本https://gitee.com/SunnySVN/SpringBoot可以下载上传的数据库脚本附件

posted @ 2017-11-09 14:11  sunny1009  阅读(1110)  评论(0)    收藏  举报