SpringData是原先工作用到了的东西,提供一个一致性的,基于spring的项目,用来访问数据(访问数据库),现在来半预习半复习一下
特点
可以访问关系型数据库,也可以访问非关系型数据库
目的
** 减少数据访问层的开发量**
其实只需要声明一个持久层的接口
springData 包含的子项目
- Spring Data JPA
- Spring Data MongoDB
- Spring Data Redis
- Spring Data Solr (一个全文搜索的东西)
等等…..
1.传统方式访问数据库
** jdbc**
- get connection
- get statement
- resultSet
a)添加依赖
1 |
|
b)开发JDBCUtil 工具类
获取connection
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20/**
* 获取connection
* @return
*/
public static Connection getConnection() throws Exception {
//获取配置文件的方法,db.properties 是设置好的配置文件
InputStream input = JDBCUtil.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(input);
String url = properties.get("jdbc.url").toString();
String username = properties.get("jdbc.username").toString();
String driverClass = properties.get("user.driverClass").toString();
Class.forName(driverClass);
Connection conn= DriverManager.getConnection(url, username, "");
return conn;
}
db.properties,灰色的就是没有使用过的
1 | user.driverClass = com.mysql.jdbc.Driver |
** 使用 springData jdbc 模板访问数据库**
c) DAO 层开发
真的是好复古好复古的写法,DaoImpl
1 | /** |
2.Spring模板方式访问数据库—-SpringTemplet
配置xml
1 | <!-- dbcTermplet--> |
然后再dao层调用jdbcTemplet:
1 | private JdbcTemplate jdbcTemplate; |
其实这些方式代码量很多,且很重复,人力成本比较高
SpringData 方式
1.开发环境:
maven 依赖
1 | <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-jpa --> |
依赖下载完成后,就要配置bean.xml文件
- 在bean.xml中配置EntityManagerFactory
EntityManagerFactory是SpringData的核心之一
1 | <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> |
- 然后,定义Dao层类型的接口,注意,要实现SpringData功能,首先应该
extends
org.springframework.data.repository.Repository
接口或者使用@RepositoryDefinition(domainClass = Employee.class, idClass = Integer.class)
注解。
其中的domainClass,idClass属性是对应表的实体类与id主键。
Repository类的定义:
1 | public interface Repository<T, ID extends Serializable> { |
1)Repository是一个空接口,标记接口
没有包含方法声明的接口,其实有点像Serializable
接口
2)如果我们定义的接口EmployeeRepository extends Repository
如果我们自己的接口没有extends Repository,运行时会报错:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘com.imooc.repository.EmployeeRepository’ available
- 添加注解能到达到不用extends Repository的功能
@RepositoryDefinition(domainClass = Employee.class, idClass = Integer.class)
SpringData可以实现通过方法命名规范来自动生成sql进行查询,也就是说,没有方法体
下面是方法名称的命名规范。
要注意:
对于按照方法命名规则来使用的话,有弊端:
方法名会比较长: 约定大于配置
对于一些复杂的查询,是很难实现
@Query
是一个更好的使用定制sql的工具注解,我通常把它理解为Mybatis中的类似@Select()
酱紫的,
而且,它支持命名参数以及索引参数的使用:
就是?
这种参数参数插入
** 支持本地查询**
1 | @Query("select o from Employee o where id=(select max(id) from Employee t1)") |
关于SPringData中事物
在写操作中需要事物的支持
- @Modifying–允许修改
- 事物在SpringData中的使用
事务在Spring data中的使用:
1)事务一般是在Service层
2)@Query、 @Modifying、@Transactional的综合使用
使用:
在service层中新建service类,并调用update方法:
1 | package com.drazen.service; |
关于SpringData JPA
1) CrudRepository接口
这个接口其实就是针对实体进行的机械化写操作,简单粗暴快方法有这些:
1 | //保存一个实体 |
2)PagingAndSortingRepository 接口
支持分页,排序
创建继承了PagingAndSortingRepository的interface
1 | public interface PageRep extends PagingAndSortingRepository<Employee,Integer> { |
1 | // 返回所有实体 |
- 使用PAGE 构建分页
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17@Autowired
private PageRep pageRep;
public void getPage(){
//import org.springframework.data.domain.PageRequest;
Pageable pageable = new PageRequest(0,5);
Page<Employee> page = pageRep.findAll(pageable);
//总页数
System.out.println(page.getTotalPages());
// 总记录数
System.out.println(page.getTotalElements());
// 当前第几页
System.out.println(page.getNumber());
// 当前页面的集合
System.out.println(page.getContent());
// 当前页面的记录数
System.out.println(page.getNumberOfElements());
} - PageRep 是一个继承了PagingAndSortingRepository的初始interface
- Pageable 是来自org.springframework.data.domain.PageRequest的类
- 其实page.getContent()获取到的是List
- 排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void getSort(){
// import org.springframework.data.domain.Sort.Order;
// 进构造器的参数是升序或者降序,类似于order by id desc
Sort.Order order = new Sort.Order(Sort.Direction.DESC,"id");
// import org.springframework.data.domain.Sort;
Sort sort = new Sort(order);
// 将构建好的sort传入PageRequest
Pageable pageable = new PageRequest(0,5,sort);
Page<Employee> page = pageRep.findAll(pageable);
//总页数
System.out.println(page.getTotalPages());
// 总记录数
System.out.println(page.getTotalElements());
// 当前第几页
System.out.println(page.getNumber());
// 当前页面的集合
System.out.println(page.getContent());
// 当前页面的记录数
System.out.println(page.getNumberOfElements());
}
3) JpaSpecificationExecutor 接口
其实我觉得这个方法可能还不如直接写sql,但是好像可以对原生sql有很好的支持
- Specification封装了JPA Critical 的查询条件
- org.springframework.data.jpa.repository目录下
新建接口继承JpaSpecificationExecutor:
1 | public interface JpaSpecificationRepo extends JpaSpecificationExecutor<Employee> { |
- 组合功能,如分页+排序+查询条件
1 | public void testNewInterface(){ |
总结
- SpringData也支持非关系型数据库
总的来说,springdata是一个可以提高开发效率的spring的工具集
Author: dadonggua