Spring MVC 连接 MySQL 数据库 JPA

在上一篇博客《Spring MVC 连接 MySQL 数据库 Hibernate》中介绍了在 Spring MVC 中使用 Hibernate 来链接数据库,虽然比 JDBC 方便了很多,但复杂一些的查询还是很麻烦,有没有更方便的方法?当然有,在 Java EE 5 规范中已经提出的 Java 持久化接口 Java Persistence API 简称 JPA。它吸取了目前 Java 持久化技术的优点,旨在规范、简化 Java 对象的持久化工作。JPA 的宗旨是为 POJO 提供持久化标准规范,并不是依赖于某一个ORM框架,Hibernate3.2+、TopLink 10.1.3 以及 OpenJPA 都提供了 JPA 的实现。JPA 的总体思想和现有 Hibernate、TopLink、JDO等ORM框架大体一致。主要提供:ORM 映射元数据、操作实体对象 API、查询语言。

在 Spring 2.0.1 中,正式提供对 JPA 的支持。Spring 使得 JPA 配置变得更加灵活,将 EntityManager 的创建与销毁、事务管理等代码抽取出来,并由其统一管理,开发者只需关心核心业务逻辑的实现代码,无需过多关注 EntityManager 的创建、事务处理等 JPA 相关的处理。Spring Data JPA 则更进一步,主要针对的就是 Spring 唯一没有简化到的业务逻辑代码,通过规范方法的名字,根据符合规范的名字来确定方法需要实现什么样的逻辑,开发者连仅剩的实现持久层业务逻辑的工作都省了,唯一要做的,就只是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成!

JPA 只是一种规范,需要 Provider 来实现其功能的,Hibernate 就是 JPA Provider 中很强的一个,从功能上来说,JPA 就是 Hibernate 功能的一个子集。Hibernate 从3.2开始,就开始兼容 JPA。我们还是通过项目来学习简单的 JPA 操作,还是可以使用上次的 spring-mvc-mysql 项目稍作修改,不过改成用 Hibernate 分支。

pom.xml

添加 spring-data-jpa

1
2
3
4
5
6
<!-- Spring Data JPA -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>${spring.jpa.version}</version>
</dependency>

Dao

在 com.aidansu.demo.dao 包下创建 UserRepository 类,并把其余的类删除

1
2
3
4
5
6
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
User findById(long id);
}

DataBaseConfig

修改数据库配置类,类名上面添加以下注解

1
@EnableJpaRepositories("com.aidansu.demo.dao")

把原来的 sessionFactory() 和 transactionManager() 方法修改成下面的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
* Configures the entity manager factory.
*
* @return entityManagerFactoryBean.
*/
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource());
entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
entityManagerFactoryBean.setPackagesToScan(environment.getRequiredProperty(PROPERTY_NAME_ENTITY_MANAGER_PACKAGES_TO_SCAN));
Properties jpaProterties = new Properties();
jpaProterties.put(PROPERTY_NAME_HIBERNATE_DIALECT, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
jpaProterties.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_FORMAT_SQL));
jpaProterties.put(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO));
jpaProterties.put(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY));
jpaProterties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
jpaProterties.put("hibernate.connection.CharSet", "UTF-8");
jpaProterties.put("hibernate.connection.characterEncoding", "UTF-8");
jpaProterties.put("hibernate.connection.useUnicode", "true");
entityManagerFactoryBean.setJpaProperties(jpaProterties);
return entityManagerFactoryBean;
}
/**
* configures the transaction manager.
*
* @return transactionManager.
*/
@Bean
public JpaTransactionManager transactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}

Service

修改业务层的调用,把 UserServiceImpl 实现类改成如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@Service("userService")
public class UserServiceImpl implements UserService {
@Resource
private UserRepository userRepository;
@Override
public void insert(User user) {
userRepository.save(user);
}
@Override
public void update(User user) {
userRepository.save(user);
}
@Override
public void delete(long id) {
User user = userRepository.findOne(id);
if (user != null){
userRepository.delete(user);
}
}
@Override
public User findById(long id) {
return userRepository.findById(id);
}
@Override
public User findByUsername(String username) {
return userRepository.findByUsername(username);
}
@Override
public List<User> findAll() {
return userRepository.findAll();
}
}

通过简单的修改,就可以使用 JPA 提供的各种方法。发现项目中再也没有 SQL 语句了,持久化层更加简单了。

Run

需要在 Tomcat 容器上运行,点击 Run,服务器就会启动在 http://localhost:8080 端口上。

本次项目 spring-mvc-mysql 的项目代码已经放在 github 上,有需要的同学可以下载查看。地址: https://github.com/aidansu/spring-mvc-mysql/tree/JPA 分支 JPA

想了解更多关于 Spring Data JPA 框架信息的可以查看最新的官方文档: http://docs.spring.io/spring-data/jpa/docs/current/reference/html/

完!

坚持原创技术分享,您的支持将鼓励我继续创作!