JPA教程(第二章)

转载自:https://www.cnblogs.com/vincentren/p/9512012.html

第二章

库表

CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`school_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11123 DEFAULT CHARSET=utf8

entity

@Table(name = "student")
@Entity
public class Student {
 
    @Id
    @GeneratedValue(
            strategy = GenerationType.IDENTITY
    )
    private long id;
 
    private String name;
 
    private int age;
 
    private long schoolId;
 
    public long getId() {
        return id;
    }
 
    public void setId(long id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public long getSchoolId() {
        return schoolId;
    }
 
    public void setSchoolId(Long schoolId) {
        this.schoolId = schoolId;
    }
 
    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", schoolId=" + schoolId +
                '}';
    }
}

Repository

public interface StudentRepository extends JpaRepository<Student, Long> {
    List<Student> findByNameLike(String name);
    List<Student> findByAgeGreaterThanAndNameEquals(Integer age, String name);
}

test

@Test
  public void testAdd() {
      Student student = new Student();
      student.setAge(12);
      student.setName("abc");
      student.setSchoolId(1L);
      //如果Student在mysql中是自增,但没有加上@GeneratedValue的注解,那么在新增完成后的student1 
      //中的id是0,不是自增后的id
      Student student1 = studentRepository.save(student);
      Assert.assertTrue(student1.getId() >= 0);
  }

正如代码中的注释,新增时有个小注意点:如果entity的id并不是自增,或者id的自增策略并没有体现在entity的id属性上,即没有加@GeneratedValue的注解,那么新增后返回的值的主键是没有新增完后的id的值的。

    @Test
    public void testUpdate() {
        Student student = new Student();
        student.setAge(121);
        student.setName("cba");
        student.setSchoolId(1L);
        student.setId(111L);
        studentRepository.save(student);
    }
    @Test
    public void testSelect() {
        //like需要在参数中加"%"
        List<Student> studentList = studentRepository.findByNameLike("%a%");
        System.out.println(studentList);
    }

查询的时候如果用了like,那么参数上记得加上“%”,不然sql查询时是  select 。。。 from 。。。 where  aaa like 'a' 而不是like'%a%'

多条件查询

@Test
public void testSelect1(){
    List<Student> studentList = studentRepository.findByAgeGreaterThanAndNameEquals(22,"cba");
    System.out.println(studentList);
}

这种方式优点很明显,缺点也很明显。优点就是代码简单,只需要在Repository类中新增一条List<Student> findByAgeGreaterThanAndNameEquals(Integer age, String name);即可。缺点也很致命,这种方式的多条件,必须传多个参数,比如前台页面只传了个name,并不需要age的相关条件。那么他就不满足了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值