需求分析:
- 搭建SpringData連接配接MySql的環境,并成功運作
技術難點分析
- 如何配置資料源的連接配接
- 如何配置實體類到表的映射
- bean和repostory如何配置
需求實作
- 導入依賴
最開始我們需要導入相關的依賴:
<dependency>
<groupId>org.springframework.boot</groupId
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
- 配置資料源
在springboot,我們資料源的配置隻需要寫在application.properties檔案中,springboot會自動找到該檔案,并進行配置。其内容如下:
spring.datasource.url=jdbc:mysql://localhost:/sys
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.hbm2ddl.auto=create
-
編寫實體類
我們給實體類加上@Entity加上注解後,實體類User會将首字母變為小寫和資料庫中的user表相對應。
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
@Column(nullable=false)
private String name;
@Column(nullable=false)
private Integer age;
public User(){}
public User(String name, Integer age){
this.name = name;
this.age = age;
}
省略get/set方法。。。
}
-
編寫Repository
我們寫一個自己的接口UserRepository來繼承JpaRepository接口,規範的接口方法會自動被解析為正确的查詢語句。在SpringData中的Repository中為我們提供了實作類,是以我們這裡隻需要定義接口就行了。
@Repository
public interface UserRepository extends JpaRepository<User, Long>{
User findByName(String name);
User findByNameAndAge(String name, Integer age);
@Query("from User u where u.name=:name")
User findUser(@Param("name") String name);
}
-
編寫JavaConfig配置類
到目前為止,這類Bean都隻是被定義了,相當于他們還是散落在容器外的沙石,我們需要這些沙石來建造房屋。那麼我們需要JavaConifg來對其進行配置,這樣這些沙石才能被spring容器所管理,變成真正有用的材料。
@Configuration
@ComponentScan
@EnableJpaRepositories
public class ApplicationConfig {
}
我們可以看到這裡配置的類中什麼都沒有,這是因為我們在通過注解的方式來自動配置這些類。@Component注解會掃描目前類所在的包,及其子包找到那些有@Controller、@Service、@Repository等注解的類,并把他們注冊到spring容器中。但是要注意這裡我們必須要加上@EnableJpaRepositories,這個是比較特殊的因為用它注解的是一個接口,即我們的UserRepository 接口,通過@Component是不能達到注冊這個Repository目的的。
- 編寫測試類
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(ApplicationConfig.class)
public class ApplicationTest {
@Autowired
private UserRepository userRepository;
@Test
public void test() throws Exception {
// 建立10條記錄
userRepository.save(new User("AAA", ));
userRepository.save(new User("BBB", ));
userRepository.save(new User("CCC", ));
userRepository.save(new User("DDD", ));
userRepository.save(new User("EEE", ));
userRepository.save(new User("FFF", ));
userRepository.save(new User("GGG", ));
userRepository.save(new User("HHH", ));
userRepository.save(new User("III", ));
userRepository.save(new User("JJJ", ));
// 測試findAll, 查詢所有記錄
Assert.assertEquals(, userRepository.findAll().size());
// 測試findByName, 查詢姓名為FFF的User
Assert.assertEquals(, userRepository.findByName("FFF").getAge().longValue());
// 測試findUser, 查詢姓名為FFF的User
Assert.assertEquals(, userRepository.findUser("FFF").getAge().longValue());
// 測試findByNameAndAge, 查詢姓名為FFF并且年齡為60的User
Assert.assertEquals("FFF", userRepository.findByNameAndAge("FFF", ).getName());
// 測試删除姓名為AAA的User userRepository.delete(userRepository.findByName("AAA"));
// 測試findAll, 查詢所有記錄, 驗證上面的删除是否成功
Assert.assertEquals(, userRepository.findAll().size());
}
}