SpringBoot Web篇(二)

作者: 3d0829501918 | 来源:发表于2019-04-02 14:32 被阅读3次

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

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

    一、搭建步骤

        1、添加pom.xml文件

     <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <!-- 数据库相关jar包  -->
    <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
     </dependency>
    

       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, Long> {
    
        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


       2、常见问题

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


    三、Spring Data Repositories介绍

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

    @NoRepositoryBean
    public interface JpaRepository<T,ID> extends PagingAndSortingRepository<T,ID>,
     ReactiveQueryByExampleExecutor<T> {
    }
    
    @NoRepositoryBean
    public interface PagingAndSortingRepository<T,ID> extends CrudRepository<T,ID> {
    }
    

       JpaRepository接口

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

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

    public interface CrudRepository<T,ID extends Serializable> extends Repository<T,ID> {
        
        <S extends T> S save(S entity);
        
        T findOne(ID primarykey);
        
        Iterable<T> 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<T,ID extends Serializable> extends CrudRepository<T,ID> {
        
        Iterable<T> findAll(Sort sort);
        
        Page<T> findAll(Pageable pageable);
    }
    

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

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

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

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

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

    注意啦! 往期文章目录在这里

    相关文章

      网友评论

        本文标题:SpringBoot Web篇(二)

        本文链接:https://www.haomeiwen.com/subject/qhlbbqtx.html