自己闭门造车,不如让老司机带着飞
1. 创建数据库设计表
<!--- 商品表--->
CREATE TABLE `sell`.`product_info` (
`product_id` VARCHAR(32) NOT NULL,
`product_name` VARCHAR(64) NOT NULL COMMENT '商品名称',
`product_price` DECIMAL(8,2) NOT NULL COMMENT '单价',
`product_description` VARCHAR(64) NOT NULL COMMENT '描述',
`product_icon` VARCHAR (512)COMMENT '小图',
`category_type` INT(8) NOT NULL COMMENT '类目编号',
`product_stock` INT(128) NOT NULL COMMENT '库存',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`product_id`)
)COMMENT '商品表';
<!--- 类目表--->
CREATE TABLE `sell`.`product_category` (
`category_id` INT NOT NULL AUTO_INCREMENT,
`category_name` VARCHAR(64) NOT NULL COMMENT '类目名字',
`category_type` INT(12) NOT NULL COMMENT '类目编号',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`category_id`),
UNIQUE KEY `uqe_category_type` (`category_type`)
) COMMENT '类目表';
<!--- 订单表--->
CREATE TABLE `sell`.`order_master`(
`order_id` VARCHAR(32) NOT NULL,
`buyer_name` VARCHAR (32) NOT NULL COMMENT '买家名字',
`buyer_phone` VARCHAR(32) NOT NULL COMMENT '买家电话',
`buyer_address` VARCHAR(128) NOT NULL COMMENT '买家地址',
`buyer_openid` VARCHAR(64) NOT NULL COMMENT "买家微信openid",
`order_amount` DECIMAL(8,2) NOT NULL COMMENT '订单总额',
`order_status` TINYINT(3) NOT NULL DEFAULT '0' COMMENT '订单状态 默认0新下单',
`pay_status` TINYINT(3) NOT NULL DEFAULT '0' COMMENT '订单状态 默认0未支付',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY(`order_id`),
KEY `idx_buyer_openid` (`buyer_openid`)
) COMMENT '订单表';
<!---订单详情表--->
CREATE TABLE `sell`.`order_detail`(
`detail_id` VARCHAR(32) NOT NULL,
`order_id` VARCHAR(32) NOT NULL,
`product_id` VARCHAR(32) NOT NULL,
`product_name` VARCHAR(64) NOT NULL COMMENT '商品名称',
`product_price` DECIMAL(8,2) NOT NULL COMMENT '单价',
`product_icon` VARCHAR (512)COMMENT '小图',
`product_quantity` INT NOT NULL COMMENT '商品数量',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`detail_id`),
KEY `idx_order_id`(`order_id`)
) COMMENT '订单详情表';
2. 创建springboot 项目
- 修改application.yml文件 配置数据库 连接池 内容如下
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://127.0.0.1:3306/sell?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
# 连接池配置
connectionProperties=druid:
stat:
mergeSql=true;druid:
stat:
slowSqlMillis=5000:
jpa:
show-sql: true
2.maven配置
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.amn</groupId>
<artifactId>sell</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sell</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
#jpa
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
#mysql数据库
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
# 连接池配置
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
<scope>compile</scope>
</dependency>
# lombok 依赖和安装lombok插件可以省区set/get toString 方法
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.创建和表名对应的实体类 jpa 允许将下划线设置成驼峰式写法
JPA 定义:Java Persistence API定义了一种定义,可以将常规的普
通Java对象(有时被称作POJO)映射到数据库。这些普通Java对象被称作Entity Bean。
除了是用Java Persistence元数据将其映射到数据库外,Entity Bean与其他Java类没有任何区别。
事实上,创建一个Entity Bean对象相当于新建一条记录,删除一个Entity Bean会同时从数据库中删除对应记录,修改一个Entity Bean时,容器会自动将Entity Bean的状态和数据库同步。
@DynamicUpdate 注解用于数据库更新时间
@data:这个注解可以让我们不用写get/set方法。它会在打包的时候自动帮我们生成get/set代码很方便,但是需要额外引入lombok的jar包,第一次使用的话编译器还要安装相应的插件,
@Entity:告诉框架这个实体是对应数据库的某张表的,我这里的表名和类名是驼峰式一一对应的,如果你的表名和类名不同那么你可以加一个注解@Table(name="数据库表名");
@Id:声明这个参数对应数据库的主键;
@GeneratedValue:主键是自增的;
package com.amn.sell.bean;
import lombok.Data;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.util.Date;
@Entity
@DynamicUpdate
@Data
public class ProductCategory {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
/**
* id
*/
private Integer categoryId;
/**
* 类目名字
*/
private String categoryName;
/**
* 类目编号
*/
private Integer categoryType;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
}
4.编写dao层
package com.amn.sell.dao;
import com.amn.sell.bean.ProductCategory;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface ProductDao extends JpaRepository<ProductCategory,Integer> {
List<ProductCategory> findByCategoryTypeIn(List<Integer> CategoryTypeList);
}
dao层非常简单只要继承一下 JpaRepository<T, Serializable> 就好了 T:写的是dao操作对应的实体 ,Serializable:是主键的类型。dao中可以声明自己的方法,如上的findByCategoryTypeIn方法。
5.测试
@Transactional 注解 不影响数据的数据,测试中用
package com.amn.sell.dao;
import com.amn.sell.bean.ProductCategory;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import static org.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProductDaoTest {
@Autowired
private ProductDao productDao;
@Test
@Transactional
public void findOneTest(){
ProductCategory one = productDao.findById(1).orElse(null);
System.out.println(one);
}
@Test
public void saveTest(){
ProductCategory productCategory = new ProductCategory();
productCategory.setCategoryName("男生最爱");
productCategory.setCategoryType(3);
productDao.save(productCategory);
}
/**
* 更新
*/
@Test
public void updateTest(){
ProductCategory productCategory = new ProductCategory();
productCategory.setCategoryId(2);
productCategory.setCategoryName("bbb");
productCategory.setCategoryType(3);
productDao.save(productCategory);
}
@Test
public void testFindByCategoryType(){
List<Integer> list = Arrays.asList(2,3,4);
List<ProductCategory> categories = productDao.findByCategoryTypeIn(list);
Assert.assertNotEquals(0, categories.size());
}
}
网友评论