1.导包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connectojava</artifactId>
<scope>runtime</scope><!--8.0.16-->
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
2.配置文件
server.port=8006
#数据库配置相关
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis-plus?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=system
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#jpa 配置相关
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=true
3.编写实体类
@Data
@Entity
@Table(name = "student")
public class Student implements Serializable {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private long id;
@Column(name = "student_id")
private long studentId;
private String name;
private int age;
private String address;
private String email;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
}
4.编写dao接口继承JpaRepository<entity.class, ID>(不用注解,继承这个类会自动注入)
public interface StudentDao extends JpaRepository<Student, Long> {
}
5.注入StudentDao调用基本方法
studentDao.save(student);
studentDao.findAll();
6.在StudentDao中自定义方法
public interface StudentDao extends JpaRepository<Student, Long> {
public List<Student> findByName(String name);
}
7.在service中引入EntityManager自定义查询
@PersistenceContext
private EntityManager em;
public Student findByAge(int age) {
String hql = "from Student where age = :age";
TypedQuery<Student> query = em.createQuery(hql, Student.class);
query.setParameter("age", age);
Student student = query.getResultList().get(0);
return student;
}
public Student findMinAge() {
String sql = "select * from student where age = (select min(age) from student)";
Query query = em.createNativeQuery(sql, Student.class);
List<Student> list = query.getResultList();
return list.get(0);
}
// 测试jpa对象封装,SimpleStudent类上要加@Entity,id上加@Id
public List<SimpleStudent> getSimple() {
String sql= "select id, name, age from student";
Query query = em.createNativeQuery(sql, SimpleStudent.class);
List<SimpleStudent> list = query.getResultList();
return list;
}
// 自定义普通类封装
public List<SimpleStudent2> getSimple2() {
String sql= "select name, age from student";
Query query = em.createNativeQuery(sql);
query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(SimpleStudent2.class));
List<SimpleStudent2> list = query.getResultList();
return list;
}
EntityManager查询相关
查询单表返回单表对象
Person person = em.find(Person.class, 2);
createQuery ------------>针对HPQL query
查询返回单表结果
1. TypedQuery<User> query = em.createQuery("from User", User.class);
List<User> list = query.getResultList();
return list;
2. Query query = em.createQuery("from User");
List list = query.getResultList();
System.out.println(list.size());
List<User> uList = new ArrayList<User>();
Iterator it = list.iterator();
while(it.hasNext()) {
uList.add((User)it.next());
}
return uList;
3. TypedQuery<User> query = em.createQuery("from User where id = :id", User.class);
query.setParameter("id", "4028b881679195640167919567a00000");
List<User> list = query.getResultList();
返回多表查询返回实体类 ------------>构造方法查询
String hql = "select new "+SimpleUser.class.getCanonicalName()+"(u.name, u.age, o.orderNum) "
+ "from User u, Order o where u.orderNum = o.orderNum and u.id = :id";
TypedQuery<SimpleUser> query = em.createQuery(hql,SimpleUser.class);
query.setParameter("id", uuid);
List<SimpleUser> list = query.getResultList();
return list.get(0);
其中SimpleUser是普通实体类并未关联表且有默认构造方法,返回字段构造方法
查询数量及设置数量
1. String hql = "select count(*) from User";
TypedQuery<Number> query = em.createQuery(hql,Number.class);
int num = ((Number)query.getSingleResult()).intValue();
return num;
2. query.setFirstResult(0);
query.setMaxResults(2);
createNativeQuery --------------->针对SQL query
1.将查询结果封装到对象中
String sql = "select name,age from t_user where id = :id";
Query query = em.createNativeQuery(sql);
query.setParameter("id", uuid)
.unwrap(NativeQueryImpl.class)
.setResultTransformer(Transformers.aliasToBean(SimpleUser.class));
List<SimpleUser> list = query.getResultList();
return list.get(0);
查询出来的结果按顺序封装,所以查询的结果需要与SimpleUser中的属性对应,并不会自动填充所以名字不需要对应
2.将查询出来的结果封装到map中(hibernate5.2已作废SQLQuery改用NativeQueryImpl)
String hql = "select * from t_user";
Query query = em.createNativeQuery(hql);
query.setFirstResult(0);
query.setMaxResults(2);
query.unwrap(NativeQueryImpl.class)
.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List<Map<String,Object>> list = query.getResultList();
return list;
3.返回List<Object[]>或Object[]
String sql = "select * from t_user where id = :id";
Query query = em.createNativeQuery(sql);
query.setParameter("id", uuid);
List<Object[]> list = query.getResultList();
return list.get(0);
4.查询结果封装到和表关联的entity中(实体类必须跟表对应)
String sql = "select * from t_user where id=:id";
Query query = em.createNativeQuery(sql,User.class);
query.setParameter("id", uuid);
List<User> list = query.getResultList();
return list.get(0);
5.查询数量
String sql = "select count(*) from t_user";
Query query = em.createNativeQuery(sql);
return ((Number)query.getSingleResult()).intValue();
备注:更新是executeUpdate()方法,删除是remove()方法