mysql配置
1.項(xiàng)目添加mysql依賴供炎,配置操作數(shù)據(jù)庫(kù)包
<!-- 添加mysql依賴 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 使用 starter-data-jpa操作數(shù)據(jù)庫(kù)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2.把xx/src/main/resources/下的 application.properties改名為application.yml渴逻,因?yàn)閥ml使代碼更加簡(jiǎn)潔。
application.yml中配置數(shù)據(jù)庫(kù)內(nèi)容
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver #設(shè)置數(shù)據(jù)庫(kù)驅(qū)動(dòng)
username: root #用戶名
password: 123456 #密碼
url: jdbc:mysql://192.168.1.137/sell?characterEncoding=utf-8&useSSL=false #數(shù)據(jù)庫(kù)地址音诫,characterEncoding防止中文亂碼惨奕,useSSL忽略非SSL安全協(xié)議警告
jpa:
show-sql: true #因?yàn)槭情_發(fā)環(huán)境所以打印sql語(yǔ)句
MVC架構(gòu):DAO-service-Controller
MVC - DAO要點(diǎn):
a.數(shù)據(jù)庫(kù)表名和項(xiàng)目中類名關(guān)系
雖然類名駝峰寫,表名是下劃線寫法竭钝,但是spring-boot-starter-data-jpa會(huì)自動(dòng)識(shí)別將兩者關(guān)聯(lián)
如果想類名與表名不一致可以這樣寫:
b.數(shù)據(jù)庫(kù)映射成對(duì)象需要在類中加上@Entity注解
c.@Id //主鍵. @GeneratedValue //自增, command+n設(shè)置get/set/toString方法
單元測(cè)試
- 選中接口右鍵->Go to->Test, create new test
2.Springboot2.0后findOne(id)方法被廢除梨撞,使用findById(id).get()代替, findOne(S)用來(lái)查找對(duì)象S
3.repository.save(productCategory);增加數(shù)據(jù)時(shí),如果不設(shè)置id,使用自增id,直接保存會(huì)報(bào)錯(cuò)香罐。需要在自增id注解中加 strategy = GenerationType.IDENTITY卧波,如:@GeneratedValue(strategy = GenerationType.IDENTITY) //自增
4.自動(dòng)更新時(shí)間需要在表類中添加@DynamicUpdate注解(否則表類中有createTime、updateTime屬性時(shí)庇茫,更新方法不會(huì)自動(dòng)更新時(shí)間)
5.添加構(gòu)造方法港粱,command+n -> Constructor
6.@Transactional注解可以是測(cè)試內(nèi)容不插入表中
@Test
@Transactional //設(shè)置測(cè)試內(nèi)容不插入表中
public void testTest(){
//構(gòu)造方法添加數(shù)據(jù)
ProductCategory productCategory = new ProductCategory("老人最愛",4);
ProductCategory result = repository.save(productCategory);
Assert.assertNotNull(result);//不為空表示成功
}
7.list條件查詢,ProductCategoryRepository接口添加
public interface ProductCategoryRepository extends JpaRepository<ProductCategory, Integer> {
//list查詢,一次查多個(gè)數(shù)據(jù)旦签,查的結(jié)果為list啥容,通過CategoryType查,In代表在其范圍內(nèi)的顷霹,查詢條件為categoryTypeList咪惠。即:查詢CategoryType在categoryTypeList范圍內(nèi)的數(shù)據(jù)
List<ProductCategory> findByCategoryTypeIn(List<Integer> categoryTypeList);
}
注意:使用list條件查詢時(shí)需要有一個(gè)無(wú)參的構(gòu)造方法
lombok插件使用
lombok以簡(jiǎn)單的注解形式來(lái)簡(jiǎn)化java代碼,提高開發(fā)人員的開發(fā)效率淋淀,如生成構(gòu)造器遥昧、getter/setter覆醇、equals、hashcode炭臭、toString等等
使用方法:pom.xml添加依賴
<!--lombok以簡(jiǎn)單的注解形式來(lái)簡(jiǎn)化java代碼蓬网,提高開發(fā)人員的開發(fā)效率跌帐,如生成構(gòu)造器、getter/setter、equals纤壁、hashcode蝗拿、toString等等-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
( IDEA需要添加下載插件:
preferences->搜索Plugins->搜索lombok->安裝)
*使用時(shí)需要在表類中加注解@Data ,@Data包含了getter/setter榕订、equals析显、hashcode、toString等等方法肚豺。
表類:
package com.gang.sell.dataobject;
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 */
@Id //主鍵
@GeneratedValue(strategy = GenerationType.IDENTITY) //自增
private Integer categoryId;
/* 類目名字 */
private String categoryName;
/* 類目編號(hào) */
private Integer categoryType;
// private Date createTime;
//
// private Date updateTime;
// public Integer getCategoryId() {
// return categoryId;
// }
//
// public void setCategoryId(Integer categoryId) {
// this.categoryId = categoryId;
// }
//
// public String getCategoryName() {
// return categoryName;
// }
//
// public void setCategoryName(String categoryName) {
// this.categoryName = categoryName;
// }
//
// public Integer getCategoryType() {
// return categoryType;
// }
//
// public void setCategoryType(Integer categoryType) {
// this.categoryType = categoryType;
// }
//
// public Date getCreateTime() {
// return createTime;
// }
//
// public void setCreateTime(Date createTime) {
// this.createTime = createTime;
// }
//
// public Date getUpdateTime() {
// return updateTime;
// }
//
// public void setUpdateTime(Date updateTime) {
// this.updateTime = updateTime;
// }
//
// @Override
// public String toString() {
// return "ProductCategory{" +
// "categoryId=" + categoryId +
// ", categoryName='" + categoryName + '\'' +
// ", categoryType=" + categoryType +
// '}';
// }
//構(gòu)造方法
//無(wú)參構(gòu)造方法
public ProductCategory() {
}
public ProductCategory(String categoryName, Integer categoryType) {
this.categoryName = categoryName;
this.categoryType = categoryType;
}
}
接口類:
package com.gang.sell.repository;
import com.gang.sell.dataobject.ProductCategory;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface ProductCategoryRepository extends JpaRepository<ProductCategory, Integer> {
//list查詢溃斋,一次查多個(gè)數(shù)據(jù),查的結(jié)果為list吸申,通過CategoryType查梗劫,In代表在其范圍內(nèi)的,查詢條件為categoryTypeList截碴。即:查詢CategoryType在categoryTypeList范圍內(nèi)的數(shù)據(jù)
List<ProductCategory> findByCategoryTypeIn(List<Integer> categoryTypeList);
}
測(cè)試類:
package com.gang.sell.repository;
import com.gang.sell.dataobject.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 javax.transaction.Transactional;
import java.sql.Array;
import java.util.Arrays;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProductCategoryRepositoryTest {
@Autowired
private ProductCategoryRepository repository;
@Test
public void findOneTest() {
ProductCategory productCategory = repository.findById(1).get();
System.out.println(productCategory.toString());
}
@Test
public void saveTest() {//新增數(shù)據(jù)
//1
// //增加數(shù)據(jù)時(shí)梳侨,如果不設(shè)置id,使用自增id,直接保存會(huì)報(bào)錯(cuò)。需要在自增id注解中加 strategy = GenerationType.IDENTITY
// ProductCategory productCategory = new ProductCategory();
// productCategory.setCategoryName("女生最愛");
// productCategory.setCategoryType(3);
// repository.save(productCategory);
//2
//構(gòu)造方法添加數(shù)據(jù)
ProductCategory productCategory = new ProductCategory("女生最愛",3);
ProductCategory result = repository.save(productCategory);
Assert.assertNotNull(result);//不為空表示成功
// 等價(jià)于 Assert.assertNotEquals(null,result);
}
@Test
public void updateTest(){//更新數(shù)據(jù)
//1
// ProductCategory productCategory = new ProductCategory();
// productCategory.setCategoryId(2); //更新數(shù)據(jù)需要設(shè)置id
// productCategory.setCategoryName("男生最愛");
// productCategory.setCategoryType(3);
// repository.save(productCategory);
//2
//查數(shù)據(jù)
ProductCategory productCategory = repository.findById(2).get();
//改數(shù)據(jù)
productCategory.setCategoryType(9);
//保存
repository.save(productCategory);
}
@Test
@Transactional //設(shè)置測(cè)試內(nèi)容不插入表中
public void testTest(){
//構(gòu)造方法添加數(shù)據(jù)
ProductCategory productCategory = new ProductCategory("老人最愛",4);
ProductCategory result = repository.save(productCategory);
Assert.assertNotNull(result);//不為空表示成功
}
@Test
//條件查詢
public void findByCategoryTypeInTest(){
List<Integer> list = Arrays.asList(2,3,4);//CategoryType為2或3或4的數(shù)據(jù)
List<ProductCategory> result = repository.findByCategoryTypeIn(list);
Assert.assertNotEquals(0,result.size()); //查出結(jié)果大于0
}
}