用SpringData的JpaRepository连接MySQL的一个超简单的实践

需求分析:

  • 搭建SpringData连接MySql的环境,并成功运行

技术难点分析

  • 如何配置数据源的连接
  • 如何配置实体类到表的映射
  • bean和repostory如何配置

需求实现

  • 导入依赖

最开始我们需要导入相关的依赖:

<dependency>
        <groupId>org.springframework.bootgroupId
        <artifactId>spring-boot-starter-data-jpaartifactId>
dependency>
<dependency>
    <groupId>mysqlgroupId>
    <artifactId>mysql-connector-javaartifactId>
    <version>5.1.21version>
dependency>
  • 配置数据源

在springboot,我们数据源的配置只需要写在application.properties文件中,springboot会自动找到该文件,并进行配置。其内容如下:

spring.datasource.url=jdbc:mysql://localhost:3306/sys
spring.datasource.username=root
spring.datasource.password=123
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", 10));
        userRepository.save(new User("BBB", 20));
        userRepository.save(new User("CCC", 30));
        userRepository.save(new User("DDD", 40));
        userRepository.save(new User("EEE", 50));
        userRepository.save(new User("FFF", 60));
        userRepository.save(new User("GGG", 70));
        userRepository.save(new User("HHH", 80));
        userRepository.save(new User("III", 90));
        userRepository.save(new User("JJJ", 100));

        // 测试findAll, 查询所有记录
        Assert.assertEquals(10, userRepository.findAll().size());

        // 测试findByName, 查询姓名为FFF的User
        Assert.assertEquals(60, userRepository.findByName("FFF").getAge().longValue());

        // 测试findUser, 查询姓名为FFF的User
        Assert.assertEquals(60, userRepository.findUser("FFF").getAge().longValue());

        // 测试findByNameAndAge, 查询姓名为FFF并且年龄为60的User
        Assert.assertEquals("FFF", userRepository.findByNameAndAge("FFF", 60).getName());

        // 测试删除姓名为AAA的User    userRepository.delete(userRepository.findByName("AAA"));

        // 测试findAll, 查询所有记录, 验证上面的删除是否成功
        Assert.assertEquals(9, userRepository.findAll().size());
    }
}

你可能感兴趣的:(Spring,Data)