以下内容纯属个人扯淡,仅供参考,建议拜读原著
目录
附录1:Repository Query Method 关键字列表
附录2:Repository Query Method 返回值类型
附录5:application.properties中关于JPA的配置大全
读后感
2020/8/18
个人感觉这本书很不好。
第1:书名是:SpringDataJpa从入门到精通,作为工具书关于SpringDataJpa的广度又不够,深度方面更加是浅的离谱,其他的实战类的书是点到为止,但这里是点都不全。有关广度这个问题,书里又花了将近一半的文字在讲其他内容:SpringData、SpringDataRedis、SpEL表达式等,甚至IDEA部分的图片和描述占据了很大篇幅。
第2:之前看Spring实战,各个章节分的很清楚,而且基本整体都是总-分结构,先整体结构再局部描述。而这本书说实话章节安排有些乱
第3:博客有错别字我能理解,书上有些地方有错别字,而且有些地方行文逻辑都是难以看懂。例如下面这句话,逗号前一句和逗号后一句话,这两句话逻辑是这样:可以通过......。要创建.....
第4:书的文字部分,有些感觉是东拼西凑来的,所以总是读的一段一段,思路跳跃的厉害
总之一句话:看的很难受。所以,本人只是看了2-7章,个人观点,不喜勿喷。
倒不如参考一篇博客:Spring data jpa 复杂动态查询方式总结、QueryDSL:使用QueryDSL
这篇博客开篇就说:不太推荐使用jpa做ORM框架,因为对于复杂查询时是不太灵活的,而是建议使用mybatis框架自己写sql,jpa对于简单查询是十分方便的。
1、核心方法
查询所有数据 findAll()
修改 添加数据 S save(S entity)
分页查询 Page<S> findAll(Example<S> example, Pageable pageable)
根据id查询 findOne()
根据实体类属性查询: findByProperty (type Property); 例如:findByAge(int age)
删除 void delete(T entity)
计数 查询 long count() 或者 根据某个属性的值查询总数 countByAge(int age)
是否存在 boolean existsById(ID primaryKey)
2、查询关键字(方法命名方式)
3、注解
@Modifying、@Query、@Transaction、@Async
4、继承JpaSpecificationExecutor接口进行复杂查询
可以实现多条件分页
5、引入QueryDSL
QueryDSL是基于各种ORM框架以及SQL之上的一个通用API的查询框架
第一部分:基础
第1章:整体认识JPA
概览
ORM框架对比
JPA规范
SpringData项目
SpringDataJPA
MySQL快速开发实例
1、ORM框架对比
1、MyBatis
侧重于POJO与SQL之间的映射关系,可以进行更为细致的SQL,目前占有率最高,上手容易,适合互联网应用公司开发API场景
2、Hibernate
侧重于对象与对象之间的关系
对JDBC进行了非常轻量级的对象封装。有自己的HQL查询语言,数据库移植性很好
符合JPA规范,上手难,适合企业级应用系统开发
3、Spring Data JPA
JPA规范的再次封装,底层使用Hibernate+JPA实现
引用JPQL查询语言,属于Spring生态一部分
上手简单
2、JPA规范
全称Java Persistence API(Java持久层API),是JDK5.0注解/xml描述对象关系表的映射关系(关系型数据库),并将运行期实体对象持久化到数据库中,Sun引入JPA规范的原因:简化现有JavaEE和JavaSE应用开发;整合ORM技术,实现大一统(mybatis不符合JPA规范)。其内容包括3个部分:
1、一套API标准
在javax.persistence包下
用于操作实体对象,执行CRUD操作
2、面向对象查询语言(JPQL)
避免程序的SQL紧密耦合
3、ORM元数据的映射
JPA支持xml、注解两种元数据的方式(元数据描述着对象和表之间的映射关系)
3、SpringData项目
致力于提供一个一致的、基于Spring的数据访问编程模型,支持关系数据库、NoSQL、基于云的数据服务。SpringDataCommon是所有模块的公有部分,它提供了技术中立的库接口、一个坚持Java类的元数据模型,它的子项目有:
主要子项目:Commons、Gemfire、JPA、KeyValue、LDAP、MongoDB、REST、Redis、Apache Cassandra、Apache Solr
社区支持的子项目:Aerospike、Couchbase、DynamoDB、Elasticsearch、Hazelcast、Jest、Neo4j、Vault、JDBC Extensions、Hadoop、Spring Content
4、SpringDataJPA
主要类
7个Repository接口
Repository
CrudRepository
PagingAndSortingRepository
QueryByExampleExecutor
JpaRepository
JpaSpecificationExecutor
QueryDslPredicateExecutor
2个实现类
SimpleJpaRepository
QueryDslJpaRepository
JPA底层封装类
EntityManager(javax.persistence)
EntityManagerImpl(org.hibernate.jpa.internal)
类结构
5、MySQL快速开发实例
(1)环境要求:JDK1.8+、Maven3.0+、IDEA
(2)数据库及表
数据库名=db_example,表名=user
CREATE TABLE `user` {
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`email` varchar(200) DEFAULT NULL,
PRIMARY KEY ('id')
}
(3)创建项目
IDEA中的Spring Initializr创建,选择Web、JPA、MySQL模块
(4)application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/db_example
spring.datasource.username=xxxx
spring.datasource.password=xxxx
(5)创建User实体
@Entity
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String name;
private String email;
getter/setter
}
(6)UserRepository
public class UserRepository extends CrudRepository<User,Long> {
}
(7)UserController
@Controller
@RequestMapping(path = "/demo")
public class UserController{
@Autowired
private UserRepository userRepository;
@GetMapping("/add")
public void addUser( @RequestParam String name, @RequestParam String email ){
User n = new User();
n.setName(name);
n.setEmail (email);
userRepository.save(n);
}
@GetMapping("/all")
public Iterable<User> getAllUsers(){
return userRepository.findAll();
}
}