小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
JPA(Java Persistence API)是Sun官方提出的Java持久化规范,主要实现有Hibernate、OpenJpA等。Spring Data JPA是Spring Data的一个子项目,通过提供基于JPA的Respositoty极大地减少了JPA作为数据访问方案的代码量。
创建表
CREATE TABLE `tb_user` (
`id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_name` varchar(32) NULL DEFAULT NULL COMMENT '用户名',
`password` varchar(255) NULL DEFAULT NULL COMMENT '密码',
`sex` varchar(2) NULL DEFAULT NULL COMMENT '性别 1-男 2-女 3-未知',
`age` int NULL DEFAULT NULL COMMENT '年龄',
`email` varchar(64) NULL DEFAULT NULL COMMENT '邮箱',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_username`(`user_name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 0 COMMENT = '用户表' ROW_FORMAT = Dynamic;
引入依赖
<!--Spring data JPA-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--mysql connector-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
添加配置文件
spring.datasource.url=jdbc:mysql://localhost:3306/miracle
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql= true
添加实体类和Dao
@Data
@Entity
@Table(name = "tb_user")
public class User {
@Id
@GeneratedValue
private Integer id;
@Column
private String userName;
@Column
private String password;
@Column
private String sex;
@Column
private Integer age;
@Column
private String email;
@Column
private LocalDateTime createTime;
@Column
private LocalDateTime updateTime;
}
-
@Entity :每个持久化 POJO 类都是一个实体 Bean ,通过在类的定义中使用Entity 注解来进行声明
-
Table :声明此对象映射 数据库 数据表。该 不是必需的,如果没有,系统就会使用默认值(实体的短类名)。
-
Id :指定表的主键
我们创建一个UserRepository
接口类继承JpaRepository
:
public interface UserRepository extends JpaRepository<User, Integer> {
User findByUserName(String userName);
}
JpaRepository
接口是PagingAndSortingRepository
和CrudRepository
的子类,CrudRepository
类提供了基本的增删改查等接口,PagingAndSortingRepository
类提供了基本的分页和排序等接口。除此之外,我们还可以自定义查询方法。比如上面的findByUserName
方法,就是根据用户名进行查询。Spring Data JPA为我们预定了一系列规范,只要我们按照规范编写代码,Spring Data JPA就会根据代码翻译成相关的SQL语句,进行数据库查询。比如可以使用findBy、Like、In等关键字,其中findBy可以用read、readBy、query、queryBy、get、getBy来代替。更多查询方式可以参见官方文档。
服务类实现
public interface UserService {
Optional<User> findById(int id);
User findByUsername(String username);
List<User> findAll();
Page<User> findAll(Pageable pageable);
void save(User user);
void delete(User user);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public Optional<User> findById(int id) {
return userRepository.findById(id);
}
@Override
public User findByUsername(String username) {
return userRepository.findByUserName(username);
}
@Override
public List<User> findAll() {
return userRepository.findAll();
}
@Override
public Page<User> findAll(Pageable pageable) {
return userRepository.findAll(pageable);
}
@Override
public void save(User user) {
userRepository.save(user);
}
@Override
public void delete(User user) {
userRepository.delete(user);
}
}
就这几行代码已经实现了一个比较完整的增删查逻辑了,下面我们来测试一下,可以写个Controller,这里我们使用SpringBoot Test来测试。
测试
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class UserServiceImplTest {
@Autowired
private UserService userService;
@Test
public void test() {
User user = new User("miracle", "123456", "男", 20, "kevl5sha@163.com");
User user1 = new User("miracle1", "123456", "男", 20, "kevl5sha@163.com");
userService.save(user);
userService.save(user1);
List<User> users = userService.findAll();
System.out.println(users);
User miracle = userService.findByUsername("miracle");
System.out.println(miracle);
Pageable pageable = PageRequest.of(1, 10);
userService.findAll(pageable);
userService.delete(user);
}
}