值不值 | 三分鐘搞定Jpa?值不值!
本文轉載自微信公眾號「小明菜市場」,作者+小明菜市場。轉載本文請聯系小明菜市場公眾號。
數據準備
數據庫使用的數據表設計如下
建表語句如下
- SET NAMES utf8mb4;
- SET FOREIGN_KEY_CHECKS = 0;
- -- ----------------------------
- -- Table structure for t_user
- -- ----------------------------
- DROP TABLE IF EXISTS `t_user`;
- CREATE TABLE `t_user` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `user_name` varchar(255) DEFAULT NULL,
- `password` varchar(255) DEFAULT NULL,
- `last_login_time` datetime DEFAULT NULL,
- `sex` tinyint(4) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=armscii8;
- -- ----------------------------
- -- Records of t_user
- -- ----------------------------
- BEGIN;
- INSERT INTO `t_user` VALUES (1, 'json', '123', '2019-07-27 16:01:21', 1);
- INSERT INTO `t_user` VALUES (2, 'jack jo', '123', '2019-07-24 16:01:37', 1);
- INSERT INTO `t_user` VALUES (3, 'manistal', '123', '2019-07-24 16:01:37', 1);
- INSERT INTO `t_user` VALUES (4, 'landengdeng', '123', '2019-07-24 16:01:37', 1);
- INSERT INTO `t_user` VALUES (5, 'max', '123', '2019-07-24 16:01:37', 1);
- COMMIT;
- SET FOREIGN_KEY_CHECKS = 1;
新建 Spring Boot 工程
選擇 File -> New -> Project 選擇 Spring Initializr,選擇 next 填寫包名,項目名,選擇下一步。選擇依賴,Spring web starter 前面打鉤,sql 選項為 Spring Data Jpa,MySql 項目名任意
引入 Pom配置
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-jpa</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-webflux</artifactId>
- </dependency>
- <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>io.projectreactor</groupId>
- <artifactId>reactor-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
編寫配置文件 application.yml
- server:
- port: 8086
- spring:
- #通用的數據源配置
- datasource:
- driverClassName: com.mysql.jdbc.Driver
- url: jdbc:mysql://localhost:3306/demo_test?useSSL=false&useUnicode=true&characterEncoding=utf8
- username: root
- password: 123
- jpa:
- #這個參數是在建表的時候,將默認的存儲引擎切換為 InnoDB 用的
- database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
- #配置在日志中打印出執(zhí)行的 SQL 語句信息。
- show-sql: true
- hibernate:
- #配置指明在程序啟動的時候要刪除并且創(chuàng)建實體類對應的表
- ddl-auto: create
編寫示例代碼
新建實體對象 UserDao.java
實體類,需要使用 @Entity 注解標注 需要對實體類的屬性進行標注,使用 @Id 標注組件 使用 @Column 標注非主鍵
- /**
- * 用戶實體類
- * */
- @Entity
- @Table(name="t_user")
- public class UserDO {
- @Id
- private Integer id;
- @Column(name="user_name",length = 200)
- private String userName;
- @Column(name="password",length = 200)
- private String password;
- @Column(name="sex")
- private Integer sex;
- @Column(name="last_login_time")
- private Date lastLoginTime;
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public Integer getSex() {
- return sex;
- }
- public void setSex(Integer sex) {
- this.sex = sex;
- }
- public Date getLastLoginTime() {
- return lastLoginTime;
- }
- public void setLastLoginTime(Date lastLoginTime) {
- this.lastLoginTime = lastLoginTime;
- }
- }
新建倉庫接口類 UserRepository
倉庫接口類,UserRepository 是我們常用的 Dao 接口,需要注意
- 使用 @Repository 注解
- 繼承 JPARepository
- UserRepository 不需要編寫任何代碼,即可實現增刪查改
- @Repository
- public interface UserRepository extends JPARepository<UserDO,Integer> {
- }
編寫測試用例
在
- src/test/java/com/fishpro/jpa/
下,新增加
- UserRepositoryTest.java
使用
- @RunWith(SpringRunner.class)
和
- @SpringBootTest
注解標注類。
- @RunWith(SpringRunner.class)
- @SpringBootTest
- public class UserRepositoryTest{
- }
新增加用戶數據
- /**
- * 初始化一個對象 UserDO 測試Insert過程
- * */
- @Before
- public void before(){
- UserDO userDO=new UserDO();
- userDO.setId(1);
- userDO.setUserName("fishpro");
- userDO.setSex(1);
- userDO.setLastLoginTime(new Date());
- userDO.setPassword("passWord");
- userRepository.save(userDO);
- }
查詢單個用戶數據
- @Test
- public void testFind(){
- Optional<UserDO> optionalUserDO=userRepository.findById(1);
- if(optionalUserDO.isPresent()){
- UserDO userDO=optionalUserDO.get();
- System.out.println("testFind user"+userDO.getUserName());
- }
- }
查詢多個數據
- @Test
- public void testFindAll(){
- List<UserDO> list=userRepository.findAll();
- for (UserDO user:list
- ) {
- System.out.println("user_name:"+user.getUserName());
- }
- }
更新數據
- @Test
- public void testUpdate(){
- Optional<UserDO> optionalUserDO=userRepository.findById(1);
- if(optionalUserDO.isPresent()){
- UserDO userDO=optionalUserDO.get();
- userDO.setUserName("fishpro001");
- userRepository.save(userDO);
- System.out.println("testFind user"+userDO.getUserName());
- }
- }
刪除數據
- @After
- public void after(){
- userRepository.deleteById(1);
- userRepository.deleteById(2);
- userRepository.deleteById(3);
- }
聯合主鍵
例如定義表中userId,roleId 都是主鍵,此時這樣設置
1.定義一個主鍵類
- public class UserRoleKey implements Serializable {
- private Integer userId;
- private Integer roleId;
- }
2.定義實體類
- @Entity
- @Table(name="t_user_role")
- @IdClass(UserRoleKey.class) //注意這里是引入了 定義的符合主鍵類
- public class UserRoleDO {
- @Id
- private Integer userId;
- @Id
- private Integer roleId;
- public Integer getUserId() {
- return userId;
- }
- public void setUserId(Integer userId) {
- this.userId = userId;
- }
- public Integer getRoleId() {
- return roleId;
- }
- public void setRoleId(Integer roleId) {
- this.roleId = roleId;
- }
- }