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