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可以下载上传的数据库脚本附件
最新同步更新地址:https://www.sunnyblog.top/
感谢您花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让博主能喝上一杯咖啡,在此谢过了!
如果您觉得阅读本文对您有帮助,请点一下左下角“推荐”按钮,您的“推荐”将是我最大的写作动力!另外您也可以选择【关注我】,可以很方便找到我!
本文版权归作者和博客园共有,来源网址:https://www.cnblogs.com/sunny1009 欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利!
浙公网安备 33010602011771号