最开始我们需要导入相关的依赖:
<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: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()); } }