电子商务网站建设c,网站注册申请,python开发订阅号,优设网官网app## 一、Spring Data JPA 介绍
JPA#xff08;Java Persistence API#xff09;Java持久化API#xff0c;是 Java 持久化的标准规范#xff0c;Hibernate是持久化规范的技术实现#xff0c;而Spring Data JPA是在 Hibernate 基础上封装的一款框架。
开发环境
Spring Boo…## 一、Spring Data JPA 介绍
JPAJava Persistence APIJava持久化API是 Java 持久化的标准规范Hibernate是持久化规范的技术实现而Spring Data JPA是在 Hibernate 基础上封装的一款框架。
开发环境
Spring Boot 2.0.4Spring Data JPA 2.0.4MySQL 8.0.12JDK 8IDEA 2018.2Windows 10 二、集成步骤
2.1 配置依赖
添加Spring Data JPA 和 MySQL Connector配置pom.xml文件代码如下
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-jpa/artifactIdversion2.0.4.RELEASE/version
/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.12/version
/dependency
更多JPA版本http://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa
更多Mysql版本http://mvnrepository.com/artifact/mysql/mysql-connector-java
2.2 application.properties 设置配置文件
## 数据源配置
spring.datasource.urljdbc:mysql://172.16.10.79:3306/mytestdb?serverTimezoneUTCuseSSLfalseallowPublicKeyRetrievaltrue
spring.datasource.usernameroot
spring.datasource.password123456
spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driverspring.jpa.hibernate.ddl-autoupdate
spring.jpa.database-platformorg.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sqltrue
hbm2ddl.auto自动创建|更新|验证数据库表结构dialect设置数据库引擎为InnoDBshow-sql打印sql语句方便调试
hbm2ddl.auto有四个属性
create每次加载 hibernate 时都会删除上一次的生成的表然后根据你的 model 类再重新来生成新表哪怕两次没有任何改变也要这样执行这就是导致数据库表数据丢失的一个重要原因。[删除-创建-操作]create-drop 每次加载 hibernate 时根据 model 类生成表但是 sessionFactory 一关闭表就自动删除。[删除-创建-操作-再删除]update最常用的属性第一次加载 hibernate 时根据 model 类会自动建立起表的结构前提是先建立好数据库以后加载 hibernate 时根据 model 类自动更新表结构即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后表结构是不会被马上建立起来的是要等应用第一次运行起来后才会。[没表-创建-操作 | 有表-更新没有的属性列-操作]validate每次加载 hibernate 时验证创建数据库表结构只会和数据库中的表进行比较不会创建新表但是会插入新值。[启动验证表结构验证不成功项目启动失败]
2.3 增加实体类Entity
Entity
public class User implements Serializable {IdGeneratedValueprivate Long id;Column(name name, nullable false)private String name;Column(nullable false)private int age;Column(nullable false)private String pwd;public User(){}public User(String name, int age, String pwd) {this.name name;this.age age;this.pwd pwd;}//...忽略set、get方法
}
GeneratedValue 自动生成idColumn 设置列属性name”数据库列名”Transient 不会映射到数据库
2.4 创建 Repository 接口构建业务方法
public interface UserRepository extends JpaRepositoryUser,Long {public User findByName(String name);
}
继承JpaRepository之后就继承了
Repository.save(user); // 插入或保存Repository.saveFlush(user); // 保存并刷新Repository.exists(1) // 主键查询是否存在Repository.findOne(1); // 主键查询单条Repository.delete(1); // 主键删除Repository.findByUsername(“stone”); // 查询单条Repository.findAll(pageable); // 带排序和分页的查询列表Repository.saveState(1, 0); // 更新单个字段
这些方法可以不写一行代码就可以实现对一个表的操作当然你也可以扩展一些自己的方法只需要在UserRepository里面添加方法即可。
2.5 添加、查询数据库
Controller
RequestMapping(/)
public class UserController {Autowiredprivate UserRepository userRepository;RequestMapping(/)public ModelAndView index() {userRepository.save(new User(老王,18,123456));ModelAndView modelAndView new ModelAndView(/index);modelAndView.addObject(dataSize, userRepository.findAll().size());return modelAndView;}
}
到现在为止集成 Spring Data JPA 已经全部完成了启动调试查看运行效果吧。
三、高级使用
本节高级使用将会涉及的知识点如下
事务实现根据名称自动生成SQL自定义Sql语句查询
3.1 事务实现
3.1.1 Spring事务实现步骤
实现事务只需要两步即可
步骤一、在application.properties配置数据库引擎为InnoDB spring.jpa.database-platformorg.hibernate.dialect.MySQL5InnoDBDialect 步骤二、在方法或类上标识事务Transactional
示例代码
Transactional
public void saveGroup(){userRepository.save(user);userRepository.save(user2);
}
如果出现错误就会进行事务回滚。
3.1.2 事务不生效的原因
3.1.2.1 确认数据库引擎
在application.properties配置数据库引擎为InnoDB spring.jpa.database-platformorg.hibernate.dialect.MySQL5InnoDBDialect 3.1.2.2 查看表的引擎必须为InnoDB
通过命令 show table status from mytestdb; 修改表的引擎 alter table table_name engineinnodb; 3.1.2.3 注意引入Transactional的命名空间
Transactional注解来自org.springframework.transaction.annotation包而不是javax.transaction.
3.2 根据名称自动生成SQL
JPA支持根据简单的关键字自动生成Sql查询的方法比如根据name和age的组合查询代码如下 public User findByNameAndAge(String name,int age); 使用关键字“And”即可或者查询时间区间的 public User findByStartDateBetween(Long startDate); 使用关键字“Between”即可。
更多内部支持的关键字如下表
KeywordSampleJPQL snippetAndfindByLastnameAndFirstname… where x.lastname ?1 and x.firstname ?2OrfindByLastnameOrFirstname… where x.lastname ?1 or x.firstname ?2Is,EqualsfindByFirstname,findByFirstnameIs… where x.firstname ?1BetweenfindByStartDateBetween… where x.startDate between ?1 and ?2LessThanfindByAgeLessThan… where x.age ?1LessThanEqualfindByAgeLessThanEqual… where x.age ?1GreaterThanfindByAgeGreaterThan… where x.age ?1GreaterThanEqualfindByAgeGreaterThanEqual… where x.age ?1AfterfindByStartDateAfter… where x.startDate ?1BeforefindByStartDateBefore… where x.startDate ?1IsNullfindByAgeIsNull… where x.age is nullIsNotNull,NotNullfindByAge(Is)NotNull… where x.age not nullLikefindByFirstnameLike… where x.firstname like ?1NotLikefindByFirstnameNotLike… where x.firstname not like ?1StartingWithfindByFirstnameStartingWith… where x.firstname like ?1(parameter bound with appended %)EndingWithfindByFirstnameEndingWith… where x.firstname like ?1(parameter bound with prepended %)ContainingfindByFirstnameContaining… where x.firstname like ?1(parameter bound wrapped in %)OrderByfindByAgeOrderByLastnameDesc… where x.age ?1 order by x.lastname descNotfindByLastnameNot… where x.lastname ?1InfindByAgeIn(Collection ages)… where x.age in ?1NotInfindByAgeNotIn(Collection ages)… where x.age not in ?1TruefindByActiveTrue()… where x.active trueFalsefindByActiveFalse()… where x.active falseIgnoreCasefindByFirstnameIgnoreCase… where UPPER(x.firstame) UPPER(?1)
官方文档https://docs.spring.io/spring-data/jpa/docs/2.0.9.RELEASE/reference/html/#jpa.repositories
3.3 自定义Sql语句查询
对于用户自己编写sqlSpring Boot JPA也有很好的支持只需要添加Query(sql)即可。
示例代码
Transactional
Modifying
Query(update User set name?1 where id?2)
public int modifyName(String name,Long id);
注意在执行修改和删除的时候必须添加Modifying注解ORM才知道要执行写操作update/delete query 的时候也必须需要加上Transactional事务才能正常操作。
四、常见错误
在 Spring Data JPA 的使用当中可能会遇到如下的一些错误。
1.No default constructor for entity
实体类Entity没有空参数的默认构造函数新增即可解决。
2.java.sql.SQLException: Access denied for user ”’172.17.0.1’ (using password: NO)
启动项目报错用户名和密码配置的key有误MySQL8的用户名和密码配置和之前的不一样MySQL 8 正确的用户名密码配置如下
spring.datasource.usernameroot
spring.datasource.password123456
# 以下为配置老数据库驱动配置
#spring.datasource.data-usernameroot
#spring.datasource.data-password123456
3.Caused by: java.lang.IllegalStateException: Cannot load driver class: com.mysql.jdbc.Driver
MySQL 8 的spring.datasource.driver-class-name配置需要改为“com.mysql.cj.jdbc.Driver”而不是“com.mysql.jdbc.Driver”正确配置如下
spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver