SpringBoot+MyBatis+Spring 技术整合实现商品品牌模块的CRUD操作

SpringBoot+MyBatis+Spring 技术整合实现商品品牌模块的CRUD操作

项目品牌模块核心API分析.
基于SQL脚本完成数据的初始化,添加项目依赖,配置文件application.properties

品牌数据的查询及呈现

业务描述:将数据库中的品牌信息查询出来,然后在客户端基于html技术进行呈现。
1. POJO:首先对此对象封装从数据库查询到的品牌信息
2. DAO:设计用于访问Brand数据的数据访问对象及方法
2.1定义接口以及定义品牌查询方法

package com.cy.pj.brand.dao;
@Mapper
public interface BrandDao{
    
    
	List<Brand> findBrands(String name); 
}
2.2基于查询方法定义SQL映射,在resources目录中创建mapper/brand目录,并在目录中添加BrandMapper.xml文件
<mapper>
	<select id="findBrands" resultType="com.cy.pj.brand.pojo.Brand">
        select id,name,remark,createdTime
        from tb_brand
        <if test="name!=null and name!=''">
            where name like concat("%",#{name},"%")//concat为mysql中提供的字符串连接函数
        </if>
    </select>
</mapper>
2.3对数据层的查询方法进行单元测试

```java
	public class BrandDaoTests{
	@Autowired
	private BrandDao brandDao;
	void testFindBrands(){
		List<Brand> list=brandDao.findBrands("TCL");
		for(Brand b:list){
			sout(b);
		}
	}
}

业务逻辑对象(Service)查询方法设计及实现

Service:业务逻辑对象负责模块的具体业务处理,例如参数校验,事务控制,权限控制,日志记录等。

  1. 定义业务接口以及添加品牌查询方法
	package com.cy.pj.brand.service;
	public interface BrandService{
    
    
		List<Brand> findBrands(String name);
	}

2.定义BrandService接口实现类BrandServiceImpl

package com.cy.pj.brand.service.impl;

@Service
public class BrandServiceImpl implements BrandService{
    
    
    private static final Logger log=
     LoggerFactory.getLogger(BrandServiceImpl.class);
	   @Autowired
    private BrandDao branddao;
    public List<Brand> findBrands(String name){
    
    
      long t1=System.currentTimeMillis();
            List<Brand> list=brandDao.findBrands(name);
            long t2=System.currentTimeMillis();
            log.info("findBrands->time->{}",(t2-t1));
            return list;
    }
}

3.定义BrandService接口方法的单元测试类,并业务进行测试分析

package com.cy.pj.brand.service;
@SpringBootTest
public class BrandServiceTests{
    
    
    @Autowired
    private BrandService brandService;
    @Test
    void testFindBrands(){
    
    
        List<Brand> list=brandService.findBrands();
        for(Brand b:list){
    
    
            System.out.println(b);
        }
    }
}

控制逻辑对象(Controller)查询方法设计及实现

Controller:在控制逻辑对象中主要是负责请求和响应逻辑控制,例如请求url映射,请求方式,结果集的封装,解析,响应的设计
1.定义Controller类

package com.cy.pj.brand.controller;
@Controller
public class BrandController{
    
    
   @Autowired
   private BrandService brandService;
}

2.在Controller添加处理查询请求的方法
model.addattribute()的作用:往前台传数据,可以传对象,可以传List,通过el表达式 ${}可以获取到,类似于request.setAttribute(“sts”,sts)效果一样

@GetMapping(value={
    
    "/brand/doFindBrands/{name}","/brand/doFindBrands"})
public String doFindBrands(@PathVariable(required = false) String name, Model model){
    
    
    List<Brand> list=brandService.findBrands(name);
    model.addAttribute("list", list);
    return "brand/brand";//第一个brand为目录,第二brand为view name
}

@PathVariable 用于描述方法参数,表示方法参数的值可以来自url中{}内部的变量值,required=false表示参数可以不传值.
@GetMapping描述方法时,表示这个方法只能处理Get请求,注解内部的value属性可以指定多个url.

客户端品牌列表页面设计及实现

在项目的templates目录下创建brand目录并添加brand.html页面,其关键代码如下

<table>
    <thead>
      <tr>
        <th>id</th>
        <th>name</th>
        <th>createdTime</th>
      </tr>
    </thead>
    <tbody>
      <tr th:each="brand: ${list}">
         <td th:text="${brand.id}">10</td>
         <td th:text="${brand.name}">AAA</td>
         <td th:text="${#dates.format(brand.createdTime, 'yyyy/MM/dd  
         HH:mm')}">2020/10/11</td>
       </tr>
 </tbody>
</table>

${}为thymeleaf为中的EL表达式,用于从服务端model中获取数据
th:each为thymeleaf定义的自定义标签属性,用于迭代数据.
th:text为thymeleaf定义的自定义标签属性,用于设置文本内容.

品牌模块删除业务分析及实现

业务描述:在品牌列表页面中,点击当前行记录后面的删除按钮,基于当前行的记录id执行品牌删除操作,删除成功以后,重新刷新页面。
数据逻辑对象(DAO)中删除方法设计及实现
基于业务和删除方法,在BrandDao接口中添加删除方法,定义SQL映射(本次直接以注解方式进行定义)

@Delete("delete from tb_brand where id=#{id}")
int deleteById(Integer id);

在BrandDaoTests单元测试类中添加单元测试方法,对删除操作进行测试,关键代码如下

@Test
void testDeleteById(){
    
    
    int rows=brandDao.deleteById(10);
    System.out.println("rows="+rows);
}

业务逻辑对象(Service)中删除方法设计及实现
在BrandService接口中添加,品牌删除的业务方法

int deleteById(Integer id);

在BrandServiceImpl类中添加删除业务的具体实现

public int deleteById(Integer id){
    
    
     //1.参数校验
     //2.执行删除业务
     int rows=brandDao.deleteById(id);
     //3.校验结果并返回
     return rows;
}

在BrandServiceTests类中添加单元测试方法,对其删除业务做测试

@Test
void testDeleteById(){
    
    
     int rows=brandService.deleteById(10);
     System.out.println("row="+row);
}

控制逻辑对象(Controller)中删除方法设计及实现

@GetMapping("/brand/doDeleteById/{
    
    id})
public String doDeleteById(){
    
    
	brandService.deleteById(id);
	List<Brand> list=brandService.findBrands();
	model.addAttribute("list",list);
	return "brand/brand";
}

客户端删除按钮事件定义及处理
在tbody的tr中添加一列,代码如下

<td>
 <button type="button" th:onclick="doDeleteById([[${brand.id}]])">delete</button>
</td>

定义javascript函数,处理删除事件,代码如下:

function doDeleteById(id){
	//给出提示信息
	if(!confirm("您确认删除吗")) return;//confirm为浏览器中window对象的函数
	 //执行删除业务
	 location.href=`http://localhost/brand/doDeleteById/${id}`;
}

