1.添加spring data jpa的依赖到pom文件中
<!-- spring data jpa 数据库持久层 -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>${springdatajpa.version}</version>
</dependency>
2.配置applicationContext.xml
<!-- 整合spring data jpa -->
<jpa:repositories base-package="com.gongxm.dao" />
3.创建包, 并在包中创建接口
包: com.gongxm.dao
接口:
public interface BookRepository extends JpaRepository<Book, Integer> { // Book是实体类, Integer是Book类对应表的主键
}
4.接口不需要写对应的实现类, spring data jpa会自动生成实现类
只需要在Service类中注入DAO即可使用:
//注入DAO
@Autowired
BookRepository bookRepository ;
5.定义的接口中, 如果没有定义方法 , 默认会有继承的CRUD方法, 如果需要增加额外的方法, 有以下三种方式:
第一种: 能过命名规则方式定义方法
例如:
public User findByName(String name); //自动根据用户名查找数据
public List<User> findByNameLike(String name); //根据姓名模糊查询到用户对象
public User findByUsernameAndPassword(String username,String password); //根据用户名和密码查询
第二种方式: 通过注解方式
@Query(value="from Book where author=?", nativeQuery=false)
public List<Book> queryBook(String author); //查询该作者的所有书籍
注意: 如果nativeQuery为false, 表示value中配置的是JPAQL, 如果nativeQuery为true,表示value中配置的是SQL
第三种方式: 在bean类上添加注解和JPAQL
1.接口中的方法这里不需要添加参数了, 只需要写注解即可
@Query
public List<Book> queryBook(String author); //查询该作者的所有书籍
2.在对应的bean类中添加注解和JPAQL:
@Entity
@Table(name = "T_BOOK")
//在这里可以配置多个方法的JPAQL语句
@NamedQueries({@NamedQuery(name="Book.queryBook",query="from Book where author=?")})
public class Book{
......
}
6.修改数据
使用spring data jpa修改数据, 单单@Query这个注解是无法完成的. 如果需要修改数据,还需要使用@Modifying注解来配合才可以完成:
@Query(value="update Book set name=?2 where id=?1")
@Modifying
public void updateName(Integer id,String name);
注意: 如果语句中的参数与方法中的参数顺序不同, 可以修改方法参数的顺序, 或者在语句中的问号后面加上序号, 表示使用方法中的第几个参数
7. 关于测试用例的注意事项
1.测试类上需要加入以下注解
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= "classpath:applicationContext.xml")
public class MyTest {
@Test
public void test() {
System.out.println("yes");
}
}
2.如果是测试DAO类, 测试方法上除了要加@Test注解, 还需要加事务注解
@Test
@Transactional
public void test() {
...
}
3.使用测试用例来测试DAO类时, 默认会把本次测试的数据从数据库中回滚, 如果不想数据回滚, 可以在方法上加上@Rollback注解
@Test
@Transactional
@Rollback(false) //防止数据回滚
public void test() {
...
}
网友评论