导入方式
配置
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
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,JpaSpecificationExecutor {
@Query(value="from SnsMoment where id=?1")
SnsMoment myFind(Integer id);
@Query(value="select * from sns_moment", nativeQuery=true)
List myFindAll(Integer id);
// 更新操作需要添加Modifying注解 和Transactional Rollback
@Query(value="update SnsMoment set shareCount=2 where id=?1")
@Modifying
Integer update(Integer id);
List findByContentLikeAndStatus(String count, Integer status);
}
@Test
// @Transactional(rollbackOn = {Exception.class})
// @Rollback(value = false)
public void test(){
// List 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 list = snsMomentDao.findByContentLikeAndStatus("%测试%", 1);
System.out.println(list.size());
for(SnsMoment snsMoment : list){
System.out.println(snsMoment.getId()+ "--" +snsMoment.getContent());
};
String keyword = "测试";
Specification specification = new Specification() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery> criteriaQuery, CriteriaBuilder criteriaBuilder) {
Path