環(huán)境
- idea 2017.3.2
- Springboot 2.1
- spring-data-jpa
- MySql 8.0
創(chuàng)建項(xiàng)目
idea建項(xiàng)目血当,選擇Spring Initializr
next-next,這里選自己需要的模塊鸣驱,比如web項(xiàng)目捣炬,選web
在Sql模塊里经伙,我們本次項(xiàng)目用的是JPA翎猛,所以選中JPA,一路next下去~
需要其他配置的可以自己添加臼节,比如redis等模塊
配置
創(chuàng)建好了以后撬陵,會(huì)生成一個(gè)springboot+maven的項(xiàng)目框架,自動(dòng)生成了一個(gè)application.properties配置文件
- 這里我們使用application.yml做配置,結(jié)構(gòu)更清晰网缝,更改后綴名即可
具體配置如下
spring:
jpa:
# 默認(rèn)false巨税,在日志里顯示執(zhí)行的sql語(yǔ)句
show-sql: true
database: mysql
#指定為update,每次啟動(dòng)項(xiàng)目檢測(cè)表結(jié)構(gòu)有變化的時(shí)候會(huì)新增字段粉臊,表不存在時(shí)會(huì)新建草添,如果指定create,則每次啟動(dòng)項(xiàng)目都會(huì)清空數(shù)據(jù)并刪除表扼仲,再新建
hibernate.ddl-auto: update
properties.hibernate.dialect: org.hibernate.dialect.MySQL5Dialect
database-platform: org.hibernate.dialect.MySQL5Dialect
hibernate:
naming:
#physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
#指定jpa的自動(dòng)表生成策略远寸,駝峰自動(dòng)映射為下劃線格式
implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
datasource:
username: root
password: admin
#同樣 低版本的MySql不需要指定時(shí)區(qū)
url: jdbc:mysql:///main?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
#mysql8.0以后的加密方式為caching_sha2_password,所以必須用com.mysql.cj.jdbc.Driver,前提是pom里引入的mysql-connector-java必須為8.0.12的屠凶,8.0.13不行驰后,會(huì)報(bào)錯(cuò)
driver-class-name: com.mysql.cj.jdbc.Driver
#如果是老版本的MySql,或者手動(dòng)修改my.ini指定加密方式為mysql_native_password,則使用原來(lái)的Driver即可
#driver-class-name: com.mysql.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
#自己的連接池配置
hikari:
pool-name: user-1
minimum-idle: 30
maximum-pool-size: 30
connectionTimeout: 60000
idleTimeout: 60000
validationTimeout: 3000
maxLifetime: 60000
register-mbeans: true
引入maven依賴(lài)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--同樣,8.0以上版本的MySql才需要引入這么高版本的connector依賴(lài)-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--習(xí)慣性加上lombok插件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- 這樣一個(gè)JPA的項(xiàng)目就搭建好啦~矗愧!去寫(xiě)個(gè)Demo試試
1倡怎、創(chuàng)建一個(gè)實(shí)體類(lèi)
//@Entity每個(gè)實(shí)體類(lèi)必須貼
@Entity
//@Table注解對(duì)應(yīng)數(shù)據(jù)庫(kù)中的表,必貼,name=表名,Indexes是聲明表里的索引,columnList是索引的列,同時(shí)聲明此索引列是否唯一,默認(rèn)false
@Table(name = "user_info", indexes = {@Index(name = "id", columnList = "id", unique = true),
@Index(name = "userName", columnList = "user_name", unique = true)})
//這些是lombok的注解,省的寫(xiě)一堆的getter setter
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo {
//@Id指明id列,必貼
@Id
//@GeneratedValue表明是否自動(dòng)生成,必貼,strategy也是必寫(xiě),指明主鍵的生成策略,因?yàn)槟J(rèn)是Oracle的哦
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
//@Column 對(duì)應(yīng)數(shù)據(jù)庫(kù)列名,可選貼,nullable 是否可以為空,默認(rèn)true
@Column(name = "user_name", nullable = false)
private String userName;
private Integer age;
}
2、寫(xiě)對(duì)應(yīng)的CRUD接口
- 這里就體現(xiàn)出JPA除了自動(dòng)建表之外的另一個(gè)強(qiáng)大之處了贱枣!開(kāi)發(fā)中不用寫(xiě)一句sql,甚至連接口名也不用寫(xiě)颤专!
public interface UserInfoMapper extends JpaRepository<UserInfo,Long>,Serializable{
}
你沒(méi)看錯(cuò)纽哥,只需要繼承一個(gè)方法庫(kù)就可以完成大部分操作,這里我們繼承標(biāo)準(zhǔn)的JpaRepository 和 序列化接口
- 因?yàn)槭荄emo的關(guān)系栖秕,我就直接寫(xiě)Controller來(lái)演示效果了春塌,開(kāi)發(fā)中大家可要嚴(yán)格遵守三層架構(gòu),不要在Controller層寫(xiě)業(yè)務(wù)哦~
@RestController
@RequestMapping("userInfo")
public class UserInfoController {
@Autowired
private UserInfoMapper userInfoMapper;
@GetMapping("page")
public Object page(){
//由于我們的mapper繼承了JpaRepository接口,所以可以直接使用內(nèi)置的一系列方法
List<UserInfo> all = userInfoMapper.findAll(Sort.by("id").descending());
return all;
}
}
可以看到我在接口里寫(xiě)了一個(gè)簡(jiǎn)單的查詢(xún)所有UserInfo的方法,并按照id倒序排列
讓我們驗(yàn)證一下
- 啟動(dòng)項(xiàng)目簇捍,發(fā)現(xiàn)我們的main庫(kù)中自動(dòng)生成了user_info表
-
在表里手動(dòng)添加幾條數(shù)據(jù)
- 我們用firfox瀏覽器訪問(wèn)一下userInfo/page 方法只壳,默認(rèn)8080端口
-
可以看到數(shù)據(jù)已經(jīng)取出來(lái)了,而且是id倒序的哦
-
同時(shí)因?yàn)槲覀冊(cè)趛ml里配了showSql暑塑,所以查詢(xún)sql也被打印在了控制臺(tái)吼句。