本篇文章是续《如何使用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
转载于: