天天看點

用SpringData的JpaRepository連接配接MySQL的一個超簡單的實踐

需求分析:

  • 搭建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());
    }
}
           

繼續閱讀