导入方式
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
配置
spring:
datasource:
password: 123456
username: root
url: jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=CTT&allowMultiQueries=true
driver-class-name: com.mysql.jdbc.Driver
jpa:
# 开发开启 开启逆向工程 正向 根据实体类 生成表 逆向 根据表生成实体类
generate-ddl: true
hibernate:
# create 每次运行 将原来的表删除 重新创建一个表
# update 将实体类和表进行校正更新
# validate 将实体类和表进行校正更新 不一致会抛出异常
ddl-auto: none
# 展示sql语句
show-sql: true
# 指定了数据库的类型
# database-platform: org.hibernate.dialect.MySQL57InnoDBDialect
映射方式
@Entity 映射 表——对象
@Column 映射 属性——字段 columnDefinition 默认值
@Id 主键id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 主键生成策略 自增
默认驼峰转下划线,如果需要定制则加上注解@Table(name = "table_name") 如果报Cannot resolve table 'table_name' 则需要在view->Tool Windows->Persistence 然后右击项目:选择Assign Data Source中选择相应的数据库Data Source就可以了
@Data
@Entity
@Table(name = "sns_moment")
public class SnsMoment {
@Id
// 主键生成策略 自增
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column
private String content;
@Column(columnDefinition = "0")
private Integer status; //动态状态: 0-normal, 1-deleted
}
查询方式
1、接口中定义好的方法进行查询JpaRepository<T, ID>
2、jpql
jpa query language(jpa查询语句)
在接口方法上加上注解@query
3、sql原生语句 @Query注解中nativeQuery属性设为true
4、方法名称规则 使用jpa提供的方法名称规则定义方法,不需要配置jpql或sql
findBy(开头) 对象属性 like and between 等等
5、JpaSpecificationExecutor自定义动态查询。可配合if等动态语句使用。
更新和删除语句不仅需要@Query注解,还需要@Modifying注解。并在调用方方法上加上注解@Transactional(rollbackOn = {Exception.class})和@Rollback(value = false),Rollback不加会自动回滚
public interface SnsMomentDao extends JpaRepository<SnsMoment, Integer>,JpaSpecificationExecutor<SnsMoment> {
@Query(value="from SnsMoment where id=?1")
SnsMoment myFind(Integer id);
@Query(value="select * from sns_moment", nativeQuery=true)
List<SnsMoment> myFindAll(Integer id);
// 更新操作需要添加Modifying注解 和Transactional Rollback
@Query(value="update SnsMoment set shareCount=2 where id=?1")
@Modifying
Integer update(Integer id);
List<SnsMoment> findByContentLikeAndStatus(String count, Integer status);
}
@Test
// @Transactional(rollbackOn = {Exception.class})
// @Rollback(value = false)
public void test(){
// List<SnsMoment> list = snsMomentDao.findAll();
// for(SnsMoment snsMoment : list){
// System.out.println(snsMoment.getId());
// }
// snsMomentDao.save(new SnsMoment());
// System.out.println(snsMomentDao.update(1));
// System.out.println(snsMomentDao.myFind(1));
List<SnsMoment> list = snsMomentDao.findByContentLikeAndStatus("%测试%", 1);
System.out.println(list.size());
for(SnsMoment snsMoment : list){
System.out.println(snsMoment.getId()+ "--" +snsMoment.getContent());
};
String keyword = "测试";
Specification<SnsMoment> specification = new Specification<SnsMoment>() {
@Override
public Predicate toPredicate(Root<SnsMoment> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
Path<Object> status = root.get("status");
Path<Number> type = root.get("type");
Path<Object> content = root.get("content");
Predicate predicate1 = criteriaBuilder.equal(status, 1);
// return predicate1;
Predicate predicate2 = criteriaBuilder.lt(type, 1);
Predicate and = criteriaBuilder.and(predicate1, predicate2);
// criteriaBuilder.or(predicate1, predicate2);
// return and;
if(StringUtils.isNotEmpty(keyword)) {
Predicate predicate3 = criteriaBuilder.like(content.as(String.class), "%"+keyword+"%");
Predicate and2 = criteriaBuilder.and(predicate3, and);
return and2;
}
else{
return and;
}
}
};
// Sort sort = Sort.by(Sort.Direction.DESC, "createTime");
// List<SnsMoment1> all = snsMomentDao.findAll(specification, sort);
// System.out.println(all.size());
Pageable pageable = PageRequest.of(0, 2, Sort.by(Sort.Direction.ASC, "id"));
Page<SnsMoment> all = snsMomentDao.findAll(specification, pageable);
System.out.println(all.getTotalElements()+"--"+all.getSize()+"__"+all.getContent().size());
for(SnsMoment snsMoment : all){
System.out.println(snsMoment.getId()+"--"+snsMoment.getCreateTime());
}
}