上篇文章介绍了Spring Boot初级教程:SpringBoot框架入门篇(一),方便大家快速入门和了解实践Spring Boot特性。本篇文章是接着上篇文章为大家介绍SpringBoot的其他特性。
SpringBoot Web开发非常简单,包括json输出、自定义filter、property、data操作等。
工具:Eclipse
项目工程:maven工程
项目结构图
一、搭建步骤
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威胁的字符、执行权限验证等等。
- 实现Filter接口,实现Filter方法。
- 添加 @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 extends PagingAndSortingRepository,
ReactiveQueryByExampleExecutor {
}
@NoRepositoryBean
public interface PagingAndSortingRepository extends CrudRepository {
}
JpaRepository接口
public interface JpaRepository extends PagingAndSortingRepository{
List findAll();
List findAll(Sort sort);
List save(Iterable extends T> entities);
void flush();
T saveAndFlush(T entity);
void deleteInBatch(Iterable entities);
}
- findAll() - 获取实体的列表。
- findAll(...) - 获取实体的列表,并使用提供的条件对它们进行排序。
- save(...) - 批量保存。
- flush() - 刷新对数据库的所有挂起更改。
- saveAndFlush(...) -保存实体并立即刷新更改。
- 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);
}
- save(...) - 在这里,我们可以传递多个对象以批量保存它们。
- findOne(...) - 根据传递的主键值获取单个实体。
- findAll() - 获取数据库中所有可用实体的Iterable。
- count() - 计算表中总实体的数量。
- delete(...) - 根据传递的对象删除实体。
- exists(...) - 根据传递的主键值验证实体是否存在。
这个接口看起来非常通用和简单,但实际上,它提供了应用程序所需的所有基本查询抽象。
PagingAndSortingRepository接口
public interface PagingAndSortingRepository extends CrudRepository {
Iterable findAll(Sort sort);
Page findAll(Pageable pageable);
}
该接口提供了一个方法findAll(可分页可分页),这是实现分页的关键。
因此,我们假设要显示按age排序的结果集的第一页,升序,每个不超过五个记录。这是我们使用PageRequest和Sort定义实现此目的的方法:
/**
* 分页查询数据
* @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