JpaRepository继承自PagingAndSortingRepository接口,JpaRepository基于JPA的Repository接口,极大减少了JPA作为数据访问的代码,JpaRepository是实现Spring Data JPA技术访问数据库的关键接口。

 

 

数据库表设计:

CREATE TABLE T_USER(

USER_ID INT NOT NULL AUTO_INCREMENT,

USER_NAME VARCHAR(20),

SEX VARCHAR(1),

AGE INT,

PRIMARY KEY(USER_ID)

); 示例:简单条件查询 创建持久化类 程序清单:/demo/src/main/java/com/example/demo/model/User.java

package com.example.demo.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="t_user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer userId; private String userName; private String sex; private Integer age; public User() {} public User(String userName,String sex,Integer age) { this.userName=userName; this.sex=sex; this.age=age; } public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }

@Entity 表明该类 (UserEntity) 为一个实体类,它默认对应数据库中的表名是user。这里也可以写成:

  @Entity(name = "t_user")

  或者

  @Entity  @Table(name = "t_user", schema = "test")

  查看@Entity注解,发现其只有一个属性name,表示其所对应的数据库中的表名

@Table 当实体类与其映射的数据库表名不同名时需要使用 @Table注解说明,该标注与 @Entity 注解并列使用,置于实体类声明语句之前,可写于单独语句行,也可与声明语句同行。

  @Table注解的常用选项是 name,用于指明数据库的表名。

  @Table注解还有两个选项 catalog 和 schema 用于设置表所属的数据库目录或模式,通常为数据库名。

@Table(name = "t_user", schema = "test")

@Id:指定表的主键。

@GeneratedValue 用于标注主键的生成策略,通过strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略:SqlServer对应identity,MySQL 对应 auto increment。

在javax.persistence.GenerationType中定义了以下几种可供选择的策略: 

–IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle 不支持这种方式; 

–AUTO: JPA自动选择合适的策略,是默认选项; 

–SEQUENCE:通过序列产生主键,通过@SequenceGenerator 注解指定序列名,MySql不支持这种方式 

–TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。

推荐写法:@GeneratedValue(strategy=GenerationType.AUTO)

 

 

定义数据访问层接口

程序清单:/demo/src/main/java/com/example/demo/repository/UserRepository.java

package com.example.demo.repository; import com.example.demo.model.User import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<User, Integer> { User findByUserName(String userName); List<User> findByUserNameAndAge(String userName,Integer age); List<User> findByUserNameLike(String userName); }

定义业务层类

程序清单:/demo/src/main/java/com/example/demo/service/UserService.java

package com.example.demo.service; import java.util.List; import javax.annotation.Resource; import javax.transaction.Transactional; import org.springframework.stereotype.Service; import com.example.demo.model.User; import com.example.demo.repository.UserRepository; @Service public class UserService { @Resource private UserRepository userRepository; @Transactional public void saveAll(List<User> users) { userRepository.saveAll(users); } public User getUserByUserName(String userName) { return userRepository.findByUserName(userName); } public List<User> getUserByUserNameAndAge(String userName,Integer age){ return userRepository.findByUserNameAndAge(userName, age); } public List<User> getUserByUserNameLike(String userName){ return userRepository.findByUserNameLike(userName); } }

定义控制器类

程序清单:/demo/src/main/java/com/example/demo/controller/UserController.java

package com.example.demo.Controller; import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.example.demo.model.User; import com.example.demo.service.UserService; @RestController @RequestMapping("/user") public class UserController { @Resource private UserService userService; @RequestMapping("/save") public String save() { User user1=new User("john","男",25); User user2=new User("lucy","女",18); User user3=new User("Tom","男",16); List<User> users=new ArrayList<>(); users.add(user1); users.add(user2); users.add(user3); userService.saveAll(users); return "保存成功"; } @RequestMapping("/userName") public User getByUserName(String userName){ return userService.getUserByUserName(userName); } @RequestMapping("/userNameAndAge") public List<User> getByUserNameAndAge(String userName,Integer age){ return userService.getUserByUserNameAndAge(userName, age); } @RequestMapping("/userNameLike") public List<User> getByUserNameLike(String userName){ return userService.getUserByUserNameLike(userName); } }

测试应用

添加用户信息,在浏览器中输入以下地址:http://localhost:8080/user/save

根据姓名和年龄查询,在浏览器中输入以下地址:http://localhost:8080/user/userNameAndAge?userName=john&age=25

根据姓名模糊查询,在浏览器中输入以下地址:http://localhost:8080/user/userNameLike?userName=jack