参考的文章:
https://www.jianshu.com/p/c23c82a8fcfc
https://blog.csdn.net/qq_42495847/article/details/107991361
一、步骤
- 创建一个空的maven项目,引入对应的数据库驱动和spring-boot-start-data-jpa
- 编写配置文件
- 创建实体类(实体类的格式和hibernate一样一些注解),创建Repository接口(和mybatis的Mapper接口是同一个概念)
- 创建Service类和对应的实现类
- 在controller中使用这些Service
二、配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| spring.application.name=spring-data-jpa-demo
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.name=defaultDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/sdj?serverTimezone=Asia/Shanghai
spring.datasource.username=root spring.datasource.password=123456
spring.jpa.database=mysql spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
|
注意:spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect是用来配置mysql的innodb引擎的,如果用的是mysql,不加这个配置,将使用myisam引擎。
三、注解
- @Repository用来定义dao接口,和mybatios的@Mapper是一个概念
四、Repository接口的写法
1 2 3 4 5 6 7 8 9 10 11 12
| public interface UserRepository extends JpaRepository<User, String> { @Query(value="select * from student where id = ?1",nativeQuery=true) List<Student> queryStudents(Integer id); @Query(value="delete from student where id=?1 and name=?2",nativeQuery=true) @Modifying @Transactional void deleteStudent(Integer id,String name) }
|
一个完整的repository接口,只要继承了JpaRepository就行了,其他的东西不写,注意一下实体类,和实体的id类型就行。写好之后,直接在service实现类中注入即可使用
自定义查询语句(在Repository中定义)
1 2 3 4 5 6 7 8
| @Repository public interface StudentRepository extends JpaRepository<Student,Integer> { @Query(value = "select * from student s where s.banji_id = ?1",nativeQuery = true) List<Student> queryStudentByBanji(Integer banji_id); }
|
大坑:如果是自定义的删除和修改操作,还需要加上@Modify和@Transactional注解
五、操作数据库的方法
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
| @Service public class UserServiceImpl implements UserService{
@Resource UserRepository userRepository;
@Override public User insertUser(User user) { return userRepository.save(user); }
@Override public void deleteUser(String id) { userRepository.deleteById(id); }
@Override public User update(User user) { return userRepository.save(user); }
@Override public List<User> findAllUser() { return userRepository.findAll(); }
@Override public User findUserById(String id) { return userRepository.findById(id).orElse(null); } }
|
注意:虽然插入和更新的方法都是用save实现的,根据传进去的对象是否带有id,进行判断,如果有id,那就说明是要修改数据;如果没有id,说明是要插入新的数据,id会根据@GeneratedValue()里面的配置帮你生成