一、SpringDataJPA
spring data:其实就是spring 提供的一个操作数据的框架。而spring data JPA 只是spring data 框架下的一个基于JPA标准操作数据的模块。
spring data jpa :基于JPA的标准对数据进行操作。简化操作持久层的代码,只需要编写接口就可以。
使用jpa的命名查询
当使用findBy/readBy/getBy + 某个字段时,比如:
User findById(String id);
也可以多字段查询,如:
List<User> findByCodeAndUsername(String code,String username);
spring jpa的相关命名规则如下:
自定义注解查询
除了继承JpaRepository中的命名方法,有时候不可避免的要自定义查询方法。上面的单元测试中findOne就是自定义的查询方法。
使用@Query注解来查询,注解查询本质上仍然使用的是HQL语法,所以下面的是针对对象查询的。(我在测试时由于粗心大意将User写成user被坑了不少时间)
@Query("select u from User u where u.id = :id")
User findOne(@Param("id")String id);
二、整合SpringDataJPA
pom文件引入以下依赖
<dependencies>
<!-- Spring Boot web依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- JPA的起步依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MySQL连接驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
创建数据库
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) DEFAULT NULL,
`password` varchar(50) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES ('1', 'zhangsan', '123', '张三');
INSERT INTO `user` VALUES ('2', 'lisi', '123', '李四');
application.properties配置
#DB Configuration:
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
#JPA Configuration:
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
代码编写
创建实体配置实体
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private Integer id;
@Column
private String username;
@Column
private String password;
@Column
private String name;
//此处省略setter和getter方法... ...
}
UserDao
public interface UserDao extends JpaRepository<User, Integer> {
}
UserService
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public User findUserById(int id) {
Optional<User> optional = userDao.findById(id);
return optional.get();
}
}
Controller
@RestController
public class UserController {
@Autowired
private UserService userService;
// http://localhost:8080/user/1
@RequestMapping("/user/{id}")
private User findUserById(@PathVariable Integer id) {
User user = userService.findUserById(id);
return user;
}
}