本篇文章是续《如何使用 VS Code 编写 Spring Boot》 之后, 结合自己. net 经验捣鼓的小 demo, 一个简单的 CRUD, 对于习惯了 VS 操作模式的. net 人员非常方便, 强大的智能提示, 简单又干净, 一起开启愉快的 java 编程之旅吧.
一. 环境搭建
请移步《如何使用 VS Code 编写 Spring Boot》 , 当页面输出 Hello World 就算成功啦
二. 熟悉 Spring 注解, 跟路由
Spring 真的是将注解用到了极致, 能一个注解搞定的东西, 从来不罗嗦, 熟练的使用这些注解不但减轻了代码工作量, 而且可读性更高, 这里直接放图了, 我也是用到哪些百度哪些
路由方面直接在注解里定义就可以了, 比较方便, 在. net 里 mvc,webapi 都可以全局配置, 我想 java 应该也可以的, 这里就不纠结了
三. 加个过滤器, 方便以后记录日志, 验证权限什么的
百度了一下, 这个就直接抄了, Spring 已经默认给实现了过滤器, 大致执行流程是 初始化 ->action 执行前 ->action 执行后 -> 注销过滤器
- public class LogCostFilter implements Filter {
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- // 初始化
- }
- @Override
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
- HttpServletRequest req = (HttpServletRequest) servletRequest;
- String requestURI = req.getRequestURI();
- System.out.println("---------------------> 过滤器开始: 请求地址"+requestURI);
- if(requestURI.contains("test")){
- // 重定向
- servletRequest.getRequestDispatcher("/hello").forward(servletRequest, servletResponse);
- }else{
- filterChain.doFilter(servletRequest, servletResponse);
- }
- System.out.println("---------------------> 过滤器结束: 请求地址"+requestURI);
- }
- @Override
- public void destroy() {
- // 注销
- }
- }
写好过滤器后, 再把过滤加载进去, 这里也是直接抄, 大致可以看明白触发条件, 加载的过滤器名称, 猜测应该可以加载多个过滤器, 以后可以根据业务分开写不同的过滤器了
- @Configuration
- public class FilterConfig {
- @Bean
- public FilterRegistrationBean registFilter() {
- FilterRegistrationBean registration = new FilterRegistrationBean();
- registration.setFilter(new LogCostFilter());
- registration.addUrlPatterns("/*");
- registration.setName("LogCostFilter");
- registration.setOrder(1);
- return registration;
- }
- }
四. 整个 ORM, 完成简单的 CURD
现在 java 里最流行的 ORM 应该是 mybatis 了, 我也想整合这个来着, 但是需要点学习成本, 为了求快, 先整个简单的 jpa, 因为这个跟 EF 比较相似, 上手也简单, 这里放我遇到的一些坑
4.1 不同包的数据类型不匹配
因为 java 里有很多时间类型, 导错了包导致
4.2 数据源类型错误
这里引用 alibaba 的数据源类型
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid-spring-boot-starter</artifactId>
- <version>1.1.9</version>
- </dependency>
- spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
4.3 扫描不到 entity 类
在程序启动时, 手动加上要扫描实体类的包
- @SpringBootApplication
- @EntityScan("com.example.demo.entity") // 就是这句
- public class DemoApplication {
- public static void main(String[] args) {
- SpringApplication.run(DemoApplication.class, args);
- }
- }
4.4 在花了一个下午的时间解决掉这些问题后, 终于可以开心的使用 jpa 访问数据库了, 但是奇葩的问题又来了, 因为我表名是 User, 操作的时候它自动给我创建了一个 user 表, 并把数据插入了进去, 懒得问人了, 一群表面兄弟, 直接百度
- # 区分表名大小写
- spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
五. 搭建一个简单的三层
完成了前面的步奏, 可以直接在控制器里调用 repository 层, 实现 crud, 但是这显然是不对的, 我应该加个 service 层, 哪怕是贫血的, 这样业务可以集中处理, 方便维护
在 service 层直接调用 repository 时遇到一个问题, 一直语法报错, 卡了很久, 原来使用自定义的方法时, 必须在 repository 里定义接口, 不能直接拿 JpaRepository 的接口, 简单的优化了一下, 结构如图
项目已开源在 GitHub, 地址: https://github.com/wmowm/demo
来源: https://www.cnblogs.com/tibos/p/11103897.html