SpringBoot Web篇(二)

上篇文章介绍了Spring Boot初级教程:SpringBoot框架入门篇(一),方便大家快速入门和了解实践Spring Boot特性。本篇文章是接着上篇文章为大家介绍SpringBoot的其他特性。

SpringBoot Web篇(二)_第1张图片

SpringBoot Web开发非常简单,包括json输出、自定义filter、property、data操作等。
工具:Eclipse
项目工程:maven工程
项目结构图

SpringBoot Web篇(二)_第2张图片

一、搭建步骤

    1、添加pom.xml文件

 
       org.springframework.boot
       spring-boot-starter-data-jpa



       mysql
       mysql-connector-java
 

   2、添加配置文件

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql= true

   3、添加实体类

@Entity
public class User  implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue
    private Long id;
    @Column(nullable = false, unique = true)
    private String userName;
    @Column(nullable = false)
    private String passWord;
    @Column(nullable = false, unique = true)
    private String email;
    @Column(nullable = true, unique = true)
    private String nickName;
    @Column(nullable = false)
    private String regTime;
    //省略getter setter 构造函数
}

   4、DAO类

public interface UserRepository extends JpaRepository {

    User findByUserName(String userName);

    User findByUserNameOrEmail(String username, String email);
}

   5、Controller类

只需要类添加 @RestController 即可,默认类中的方法都会以json的格式返回。

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @RequestMapping("/getUser")
    @Cacheable(value = "user-key")
    public User getUser() {
        User user = userRepository.findByUserName("aa");
        System.out.println("若下面没出现“无缓存的时候调用”字样且能打印出数据表示测试成功");
        return user;
    }
}

   6、启动类Application

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

启动类运行main方法,
在浏览器访问:
localhost:8080/user/getuser


二、自定义过滤器

我们常常在项目中会使用filters用于记录调用日志、排除有XSS威胁的字符、执行权限验证等等。

  1. 实现Filter接口,实现Filter方法。
  2. 添加 @Configuration 注解,将自定义Filter加入过滤链。
@Configuration
public class WebConfiguration {

     @Bean
     public RemoteIpFilter remoteIpFilter() {
            return new RemoteIpFilter();
     }
     
     @Bean
     public FilterRegistrationBean testFilterRegistration() {
            FilterRegistrationBean registration = new FilterRegistrationBean();
            registration.setFilter(new MyFilter());
            registration.addUrlPatterns("/*");
            registration.addInitParameter("paramName", "paramValue");
            registration.setName("MyFilter");
            registration.setOrder(1);
            return registration;
      }
}
public class MyFilter implements Filter{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {   
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse sresponse, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletRequest srequest = (HttpServletRequest) request;
        System.out.println("this is MyFilter,url :"+srequest.getRequestURI());
        filterChain.doFilter(srequest, sresponse);
    }

    @Override
    public void destroy() { 
    }
}

   1、配置类使用

在web开发的过程中,我们经常需要自定义一些配置文件,如何使用呢?
配置在application.properties中
com.neo.title=码农新锐
com.neo.description=分享技术

    配置类

@Component
public class NeoProperties {

    @Value("${com.neo.title}")
    private String title;
    
    @Value("${com.neo.description}")
    private String description;
    //省略getter setter
}

    配置类的应用

    @RequestMapping("/config")
    public String getConfig() {
        StringBuffer sb = new StringBuffer();
        String title = neoProperties.getTitle();
        String description = neoProperties.getDescription();
        sb.append(title).append(",").append(description).append("!");
        return sb.toString();
    }

启动类运行main方法,
在浏览器访问:
localhost:8080/user/config

SpringBoot Web篇(二)_第3张图片

    2、常见问题

SpringBootWeb框架搭建时遇到路径问题?
   这里需要注意Application启动类的位置,它的位置决定了它开启的时候是否能扫描bean、controller等,它主要扫描它所在的包目录及子目录。


三、Spring Data Repositories介绍

 让我们从 JpaRepository 开始 - 它扩展了PagingAndSortingRepository,反过来又扩展了CrudRepository。
 其中每个接口都定义了自己的功能。
 因此,由于这种继承关系,JpaRepository包含CrudRepository和PagingAndSortingRepository的完整API 。(通过下面图可以看到继承关系)

@NoRepositoryBean
public interface JpaRepository extends PagingAndSortingRepository,
 ReactiveQueryByExampleExecutor {
}

@NoRepositoryBean
public interface PagingAndSortingRepository extends CrudRepository {
}

   JpaRepository接口

public interface JpaRepository extends PagingAndSortingRepository{
        List findAll();
        List findAll(Sort sort);
        List save(Iterable entities);
        void flush();
        T saveAndFlush(T entity);
        void deleteInBatch(Iterable entities);
}
  1. findAll() - 获取实体的列表。
  2. findAll(...) - 获取实体的列表,并使用提供的条件对它们进行排序。
  3. save(...) - 批量保存。
  4. flush() - 刷新对数据库的所有挂起更改。
  5. saveAndFlush(...) -保存实体并立即刷新更改。
  6. deleteInBatch(...) -删除一个可迭代的实体。在这里,我们可以传递多个对象来批量删除它们。

 显然,上面的接口延伸 PagingAndSortingRepository 这意味着它有存在于所有方法CrudRepository。
   CrudRepository接口

public interface CrudRepository extends Repository {
    
     S save(S entity);
    
    T findOne(ID primarykey);
    
    Iterable findAll();
    
    Long count();
    
    void delete(T entity);
    
    boolean exists(ID primarykey);
}
  1. save(...) - 在这里,我们可以传递多个对象以批量保存它们。
  2. findOne(...) - 根据传递的主键值获取单个实体。
  3. findAll() - 获取数据库中所有可用实体的Iterable。
  4. count() - 计算表中总实体的数量。
  5. delete(...) - 根据传递的对象删除实体。
  6. exists(...) - 根据传递的主键值验证实体是否存在。

 这个接口看起来非常通用和简单,但实际上,它提供了应用程序所需的所有基本查询抽象。

   PagingAndSortingRepository接口

public interface PagingAndSortingRepository extends CrudRepository {
    
    Iterable findAll(Sort sort);
    
    Page findAll(Pageable pageable);
}

 该接口提供了一个方法findAll(可分页可分页),这是实现分页的关键

因此,我们假设要显示按age排序的结果集的第一页,升序,每个不超过五个记录。这是我们使用PageRequestSort定义实现此目的的方法:

   /**
     * 分页查询数据
     * @return
     */
    @SuppressWarnings("deprecation")
    @RequestMapping("/list")
    public List getList() {
        Sort sort = new Sort(new Sort.Order(Sort.Direction.ASC,"age"));
        Pageable pageable = new PageRequest(0,5,sort);
        Page pages = userRepository.findAll(pageable);
        List list = pages.getContent();
        return list;
    }

 将可分页对象传递给Spring数据查询将返回有问题的结果
PageRequest的第一个参数从零开始)。

本文中的代码在这里:
 https://github.com/xiaonongOne/SpringBoot-Web


注意啦! 往期SpringBoot在这里

SpringBoot Web篇(二)_第4张图片

你可能感兴趣的:(SpringBoot Web篇(二))