转载自: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的相关条件。那么他就不满足了。