*.xml
处会报红,是因为还没有xml文件,先不用管。
新建 springmvc.xml
文件:
<?xml version="1.0" encoding="UTF-8"?> <beans default-lazy-init="true" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" 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-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 扫描带注解的包下的类,注册Bean--> <context:component-scan base-package="com.shaonaiyi.minimall.controller" /> <!-- 通过注解,把URL映射到Controller上,该标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter --> <mvc:annotation-driven /> </beans>
新建 db.properties
文件
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/minimall?characterEncoding=utf-8 jdbc.username=root jdbc.password=123456
配置文件都搞定之后,就可以敲代码了,说实话,用过SpringBoot之后,再用起SSM来,就像说一个字:绝!(真繁琐…)
编写代码的顺序一般是这样的,先把对应的实体类给建好,必须清楚自己到底想干啥,然后你可以从 Controller 再到 Service 再到 Dao 层,再把 MyBatis 的xml文件搞定。
但实际上开发要比这个轻松很多,因为一般都会用代码生成工具,把很多琐碎的代码都自动生成了,可以减少很多工作,比如增删改查,只需要写少量 Controller 和 Service 层代码就可以了。
当然,在实际开发上,还可以继续再简化,这个就需要衡量一下你项目的够不够大了,如果项目比较小,复制粘贴就可以搞定了,但如果体量比较大,复制粘贴都非常繁琐。当然,你也可以选择一些低代码开发平台,配置一下、跑一下,很多功能都可以实现,具体大家也可以去了解一下:
其实只有写教程是最费时间的:
我不忍了,你们在学校学的都是…没有没有,只是太基础而已。
彩蛋:打印日志实现
为了使用日志,我们在util包里编写工具类:
package com.shaonaiyi.minimall.util; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; /** * @Auther: shaonaiyi@163.com * @Date: 2021/8/17 23:58 * @Description: */ @Component @Aspect public class LogPrint { @Before("execution(* com.shaonaiyi.minimall.service.impl.*.*(..))") public void methodBegin(JoinPoint joinPoint){ System.out.println("方法开始了"); } @After("execution(* com.shaonaiyi.minimall.service.impl.*.*(..))") public void methodEnd(){ System.out.println("方法结束了"); } @Before("execution(* com.shaonaiyi.minimall.service.impl.*.*(..))") public void methodBegin1(JoinPoint joinPoint){ System.out.println(joinPoint.getTarget()+" "+joinPoint.getSignature().getName()+"方法开始了"); } }
增删改查实现
先把实体类构建好,然后的写代码顺序可以灵活处理,一般是先写Controller,然后是Service接口,接着是Service实现,然后是Dao层接口,然后是Dao的xml文件。
简单来说就是:entity => XxxController => iXxxService => XxxServiceImpl => XxxDao.java => XxxDao.xml。
代码结构请参考下图,以免有些小伙伴不知道要复制到哪里:
编写 Product.java
完整代码:
package com.shaonaiyi.minimall.entity; /** * @Auther: shaonaiyi@163.com * @Date: 2021/8/17 14:09 * @Description: 商品实体类 */ public class Product { private Integer id; private String productName; private Integer nums; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public Integer getNums() { return nums; } public void setNums(Integer nums) { this.nums = nums; } @Override public String toString() { final StringBuffer sb = new StringBuffer("Product{"); sb.append("id=").append(id); sb.append(", productName='").append(productName).append('\''); sb.append(", nums=").append(nums); sb.append('}'); return sb.toString(); } }
注意:数据库里商品名称为 productname
,而实体类里字段为 productName
,所以后面操作要额外注意,这里写不同,方便各位小伙伴有个区别。
编写 ProductController.java
完整代码:
package com.shaonaiyi.minimall.controller; import com.shaonaiyi.minimall.entity.Product; import com.shaonaiyi.minimall.service.IProductService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.List; /** * @Auther: shaonaiyi@163.com * @Date: 2021/8/17 14:10 * @Description: 商品控制器 */ @Controller @RequestMapping("/product") @CrossOrigin public class ProductController { @Autowired private IProductService iProductService; @RequestMapping("/list") @ResponseBody public List<Product> list() { return iProductService.list(); } @RequestMapping(value = "/add",method = RequestMethod.POST) @ResponseBody public boolean add(@RequestBody Product product) { return iProductService.add(product); } @RequestMapping(value = "/update",method = RequestMethod.POST) @ResponseBody public boolean update(@RequestBody Product product) { return iProductService.update(product); } @RequestMapping(value = "/delete",method = RequestMethod.POST) @ResponseBody public boolean delete(@RequestBody Product product) { return iProductService.delete(product); } @RequestMapping(value = "/add-test",method = RequestMethod.POST) @ResponseBody public boolean addTest(String productName,Integer nums) { Product product = new Product(); product.setProductName(productName); product.setNums(nums); return iProductService.add(product); } @RequestMapping(value = "/delete-test",method = RequestMethod.POST) @ResponseBody public boolean deleteTest(int id) { Product product = new Product(); product.setId(id); return iProductService.delete(product); } }
说明:
1、这里提供多了两个接口: /add-test 、 /delete-test ,方便大家对比学习,两种方式的接受参数的方式不一样, Content-Type 一个是 JSON ,一个是 application/x-www-form-urlencoded ,方式不同,如果不对应上,会报400错误,后面有测试用例,可以看后面内容。
2、目前的开发模式一般都是前后端分离开发,所以用 JSON 格式进行交互是最常见的;如果想按照自己的风格,没有前后端分离的话,可以使用另外一种。初学者比较容易对这里的内容有误解,可以查阅相关资料。
编写 IProductService.java
完整代码:
package com.shaonaiyi.minimall.service; import com.shaonaiyi.minimall.entity.Product; import java.util.List; /** * @Auther: shaonaiyi@163.com * @Date: 2021/8/17 14:13 * @Description: 商品逻辑接口 */ public interface IProductService { List<Product> list(); boolean add(Product product); boolean update(Product product); boolean delete(Product product); }
编写 ProductServiceImpl.java
完整代码:
package com.shaonaiyi.minimall.service.impl; import com.shaonaiyi.minimall.dao.ProductDao; import com.shaonaiyi.minimall.entity.Product; import com.shaonaiyi.minimall.service.IProductService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * @Auther: shaonaiyi@163.com * @Date: 2021/8/17 14:13 * @Description: 商品逻辑实现 */ @Service public class ProductServiceImpl implements IProductService { @Autowired private ProductDao productDao; @Override public List<Product> list() { return productDao.list(); } @Override public boolean add(Product product) { int result = productDao.add(product); return result > 0; } @Override public boolean update(Product product) { int result = productDao.update(product); return result > 0; } @Override public boolean delete(Product product) { int result = productDao.delete(product.getId()); return result > 0; } }
编写 ProductDao.java
完整代码:
package com.shaonaiyi.minimall.dao; import com.shaonaiyi.minimall.entity.Product; import java.util.List; /** * @Auther: shaonaiyi@163.com * @Date: 2021/8/17 14:18 * @Description: 商品Dao接口 */ public interface ProductDao { List<Product> list(); int add(Product product); int update(Product product); int delete(int id); }