目錄:
點擊文字跳轉,點擊背景或三角展開
一、創建SpringBoot工程
注意模板的jdk版本,以及resource文件夾是否被標識為資源文件
1. 配置pom.xml,導入Maven,常用如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/>
</parent>
<dependencies>
<!-- SpringBoot整合web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot集成Junit -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- Jpa,Hibernate的導入 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- lombox -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
</dependencies>
2. application.properties常用配置
# http://localhost:8080/sshTest
server.port=8080
server.servlet.context-path=/sshTest
# 設置mysql的四個參數
# 可單獨用個beans.xml文件配置,然后用@ImportResource("classpath:beans.xml")導入
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/takessssss?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
#hibernate語句打印
#控制台是否打印
spring.jpa.properties.hibernate.show_sql=true
#格式化sql語句
spring.jpa.properties.hibernate.format_sql=true
#指出是什么操作生成了該語句
spring.jpa.properties.hibernate.use_sql_comments=true
3. 創建HelloController進行測試,成功即進行下一步
二、編寫Model
// lombok
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
// Jpa規范,必須標識這是個entity,指向對應table,兩者關聯。
@Entity
@Table(name = "t_user")
public class User {
// Jpa規范,必須有一個唯一標識標識,此注解標識標識成員屬性id為唯一標識。
@Id
// Jpa規范,唯一標識必須有增長策略
@GeneratedValue(generator = "t_user",strategy = GenerationType.IDENTITY)
private Integer id;
private String username;
private String password;
// 表的字段與類的成員名字不相同時,用@Column注解可將關系對應上
// 經測試,成員若是eMail,會自動對應表的e_mail.
@Column(name = "e_mail")
private String email;
}
上文提到的增長策略,這里詳細說明:
-
AUTO
可以是identity類型,或者sequence類型或者table類型,取決於不同的底層數據庫.
-
TABLE -
使用一個特定的數據庫表格來保存主鍵。這種策略的好處就是不依賴於外部環境和數據庫的具體實現,在不同數據庫間可以很容易的進行移植,但由於其不能充分利用數據庫的特性,所以不會優先使用
-
IDENTITY
主鍵由數據庫自動生成(前提是字段有設置自動增長)
-
SEQUENCE
在某些數據庫中,不支持主鍵自增長,比如Oracle。該策略一般與另外一個注解一起使用@SequenceGenerator,@SequenceGenerator注解指定了生成主鍵的序列。然后JPA會根據注解內容創建一個序列(或使用一個現有的序列)。如果不指定序列,則會自動生成一個序列SEQ_GEN_SEQUENCE。
三、編寫Dao層和Service層
1. Dao層
實現Dao層的方式有很多種,本文使用無需額外導入依賴的基於Spring Data Jpa的接口,常用的有兩個:
- CrudRepository
- JpaRepository
二者有繼承關系,用法也基本一樣,本文以父類CrudRepository為例。只需要繼承JpaRepository接口即可,泛型分別是對應的pojo以及它唯一標識的數據類型
@Repository
public interface UserDaoCrud extends CrudRepository<User,Integer> {
}
2. Service層
service層實現具體業務,可調用CrudRepository的內置方法有:
// 保存對象
<S extends T> S save(S var1);
// 將集合中的對象批量保存
<S extends T> Iterable<S> saveAll(Iterable<S> var1);
// 根據id查詢指定對象,Optional
Optional<T> findById(ID var1);
// 是否存在此id
boolean existsById(ID var1);
// 查詢所有
Iterable<T> findAll();
//根據id集合批量查詢
Iterable<T> findAllById(Iterable<ID> var1);
// 查詢此表總條數
long count();
// 根據id刪除指定數據
void deleteById(ID var1);
// 刪除數據(實測也是根據id,不會根據其他條件)
void delete(T var1);
// 根據集合內對象的id,批量刪除數據
void deleteAll(Iterable<? extends T> var1);
// 清空表
void deleteAll();
JpaRepository與其大同小異,不同的有兩點:
- JpaRepository有flush等機制,詳情請參考文件Spring Data/Jpa //TODO
- JpaRepository中deleteAllInBatch()與繼承父類的deleteAll();deleteInBatch()與繼承父類的deleteAll(Iterable<? extends T> var1)的區別就是,后者是一條一條Sql查出來,然后循環去刪除,前者Batch是一條Sql語句,所以性能更高。
Service例子:
@Service
// 在類上聲明,開啟所有public權限方法的事務處理
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserDaoCrud userDaoCrud;
@Override
public void save(User entity) {
userDaoCrud.save(entity);
}
}
四、Controller編寫
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/toRegister")
public void register(User user, HttpServletResponse response) throws IOException {
userService.save(user);
// 隨便跳個網頁
response.sendRedirect("http://www.baidu.com");
}
}
然后輸入網址:http://localhost:8080/sshTest/user/toRegister?username=admin&password=123
