用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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 配置数据源
在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
- 1
- 2
- 3
- 4
- 5
- 6
- 编写实体类
我们给实体类加上@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方法。。。
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 编写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);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 编写JavaConfig配置类
到目前为止,这类Bean都只是被定义了,相当于他们还是散落在容器外的沙石,我们需要这些沙石来建造房屋。那么我们需要JavaConifg来对其进行配置,这样这些沙石才能被spring容器所管理,变成真正有用的材料。
@Configuration
@ComponentScan
@EnableJpaRepositories
public class ApplicationConfig {
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
我们可以看到这里配置的类中什么都没有,这是因为我们在通过注解的方式来自动配置这些类。@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());
}
}