品牌模块添加业务分析及实现

业务描述:在列表页面上,设计添加按钮,当点击添加按钮时,跳转到添加页面,然后在添加页面上数据品牌信息,点击Save按钮将数据提交到服务端进行保存。
数据逻辑对象(Dao)中方法设计及实现
在BrandDao中添加用于保存品牌信息的方法

int insertBrand(Brand brand);

在BrandMapper中添加品牌保存操作对应的sql映射

<insert id="insertBrand">
	insert into tb_brand
	(name,remark,createdTime)
	values
	(#{
    
    name},#{
    
    remark},now())
</insert>

业务逻辑对象(Service)中方法设计及实现
在BrandService业务接口中中定义用于保存品牌信息的方法

int saveBrand(Brand brand);

在BrandServiceImpl业务实现类中添加保存品牌信息的具体实现

public int saveBrand(Brand brand){
    
    
    int rows=brandDao.insertBrand(brand);
    return rows;
}

控制逻辑对象(Controller)中方法设计及实现
在BrandController中添加用于处理请求添加页面的方法

@GetMapping("/brand/doAddUI")
public String doAddUI(){
    
    
    return "brand/brand-add";
}

在BrandController添加用于处理添加品牌信息页面的方法

@PostMapping("/brand/doSaveBrand")
public String doSaveBrand(Brand brand,Model model){
    
    
    System.out.println("save.brand="+brand);
    brandService.saveBrand(brand);
    List<Brand> list=brandService.findBrands(null);
    model.addAttribute("list",list);
    return "brand/brand";
}

品牌添加操作客户端业务分析、设计及实现

brand-add.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/bootstrap/css/bootstrap.css">
</head>
<body>
   <div class="container">
       <h1>The Brand Add Page</h1>
       <form th:action="@{/brand/doSaveBrand}" method="post">
           <div class="form-group">
               <label for="nameId">Name</label>
               <input type="text" class="form-control" name="name" id="nameId" placeholder="Brand Name">
           </div>
           <div class="form-group">
               <label for="remarkId">Remark</label>
               <textarea class="form-control" rows="5" cols="100" name="remark" id="remarkId">
               </textarea>
           </div>
           <button type="submit" class="btn btn-default">Submit</button>
       </form>
   </div>
</body>
</html>

在品牌列表brand.html页面,设计添加按钮

<button type="button" onclick="doAddUI()" class="btn btn-primary btn-sm">Add Brand</button>

点击添加按钮时,加载品牌添加页面,事件处理函数

function doAddUI(){
    
    
	location.href="/brand/doAddUI";
}

品牌模块修改业务分析及实现

业务描述:在品牌列表页面,点击当前行的修改按钮,先基于id查询当前行记录,并将记录呈现在编辑页面。
数据逻辑对象(Dao)中方法设计与实现
在BrandDao中添加基于id查询品牌信息的方法及SQL映射

@Select("select * from tb_brand where id=#{id}")
Brand findById(Integer id);

在BrandDao中添加基于id执行品牌更新的方法及SQL映射

@Update("update tb_brand set name=#{name},remark=#{remark} where id=#{id}")
int updateBrand(Brand brand);

业务逻辑对象(Service)中方法设计与实现
在BrandService 中添加基于id查询品牌信息和更新品牌信息的方法

Brand findById(Integer id);
int updateBrand(Brand brand);

在BrandServiceImpl中基于id查询品牌信息和更新品牌信息的方法

 @Override
    public Brand findById(Integer id) {
    
    
        //.....
        return brandDao.findById(id);
    }
 @Override
    public int updateBrand(Brand brand) {
    
    
        return brandDao.updateBrand(brand);
    }

控制逻辑对象(Controller)中方法设计与实现
在BrandController中添加基于id查询品牌信息的方法

@RequestMapping("/brand/doFindById/{id}")
	public String doFindById(@PathVariable Integer id,Model model){
    
    
		Brand brand=brandService.findById(id);
		 model.addAttribute("brand",brand);
        return "/brand/brand-update";
	}

在BrandController中添加更新品牌信息的方法

 @RequestMapping("/brand/doUpdateBrand")
    public String doUpdateBrand(Brand brand,Model model) {
    
    
        brandService.updateBrand(brand);
        List<Brand> list=brandService.findBrands(null);
        model.addAttribute("list",list);
   	    return "brand/brand";
    }

猜你喜欢

转载自blog.csdn.net/weixin_44594263/article/details/111079584
今日推荐