对应作业
- 创建一个Maven的jar工程。
- 修改POM文件添加Web启动器,Thymeleaf启动器,Spring Data JPA启动器坐标。
<!-- springBoot 的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springBoot 的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- springBoot 的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 单元测试的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
1. 修改POM文件添加MySQL数据库、数据库连接池坐标。
<!-- 使用数据库连接的jar一般与连接池一起使用 -->
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- druid 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
</dependencies>
1. 修改全局配置文件,添加数据库配置、连接池配置、JPA正向工程配置,显示SQL语句配置。
#连接数据库
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/ssm?useSSL=false
spring.datasource.username=root
spring.datasource.password=root
#指定连接池
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#开启正向工程
spring.jpa.hibernate.ddl-auto=update
#运行时,打印sql语句
spring.jpa.show-sql=true
1. SpringBoot整合Spring Data JPA步骤-(下)
1. 创建Users实体类,包含id、name、age、address属性,其中id为主键。
@Entity
@Table(name="t_users")
public class Users {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private Integer id;
@Column(name="name")
private String name;
@Column(name="age")
private Integer age;
@Column(name="address")
private String address;
//相关方法省略
}
1. 创建Dao接口继承JpaRepository接口。
/**
* 参数一T :当前需要映射的实体
* 参数二ID :当前映射的实体中的OID 的类型
*
*/
public interface UsersRepository extends JpaRepository<Users, Integer>{
}
1. 在工程中添加测试启动器。
<!-- 单元测试的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
1. 创建启动类。
@SpringBootApplication
public class AppForSpringBootJap {
public static void main(String[] args) {
SpringApplication.run(AppForSpringBootJap.class, args);
}
}
1. 编写测试代码使用正向工程创建表,并在表中插入一条数据。
@Test
public void addUser() {
Users users = new Users();
users.setName("王晓红");
users.setAge(20);
users.setAddress("北京大兴区");
this.userDao.save(users);
}
1. SpringBoot整合Spring Data JPA-Repository接口使用
1. 在Spring Data JPA中提供了几个核心接口?
五个
1. Repository接口的作用是什么?
提供基于注解和基于方法名的查询
1. 方法名称命名查询方式的规则是什么?
findBy(关键字)+属性名称(首字母要大写)+查询条件(首字母大写)
1. @Query注解的作用是什么?
注解后的值就是调用接口
1. @Modifying注解的作用是什么?
标识当前语句进行了事务的操作
1. SpringBoot整合Spring Data JPA-CrudRepository接口使用
1. CrudRepository接口的作用是什么?
CrudRepository 接口,主要是完成一些增删改查的操作。
1. CrudRepository接口的继承结构是什么样的?
CredRepository 接口继承Repository 接口
1. CrudRepository接口中有哪些常见方法?
1. SpringBoot整合Spring Data JPA-PagingAndSortingRepository接口使用
1. PagingAndSortingRepository接口的作用是什么?
分页和排序
1. PagingAndSortingRepository的继承结构是什么样的?
该接口继承了CrudRepository 接口
1. PagingAndSortingRepository排序的步骤是什么?
/**
* PagingAndSortingRepository 排序测试
*/
@Test
public void testPagingAndSortingRepositorySort() {
// Order 定义排序规则
Order order = new Order(Direction.DESC, "id");
// Sort 对象封装了排序规则
Sort sort = new Sort(order);
List<Users> list = (List<Users>) this.usersRepositoryPagingAndSorting.findAll(sort);
for (Users users : list) {
System.out.println(users);
}
}
1. PagingAndSortingRepository分页的步骤是什么?
/**
* PagingAndSortingRepository 分页测试
*/
@Test
public void testPagingAndSortingRepositoryPaging() {
// Pageable:封装了分页的参数,当前页,每页显示的条数。注意:他的当前页是从0 开始。
// PageRequest(page,size) page:当前页。size:每页显示的条数
Pageable pageable = new PageRequest(1, 2);
Page<Users> page = this.usersRepositoryPagingAndSorting.findAll(pageable);
System.out.println("总条数:" + page.getTotalElements());
System.out.println("总页数" + page.getTotalPages());
List<Users> list = page.getContent();
for (Users users : list) {
System.out.println(users);
}
}
对应作业
1. SpringBoot整合Spring Data JPA-JpaRepository接口使用
1. JpaRepository接口的作用是什么?
该接口继承了PagingAndSortingRepository 接口。对继承的父接口中的方法的返回值进行适配。
1. JpaRepository继承结构是什么样的?
对比PagingAndSortingRepository ,在进行查询时无需对返回结果进行强转 ,方便我们编程
1. Spring Data JPA-JPASpecificationExecutor接口使用
1. JPASpecificationExecutor接口的作用是什么?
JPASpecificationExecutor 接口配合其他接口
1. JPASpecificationExecutor接口的继承结构是什么样的?
继承Repository接口
1. Specification对象的作用是什么?
需要配合着jpa 中的 其他接口一起使用
1. SpringBoot整合Spring Data JPA-建立双向一对多关联映射
1. @GeneratedValue注解的作用是什么?
令主键自增
1. @ManyToOne注解的作用是什么?
@ManyToOne(cascade=CascadeType.PERSIST,fetch=FetchType.EAGER)
标志表与表之间是多对一的关系
1. @JoinColumn注解的作用是什么?
@JoinColumn(name="role_id")
标识外键
1. SpringBoot整合Spring Data JPA-建立双向多对多关联映射
1. @ManyToMany注解的作用是什么?
标识表与表之间是多对多的关系
1. @JoinTable注解的作用是什么?
@JoinTable(name="tb_roles_menus",joinColumns=@JoinColumn(name="role_id"),inverseJoinColumns=@JoinColumn(name="menu_id"))
标识中间表与被标识的两个表之间的关系
- 创建一个菜单实体,包含menusid、menusname、menusurl、fatherid属性,与Roles为多对多关联关系,一个角色可以拥有多个菜单,一个菜单可以分配个多个角色。
@Entity
@Table(name="tb_menus")
public class Menus {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="menuId")
private Integer menuId;
@Column(name="menuName")
private String menuName;
@Column(name="menuUrl")
private String menuUrl;
@Column(name="fatherId")
private Integer fatherId;
@ManyToMany(mappedBy="menus")
private Set<Roles> roles=new HashSet<Roles>();
//不打印roles的信息,因为查不到(没有session)
@Override
public String toString() {
return "Menus [menuId=" + menuId + ", menuName=" + menuName + ", menuUrl=" + menuUrl + ", fatherId=" + fatherId
+ "]";
}
//取值赋值,构造方法略
}
1. SpringBoot整合Spring Data JPA-操作双向多对多关联映射
1. 编写测试代码,创建角色一个对象,创建两个菜单对象,建立角色对象与菜单对象的关系,并插入到表中。
/**
* 添加角色同时添加菜单
*/
@Test
public void test1() {
// 创建角色
Roles roles = new Roles();
roles.setRolename("超管");;
// 创建菜单
Menus menus = new Menus();
menus.setFatherId(-1);
menus.setMenuName("CSND博客平台");
menus.setMenuUrl("");
Menus menus2 = new Menus();
menus2.setFatherId(1);
menus2.nus2.setMenuUrl("");
// 添加关系
roles.getMeuns().add(menus);
roles.getMeuns().add(menus2);
menus.getRoles().add(roles);
menus2.getRoles().add(roles);
// 保存数据
this.roleDao.save(roles);
}
- Spring Boot整合Ehcache步骤
- 什么是Ehcache?
通过 Ehcache实现对数据本地的缓存 , 用于单体架构的项目中
- Spring整合Ehcache的步骤是什么?
创建项目,修改pom文件
创建Ehcache 的配置文件
修改application.properties 文件
修改启动类
- Ehcache的配置文件应该放在项目的什么位置?
位置:src/main/resources/ehcache.xml
- Spring整合Ehcache需要在全局配置文件中配置什么?
#连接数据库
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/ssm?useSSL=false
spring.datasource.username=root
spring.datasource.password=root
#指定连接池
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#开启正向工程
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.generate-ddl=true
#运行时,打印sql语句
spring.jpa.show-sql=true
#使用缓存时需要在启动类上添加@EnableCaching注解 在需要开启注解的方法上添加@Cacheable
#开启ehcache的缓存配置
spring.cache.ehcache.config=ehcache.xml
1. @EnableCaching注解的作用是什么?
加上@EnableCaching注解表示开启本地缓存
1. Spring Boot整合@CacheEvict注解使用
1. @Cacheable注解的作用是什么?
选择缓存的类型,需要在启动类开启
1. @Cacheable注解的value属性的作用是什么?
这个注解是选择缓存的类型,需要在启动类开启@EnableCaching
1. @Cacheable注解的key属性的作用是什么?
没有方法参数时,会默认以0为key,当有两个无参方法使用缓存时mkey会冲突。可以使用数字作为key,不能直接使用字符串
1. @CacheEvict注解的作用是什么?
@CacheEvict(value=“users”,allEntries=true) 清除缓存中以users 存策略缓存的对象