对应作业

  1. 创建一个Maven的jar工程。
  2. 修改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接口中有哪些常见方法?



SpringBoot项目的命名规则 CSN springboot包名命名规范_spring


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"))

    标识中间表与被标识的两个表之间的关系

    1. 创建一个菜单实体,包含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);
     }
    1. Spring Boot整合Ehcache步骤
    1. 什么是Ehcache?

    通过 Ehcache实现对数据本地的缓存 , 用于单体架构的项目中

    1. Spring整合Ehcache的步骤是什么?

    创建项目,修改pom文件

    创建Ehcache 的配置文件

    修改application.properties 文件

    修改启动类

    1. Ehcache的配置文件应该放在项目的什么位置?

    位置:src/main/resources/ehcache.xml

    1. 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 存策略缓存的对象