day01_springboot综合案例

news2024/11/26 17:47:30

springboot项目

课程目标

1. 【掌握】SSM整合
2. 【掌握】使用SSM完成查询
3. 【理解】AdminLTE
4. 【理解】理解SSM综合案例表的结构

springboot环境搭建

搭建工程

在这里插入图片描述在这里插入图片描述在这里插入图片描述

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>cn.yanqi</groupId>
	<artifactId>springboot-crud</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<name>springboot-crud</name>
	<description>springboot-crud</description>

	<properties>
		<java.version>1.8</java.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
	</properties>

	<dependencies>

		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper-spring-boot-starter</artifactId>
			<version>1.2.10</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.0.0</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
			<optional>true</optional>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.47</version>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>${spring-boot.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.8.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<version>${spring-boot.version}</version>
				<configuration>
					<mainClass>cn.yanqi.SpringbootCrudApplication</mainClass>
					<skip>true</skip>
				</configuration>
				<executions>
					<execution>
						<id>repackage</id>
						<goals>
							<goal>repackage</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

</project>

数据库

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(25) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `nickname` varchar(25) DEFAULT NULL,
  `createdtime` datetime DEFAULT NULL,
  `updatedtime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;


INSERT INTO `test`.`user`(`id`, `username`, `password`, `nickname`, `createdtime`, `updatedtime`) VALUES (6, 'jack', '123', '杰克', '2022-10-15 18:15:05', '2022-10-15 18:15:09');
INSERT INTO `test`.`user`(`id`, `username`, `password`, `nickname`, `createdtime`, `updatedtime`) VALUES (7, 'rose', '123', '肉丝', '2022-10-15 18:15:28', '2022-10-15 18:15:31');

application.yml

# 端口
server:
  port: 8080
  servlet:
    context-path: /

# mybatis
mybatis:
  type-aliases-package: cn.yanqi.pojo
  mapper-locations: classpath:mappers/*.xml
  configuration:
    map-underscore-to-camel-case: true #驼峰


# 数据源
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///ssm_crud?useSSL=true
    username: root
    password: root
  thymeleaf:
    cache: false #避免改了模板还要重启服务器
    mode: HTML5
    encoding: UTF-8
    servlet:
      content-type: text/html
    prefix: classpath:/templates/
    suffix: .html

 # 分页插件
pagehelper:
  helper-dialect: mysql

代码实现

pojo实体类

@Data
public class User {

    private Integer id;
    private String username;
    private String password;
    private String nickname;

}

controller层

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 后台请求,转发到 templates 模版下 取值显示
     * @param model
     * @return
     */
    @RequestMapping("queryAllUser")
    public String queryAllUser(Model model){
        List<User> userList=userService.queryAllUser();
        model.addAttribute("userList",userList);
        return "user";
    }
}

service层

public interface UserService {

    List<User> queryAllUser();
}
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> queryAllUser() {
        return this.userMapper.queryAllUser();
    }
}

mapper层

@Repository
public interface UserMapper {
    List<User> queryAllUser();
}

mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.yanqi.mapper.UserMapper">
    <select id="queryAllUser" resultType="User">
		select * from user
	</select>
</mapper>

启动类

@SpringBootApplication
@MapperScan("cn.yanqi.mapper")//扫描mapper接口
public class SpringbootthymeleafApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootthymeleafApplication.class, args);
    }
}

页面

<!DOCTYPE html>
<!--引入thymeleaf-->
<html xmlns:th = "http://www.thymeleaf.org">

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <table border="1px" cellpadding="1px" cellspacing="0px">
        <tr>
            <th>序号</th>
            <th>姓名</th>
            <th>密码</th>
            <th>昵称</th>
        </tr>
        <tr th:each="user:${userList}">
            <td th:text="${user.id}"></td>
            <td th:text="${user.username}"></td>
            <td th:text="${user.password}"></td>
            <td th:text="${user.nickname}"></td>
        </tr>
    </table>
</body>
</html>

测试

在这里插入图片描述

页面导入

导入相关文件

在这里插入图片描述

@Controller
@RequestMapping("to")
public class pageController {

    @GetMapping("index")
    public String toPageant(){
        return "index";
    }
}

页面效果如下:

在这里插入图片描述

springboot综合案例

数据库搭建

产品表(product)

  • product信息描述

在这里插入图片描述

  • 创建product表

    CREATE TABLE `product` (
      `id` VARCHAR(32) NOT NULL,
      `productNum` VARCHAR(50) NOT NULL,
      `productName` VARCHAR(50) DEFAULT NULL,
      `cityName` VARCHAR(50) DEFAULT NULL,
      `departureTime` DATETIME DEFAULT NULL,
      `productPrice` INT(11) DEFAULT NULL,
      `productDesc` VARCHAR(500) DEFAULT NULL,
      `productStatus` INT(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8;
    
    
    INSERT  INTO `product`(`id`,`productNum`,`productName`,`cityName`,`DepartureTime`,`productPrice`,`productDesc`,`productStatus`) VALUES 
    ('12B7ABF2A4C544568B0A7C69F36BF8B7','yunhe-003','上海五日游','上海','2018-06-13 23:21:21',1800,'魔都我来了',0),
    ('676C5BD1D35E429A8C2E114939C5685A','yunhe-002','北京三日游','北京','2020-01-16 19:21:25',1200,'不错的旅行',1),
    ('9F71F01CB448476DAFB309AA6DF9497F','yunhe-001','北京三日游','北京','2019-06-04 09:21:21',1200,'不错的旅行',1);
    
    

会员表(member)

订单与会员之间是多对一关系,我们在订单表中创建一个外键来进行关联。

订单表 (orders)

旅客表( traveller)

中间表 (order_traveller)

旅客与订单之间是多对多关系,所以我们需要一张中间表(order_traveller)来描述。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qeywgnpD-1690118686237)(assets/image-20201014064431518.png)]

  • order_traveller表sql

    CREATE TABLE order_traveller(
      orderId VARCHAR(32),
      travellerId VARCHAR(32),
      PRIMARY KEY (orderId,travellerId),
      FOREIGN KEY (orderId) REFERENCES orders(id),
      FOREIGN KEY (travellerId) REFERENCES traveller(id)
    );
    
    INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
    VALUES ('0E7231DC797C486290E8713CA3C6ECCC', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E');
    INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
    VALUES ('2FF351C4AC744E2092DCF08CFD314420', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E');
    INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
    VALUES ('3081770BC3984EF092D9E99760FDABDE', 'EE7A71FB6945483FBF91543DBE851960');
    INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
    VALUES ('55F9AF582D5A4DB28FB4EC3199385762', 'EE7A71FB6945483FBF91543DBE851960');
    INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
    VALUES ('5DC6A48DD4E94592AE904930EA866AFA', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E');
    INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
    VALUES ('96CC8BD43C734CC2ACBFF09501B4DD5D', 'EE7A71FB6945483FBF91543DBE851960');
    INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
    VALUES ('A0657832D93E4B10AE88A2D4B70B1A28', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E');
    INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
    VALUES ('CA005CF1BE3C4EF68F88ABC7DF30E976', 'EE7A71FB6945483FBF91543DBE851960');
    INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
    VALUES ('E4DD4C45EED84870ABA83574A801083E', 'EE7A71FB6945483FBF91543DBE851960');
    

实体类

Product类

package cn.yanqi.ssm.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

@Data
public class Product {
    private String id;
    private String productNum;
    private String productName;
    private String cityName;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
    private Date departureTime;
    private String departureTimeStr;
    private Integer productPrice;
    private String productDesc;
    private Integer productStatus;
    private String productStatusStr;

    public String getDepartureTimeStr() {
        // 对日期格式化
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        if (null != departureTime) {
            departureTimeStr = dateFormat.format(departureTime);
        }
        return departureTimeStr;
    }

    public String getProductStatusStr() {

        if (productStatus == null) {
            return "";
        }

        if (productStatus == 0){
            productStatusStr = "关闭";
        } else if(productStatus == 1){
            productStatusStr = "开启";
        }

        return productStatusStr;
    }
}


Member类

package cn.yanqi.ssm.pojo;
import lombok.Data;
@Data
public class Member {
    private String id;
    private String name;
    private String nickname;
    private String phoneNum;
    private String email;
}

Orders类

package cn.yanqi.ssm.pojo;

import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@Data
public class Orders {
    private String id;
    private String orderNum;
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
    private Date orderTime;
    private String orderTimeStr;
    private int orderStatus;
    private String orderStatusStr;
    private int peopleCount;
    private Product product;
    private List<Traveller> travellers;
    private Member member;
    private Integer payType;
    private String payTypeStr;
    private String orderDesc;
    //用于添加订单时,添加产品,会员
    private Integer productId;
    private Integer memberId;

    public String getOrderTimeStr() {
        // 对日期格式化
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        orderTimeStr =  dateFormat.format(orderTime);

        return orderTimeStr;
    }

    public String getPayTypeStr() {
        if (payType == 0){
            payTypeStr = "支付宝";
        } else if(payType == 1){
            payTypeStr = "微信";
        }else if(payType == 2){
            payTypeStr = "其他";
        }

        return payTypeStr;
    }


    public String getOrderStatusStr() {
        if (orderStatus == 0){
            orderStatusStr = "未支付";
        } else if(orderStatus == 1){
            orderStatusStr = "已支付";
        }
        return orderStatusStr;
    }
}

Traveller类

package cn.yanqi.ssm.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
public class Traveller {
    private String id;
    private String name;
    private String sex;
    private String phoneNum;
    private Integer credentialsType;
    private String credentialsTypeStr;
    private String credentialsNum;
    private Integer travellerType;
    private String travellerTypeStr;


    public String getCredentialsTypeStr() {
        // 证件类型 0:身份证 1:护照 2:军官证
        if (credentialsType == 0) {
            credentialsTypeStr = "身份证";
        } else if (credentialsType == 1) {
            credentialsTypeStr = "护照";
        } else if (credentialsType == 2) {
            credentialsTypeStr = "军官证";
        }
        return credentialsTypeStr;
    }

    public String getTravellerTypeStr() {
        // 证件类型 0:成人 1:儿童
        if (travellerType == 0) {
            travellerTypeStr = "成人";
        } else if (travellerType == 1) {
            travellerTypeStr = "儿童";
        }

        return travellerTypeStr;
    }
}

产品操作

查询所有产品信息

Product实体类

package cn.yanqi.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Product {
    private String id;
    private String productNum;
    private String productName;
    private String cityName;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
    private Date departureTime;
    private String departureTimeStr;
    private Integer productPrice;
    private String productDesc;
    private Integer productStatus;
    private String productStatusStr;

    public void setDepartureTimeStr(String departureTimeStr) {

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        Date date = null;
        try {
            date = dateFormat.parse(departureTimeStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        this.departureTime = date;
    }

    public String getDepartureTimeStr() {
        // 对日期格式化
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        if (null != departureTime) {
            departureTimeStr = dateFormat.format(departureTime);
        }
        return departureTimeStr;
    }

    public void setProductStatusStr(String productStatusStr) {
        if (productStatusStr.equals("关闭")){
            this.productStatus = 0;
        } else if(productStatusStr.equals("开启")){
            this.productStatus = 1;
        }
    }

    public String getProductStatusStr() {

        if (productStatus == null) {
            return "";
        }

        if (productStatus == 0){
            productStatusStr = "关闭";
        } else if(productStatus == 1){
            productStatusStr = "开启";
        }

        return productStatusStr;
    }
}

编写ProductController

/**
 * @Author: yanqi
 * @Date: 12:00
 * @Desc:
 */
@Controller
@RequestMapping("product")
public class ProductController {

    @Autowired
    private ProductService productService;


    @GetMapping("findAll")
    public String findAll(@RequestParam(value = "page", defaultValue = "1") Integer age ,
                          @RequestParam(value = "size",defaultValue = "5") Integer size,
                          Model model){

        PageHelper.startPage(age,size);

        List<Product> list =  this.productService.findAll();

        PageInfo pageInfo = new PageInfo(list);

        model.addAttribute("pageInfo",pageInfo);

        return "product-list";
    }

}

编写ProductService

public interface ProductService {
    /**
     * 查询所有产品
     * @return
     */
    List<Product> findAll(Integer page, Integer size);
 }   
@Service("productService")
public class ProductServiceImpl implements ProductService {


    @Autowired
    private ProductMapper productMapper;

    /**
     * 查询所有产品
     * @return
     */
    @Override
    public List<Product> findAll(Integer page, Integer size) {
        PageHelper.startPage(page,size);
        return this.productMapper.findAll();
    }

编写ProductMapper

public interface ProductMapper {
    /**
     * 查询所有产品
     * @return
     */
    List<Product> findAll();
    }

编写ProductMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.yanqi.ssm.mapper.ProductMapper">
    
    <!--查询所有产品-->
    <select id="findAll" resultType="Product">
        select * from product order by id desc
    </select>
    
</mapper>

注意事项

在产品添加时,出发时间是一个日期格式,我们需要对日期进行格式化。日期格式化有两种方式:

  • 使用@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  • 使用Converter接口来实现日期格式化。

在这里我们使用@DateTimeFormat来进行日期格式化。我们需要在Product类中的departureTime加上该注解

@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date departureTime;

添加产品

编写ProductController

    /**
     * 新增产品
     * @param product
     * @return
     */
    @PostMapping("save")
    public String save(Product product){
        this.productService.save(product);
        return "redirect:findAll";
    }

编写ProductService

/**
 * 添加产品
 * @param product
 */
void save(Product product);
/**
 * 添加产品
 * @param product
 */
@Override
public void save(Product product) {
    this.productMapper.save(product);
}

编写ProductMapper

/**
 * 添加产品
 * @param product
 */
void save(Product product);

编写ProductMapper.xml

<!--添加产品-->
<insert id="save">
    insert into product(productNum,
                        productName,
                        cityName,
                        departureTime,
                        productPrice,
                        productDesc,
                        productStatus)
                values(#{productNum},
                    #{productName},
                    #{cityName},
                    #{departureTime},
                    #{productPrice},
                    #{productDesc},
                    #{productStatus})
</insert>

产品修改

编写ProductController

    /**
     * 修改产品
     * @return
     */
    @PostMapping("edit")
    public String edit(
            @RequestParam("id") String id,
            @RequestParam("productNum") String productNum,
            @RequestParam("productName") String productName,
            @RequestParam("departureTime") String departureTime,
            @RequestParam("cityName") String cityName,
            @RequestParam("productPrice") Integer productPrice,
            @RequestParam("productStatus") String productStatus,
            @RequestParam("productDesc") String productDesc){

        Product product = new Product();
        product.setId(id);
        product.setProductNum(productNum);
        product.setProductName(productName);
        product.setDepartureTimeStr(departureTime);
        product.setCityName(cityName);
        product.setProductPrice(productPrice);
        product.setProductStatusStr(productStatus);
        product.setProductDesc(productDesc);

        this.productService.edit(product);

        return "redirect:findAll";

    }

    /**
     * 修改之前进行查询
     * @param id
     * @param model
     * @return
     */
    @GetMapping("editById")
    public String editById(@RequestParam("id") Integer id , Model model){
       Product product =  this.productService.editById(id);
       model.addAttribute("product",product);
       return "product-edit";
    }

编写ProductService

    /**
     * 修改产品之前进行查询用于回显
     * @param pid
     * @return
     */
    Product findById(Integer pid);

    /**
     * 修改产品
     * @param product
     * @return
     */
    void edit(Product product);
    /**
     * 修改产品之前进行查询用于回显
     * @param pid
     * @return
     */
    @Override
    public Product findById(Integer pid) {
        return this.productMapper.findById(pid);
    }

    /**
     * 修改产品
     * @param product
     * @return
     */
    @Override
    public void edit(Product product) {
        this.productMapper.edit(product);
    }

编写ProductMapper

/**
 * 修改产品之前进行查询用于回显
 * @param pid
 * @return
 */
Product findById(Integer pid);

/**
 * 修改产品
 * @param product
 * @return
 */
void edit(Product product);

编写ProductMapper.xml

<!--修改产品之前进行查询-->
<select id="findById" resultType="Product">
    select * from product  where id=#{pid}
</select>

<!--修改产品-->
<update id="edit">
    update product set
    productNum=#{productNum},
    productName=#{productName},
    cityName=#{cityName},
    departureTime=#{departureTime},
    productPrice=#{productPrice},
    productDesc=#{productDesc},
    productStatus=#{productStatus}
    where id=#{id}
</update>

产品详情

编写ProductController

    /**
     * 产品详情
     * @param id
     * @param model
     * @return
     */
    @GetMapping("findById")
    public String findById(@RequestParam("id") Integer id, Model model){
        Product product = this.productService.editById(id);
        model.addAttribute("product",product);
        return "product-show";
    }

编写ProductService

/**
 * 修改产品之前进行查询用于回显,之前修改写过无需再写
 * @param pid
 * @return
 */
Product findById(Integer pid);
/**
 * 修改产品之前进行查询用于回显
 * @param pid
 * @return
 */
@Override
public Product findById(Integer pid) {
    return this.productMapper.findById(pid);
}

编写ProductMapper

/**
 * 修改产品之前进行查询用于回显
 * @param pid
 * @return
 */
Product findById(Integer pid);

编写ProductMapper.xml

<!--修改产品之前进行查询-->
<select id="findById" resultType="Product">
    select * from product  where id=#{pid}
</select>

产品删除

编写ProductController

    /**
     * 指定删除
     * @param id
     * @return
     * TODO 待优化:订单中有产品的相关信息,产品删除了,订单中依然有产品的信息
     */
    @GetMapping("deleteById")
    public String deleteById(@RequestParam("id") Integer id){
        this.productService.deleteById(id);
        return "redirect:findAll";
    }

编写ProductService

/**
 * 删除产品
 * @param pid
 * @return
 */
void deleteById(Integer pid);

@Service
public class ProductServiceImpl implements ProductService {


    @Autowired
    private ProductMapper productMapper;

    @Autowired
    private OrderMapper orderMapper;

    /**
     * 删除产品
     * @param pid
     * @return
     */
    @Override
    public void deleteById(Integer pid) {
        //删除订单中商品外键
        this.orderMapper.updateById(pid);
        //删除商品本身
        this.productMapper.deleteById(pid);
    }
}

编写ProductMapper

/**
 * 删除订单中的商品
 */
void updateById(Integer pid);
/**
 * 删除产品
 * @param pid
 * @return
 */
void deleteById(Integer pid);

编写ProductMapper.xml

<!--删除产品-->
<delete id="deleteById">
    delete from product where id=#{pid}
</delete>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.yanqi.ssm.mapper.OrderMapper">
    <!--删除订单中商品-->
    <update id="updateById">
        update  orders set  productId =  null where productId = #{id}
    </update>
</mapper>

批量删除

    /**
     * 批量删除
     * @param ids
     * @return
     */
    @PostMapping("selectDelete")
    public String selectDelete(@RequestParam("ids") int[] ids){
        for (int id : ids) {
            this.productService.deleteById(id);
        }
        return "redirect:findAll";
    }

tMapper;

@Autowired
private OrderMapper orderMapper;

/**
 * 删除产品
 * @param pid
 * @return
 */
@Override
public void deleteById(Integer pid) {
    //删除订单中商品外键
    this.orderMapper.updateById(pid);
    //删除商品本身
    this.productMapper.deleteById(pid);
}

}




### 编写ProductMapper

```java
/**
 * 删除订单中的商品
 */
void updateById(Integer pid);
/**
 * 删除产品
 * @param pid
 * @return
 */
void deleteById(Integer pid);

编写ProductMapper.xml

<!--删除产品-->
<delete id="deleteById">
    delete from product where id=#{pid}
</delete>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.yanqi.ssm.mapper.OrderMapper">
    <!--删除订单中商品-->
    <update id="updateById">
        update  orders set  productId =  null where productId = #{id}
    </update>
</mapper>

批量删除

    /**
     * 批量删除
     * @param ids
     * @return
     */
    @PostMapping("selectDelete")
    public String selectDelete(@RequestParam("ids") int[] ids){
        for (int id : ids) {
            this.productService.deleteById(id);
        }
        return "redirect:findAll";
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/780520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker数据网络管理

数据管理 管理 Docker 容器中数据主要有两种方式&#xff1a;数据卷&#xff08;Data Volumes&#xff09;和数据卷容器&#xff08;DataVolumes Containers&#xff09;。 1&#xff0e;数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机的目录挂…

20230723红米Redmi Note8Pro掉在水里的处理步骤

20230723红米Redmi Note8Pro掉在水里的处理步骤 2023/7/23 18:18 百度搜搜&#xff1a;小米手机进水 破音怎么处理 Redmi Note8Pro 6400万全场景四摄 液冷游戏芯 4500mAh长续航 NFC 18W快充 红外遥控 https://www.zhiliancy.com/a/q5podmr12.html 首页 / 热文 / 内容 小米喇叭…

CI流水线中Jenkins应用实践丨IDCF

作者&#xff1a;达日汗&#xff0c;中国农业银行研发中心&#xff0c;系统支持部 CI &#xff08;Continuous Integration&#xff09;在维基百科中的定义是&#xff1a;经常将几个小改动合并到一个主分支中&#xff0c;强调开发人员提交了新代码之后&#xff0c;立刻进行构建…

大数据学习05-Kafka分布式集群部署

系统环境&#xff1a;centos7 软件版本&#xff1a;jdk1.8、zookeeper3.4.8、hadoop2.8.5 本次实验使用版本 kafka_2.12-3.0.0 一、安装 Kafka官网 将安装包上传至linux服务器上 解压 tar -zxvf kafka_2.12-3.0.0.tgz -C /home/local/移动目录至kafka mv kafka_2.12-3.0…

十二.Redis模拟集群搭建

配置环境 查看环境信息 127.0.0.1:6379> info replication #查看当前redis的信息 # Replication role:master #角色 master主机 connected_slaves:0 #从机数量为0 master_failover_state:no-failover master_replid:115f37a0ec195680ef754d6915738b0c0a05f450 master_replid…

学习UE的FArchive的最基础功能

目标 尝试FArchive的最基础功能。代码参考这里。 0. FArchive是什么&#xff1f; 源代码里FArchive的注释如下&#xff1a; Base class for archives that can be used for loading, saving, and garbage collecting in a byte order neutral way 它是 archive 的基类。&am…

【高并发基础】基本锁算法及原理

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于多处理器编程的艺术进行的&#xff0c;每个知识点的修正和深入主要…

elasticsearch操作(命令方式)

说明&#xff1a;elasticsearch是目前最流行的搜索引擎&#xff0c;功能强大&#xff0c;非常受欢迎。特点是倒排索引&#xff0c;在海量数据的模糊查找领域&#xff0c;效率非常高。elasticsearch的安装和使用参考&#xff1a;http://t.csdn.cn/yJdZb。 本文介绍在es的索引库…

Blender自动化脚本,无人值守批量渲图/渲视频

渲染视频是个非常耗时的大工程&#xff0c;如果要渲染多个视频或者每个视频还需要切换不同的贴图、颜色等&#xff0c;工作量就更离谱了&#xff0c;所以不得不用脚本实现自动化。 Blender的脚本是用Python编写&#xff0c;比PS的js要方便很多。再下载一套Blender对应版本的AP…

十分钟掌握 Vim 编辑器核心功能

十分钟掌握 Vim 编辑器核心功能 文章目录 十分钟掌握 Vim 编辑器核心功能&#x1f468;‍&#x1f3eb;内容一&#xff1a;前言【Vim是什么】&#x1f468;‍&#x1f52c;内容二&#xff1a;Vim 常用模式&#x1f468;‍&#x1f680;内容三&#xff1a;基本操作&#x1f468;…

三十二章:Progressive Semantic Segmentation ——渐进式语义分割

0.摘要 这项工作的目标是在不过载GPU内存使用或丢失输出分割图中的细节的情况下对高分辨率图像进行分割。内存限制意味着我们必须对大图像进行降采样&#xff0c;或者将图像分为局部补丁进行分离处理。然而&#xff0c;前一种方法会丢失细节&#xff0c;而后一种方法由于缺乏全…

前端学习——Vue (Day1)

Vue 快速上手 Vue 是什么 创建 Vue 实例 Vue2官网&#xff1a;https://v2.cn.vuejs.org/ <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge…

Nexus3部署、配置+SpringBoot项目Demo

Docker部署Nexus 搜索Nexus3镜像&#xff1a;[rootlocalhost ~]# docker search nexus 拉取Nexus3镜像&#xff1a;[rootlocalhost ~]# docker pull sonatype/nexus3 启动Nexus3前查看虚拟机端口是否被占用&#xff1a;[rootlocalhost ~]# netstat -nultp 通过Docker Hub查看安…

MySQL——备份恢复

数据库备份&#xff0c;数据库为school&#xff0c;素材如下 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address …

【unity3D】水平方向上UI自动排列整齐(Horizontal Layout Group组件)

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的Horizontal Layout Group Horizontal Layout Group 属性介绍属性详解使用以及效果展示补充 属性介绍 属性功能padding布局组边缘…

C语言——qsort函数的使用(详解)

qsort函数详解 前言&#xff1a;一、qsort函数的含义1.1 函数的参数1.2 参数的含义 二、用不同类型数据&#xff0c;测试sqort2.1 对数组内整数进行排序2.2对数组内浮点数进行排序2.3对字符串进行排序2.4对结构体进行排序 三、模拟实现qsort函数 前言&#xff1a; qsort&#…

RK3588平台开发系列讲解(Camera篇)V4L2 接口查询设备能力

文章目录 一、查询设备的基本信息二、查询设备支持的视频格式三、查询支持分辨率四、查询支持的帧率范围沉淀、分享、成长,让自己和他人都能有所收获!😄 📢在使用 V4L2 进行视频采集前,需要先通过查询设备能力来获取设备可以提供的视频格式、分辨率等信息。 一、查询设…

springboot 配置Knife4j- Swagger3.0

一、导入maven包 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version></dependency> 二、配置config-swagger工具 package com.exceltotxt.…

MySQL连接查询与存储过程

一、连接查询1.1 内连接1.2 左连接1.3 右连接 二、存储过程2.1 概述2.2 简介2.3 优点2.4 语法2.5 举例2.5.1 创建存储过程2.5.2 调用存储过程2.5.3 查看存储过程2.5.4 存储过程的参数2.5.5 修改存储过程2.5.6 删除存储过程 三、总结 一、连接查询 MySQL 的连接查询&#xff0c…

Java集合是Set

HashSet集合 HashSet集合的特点 HashSet常用方法 ①&#xff1a;add(Object o)&#xff1a;向Set集合中添加元素&#xff0c;不允许添加重复数据。 ②&#xff1a;size()&#xff1a;返回Set集合中的元素个数 public class Test {public static void main(String[] args) {…