sell01 环境搭建、编写持久层并进行测试
1 环境配置
JDK 1.8
MAVEN 3.5
MYSQL 5.7
VirtualBox 5.1
2 搭建MYSQL环境
下载 VM 和 虚拟镜像文件
虚拟镜像文件:点击前往
技巧01:安装完virtualBox后直接点击下载好的镜像文件就会自动调到导入镜像文件页面
问题01:启动虚拟机时启动失败,提示物理机的64位内核没有开启
解决01:进入系统bios页面,开启虚拟内核即可(详情请问问度娘)
# 虚拟机说明文档 VirtualBox-5.1.22 虚拟机系统 centos7.3 账号 root 密码 123456 #### 包括软件 * jdk 1.8.0_111 * nginx 1.11.7 * mysql 5.7.17 * redis 3.2.8 ##### jdk * 路径 /usr/local/jdk1.8.0_111 ##### nginx * 路径 /usr/local/nginx * 启动 nginx * 重启 nginx -s reload ##### mysql * 配置 /etc/my.conf * 账号 root * 密码 123456 * 端口 3306 * 启动 systemctl start mysqld * 停止 systemctl stop mysqld ##### redis * 路径 /usr/local/redis * 配置 /etc/reis.conf * 端口 6379 * 密码 123456 * 启动 systemctl start redis * 停止 systemctl stop redis ##### tomcat * 路径 /usr/local/tomcat * 启动 systemctl start tomcat * 停止 systemctl stop tomcat
3 编写实体类
3.1 注解介绍
@Table(name = "product_category") 实体类和表明对应
@Entity 该类是一个实体类
@DynamicUpdate 动态刷新
@Data 自动为实体类生成get/set/tostring方法
@Id 主键
@GeneratedValue 主键自增
@Column 指定实体类属性和数据库字段保持一致
问题01:使用 @Data 后打包后会自动生成相应的方法,但是在IDEA环境运行时需要下载一个插件
解决01:插件安装教程
问题02:使用@Data注解时需要导入相应的jar包
解决02:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
问题03:当实体类名和数据库表明不一致时需要利用注解实现一一对应
解决03:利用@Table指定数据库表名
问题04:当实体类属性名和数据库表的字段名不一致时需要利用注解实现一一对应
解决04:利用@Column指定数据库字段名
3.2 实体类代码
package cn.xinagxu.sell.dataObject; import lombok.Data; import org.hibernate.annotations.DynamicUpdate; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import java.util.Date; /** * 类目表实体对象 */ @Table(name = "product_category") @Entity @DynamicUpdate // 实现动态刷新(例如:当数据库中的更新时间字段是自动刷新时,如果修改数据时传入了这个字段的信息时如果不在实体类中添加这个注解那么数据库对该字段的自动更新就会失效) @Data // 该注解会自动生成一些get/set/tostring方法 public class ProductCategory { /** 类目ID */ @Id @GeneratedValue private Integer categoryId; /** 类目名名字 */ private String categoryName; /** 类目编号 */ private Integer categoryType; /** 类目创建时间 */ private Date createTime; /** 类目更新时间 */ private Date updateTime; public ProductCategory() { } }
4 编写Dao层
4.1 引入数据库相关jar包
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
4.2 配置数据库连接
spring: datasource: driver-class-name: com.mysql.jdbc.Driver username: root password: 123456 url: jdbc:mysql://172.25.129.244/sell?characterEncoding=utf-8&useSSL=false jpa: show-sql: true
技巧01:持久层必须继承 JpaRepository,继承了该接口后就不用在持久层接口添加注解来设置bean了,因为父类已经实现了
技巧02:JPA教程
package cn.xinagxu.sell.repository; import cn.xinagxu.sell.dataObject.ProductCategory; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; public interface ProductCategoryRepository extends JpaRepository<ProductCategory, Integer> { /** 根据一个类型列表去查询类目类型在这个列表中的类目 */ List<ProductCategory> findByCategoryTypeIn(List<Integer> categoryTypeList); }
5 持久层测试类
package cn.xinagxu.sell.repository; import cn.xinagxu.sell.dataObject.ProductCategory; import lombok.extern.slf4j.Slf4j; 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; @RunWith(SpringRunner.class) @SpringBootTest @Slf4j public class ProductCategoryRepositoryTest { @Autowired private ProductCategoryRepository productCategoryRepository; /** 根据主键查询数据 */ @Test public void findOneTest() { log.error("===自定义错误日志==="); log.warn("===自定义警告日志==="); log.info("===自定义信息日志==="); log.debug("===自定义调试日志==="); ProductCategory productCategory = productCategoryRepository.findOne(1); System.out.println(productCategory); } /** 插入一条数据(主键、创建时间、更新时间是自动实现的不必传入) */ @Test public void saveOneTest() { ProductCategory productCategory = new ProductCategory(); productCategory.setCategoryName("女生的最爱"); productCategory.setCategoryType(3); ProductCategory result = productCategoryRepository.save(productCategory); Assert.assertNotNull(result); // 利用断言判断:如果结果不为null就表明正确 // Assert.assertNotEquals(null, result); // 利用断言判断:如果结果不为null就表明正确 } /** 根据主键去更新一个条数据 */ @Test public void updateOneTest() { ProductCategory productCategory = productCategoryRepository.findOne(2); productCategory.setCategoryName("三少"); productCategoryRepository.save(productCategory); } /** 根据类型列表查询 */ @Test public void findByCategoryTypeTest() { List<Integer> typeList = Arrays.asList(1,2,3,4); List<ProductCategory> results = productCategoryRepository.findByCategoryTypeIn(typeList); Assert.assertNotEquals(0, results.size()); } }