SpringBoot学习笔记(一)基础,JPA

前两天写完了天猫商城的ssm项目,部署到了阿里云上面

http://120.26.185.107:8080/tmall_ssm

然后就萌生了个想法,自己写一个个人博客,想了想还是把Springboot学完了之后再动手试试。

那么开始springboot吧。

在IDEA里面创建Springboot项目

首先,在IDEA中开发Springboot应用和Eclipse里面一样,本质上都是一个maven 项目。 但是呢,IDEA 本身自带对SpringBoot支持的插件,不像Eclipse那样,要用插件还需要从第三方安装, 而且很缓慢 (国外插件源)。

菜单 -> New -> Project -> Spring Initializr 然后点 Next创建项目

然后只用修改Group和Artifact就行,我直接跟着站长的改的,第一个应该是包名,第二个项目名

项目参数

接着左边选择 Web, 右边只勾选 Web 即可,然后点击Next

选择Web 模块

然后就把项目创建好了

然后会有个自带的类

被@SpringBootApplication 所标记,表示这个是一个Springboot 应用,就是因为它!我们不用自己配置Tomcat

JSP

SpringBoot的默认视图是Thymeleaf,但还没学,这里就处理下让SpringBoot支持我们习惯的JSP

在pom.xml中配置对jsp的支持

        <!-- servlet依赖. -->
        <dependency>
              <groupId>javax.servlet</groupId>
              <artifactId>javax.servlet-api</artifactId>
               
        </dependency>
              <dependency>
                     <groupId>javax.servlet</groupId>
                     <artifactId>jstl</artifactId>
              </dependency>
        <!-- tomcat的支持.-->
        <dependency>
               <groupId>org.apache.tomcat.embed</groupId>
               <artifactId>tomcat-embed-jasper</artifactId>
                
        </dependency> 

视图定位,我们要改一下 application.properties

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

建一个Controller包,建一个HelloController类,这里和之前ssm里面差不多。

package com.how2java.springboot.web;
import java.text.DateFormat;
import java.util.Date;
 
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
  
@Controller
public class HelloController {
  
    @RequestMapping("/hello")
    public String hello(Model m) {
        m.addAttribute("now", DateFormat.getDateTimeInstance().format(new Date()));
        return "hello";
    }
}

在main目录下,新建-> webapp/WEB-INF/jsp 目录。
随后新建hello.jsp 文件,在其中使用EL 表达式显示放在HelloController的model中的当前时间。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
Hi JSP. 现在时间是  ${now}

然后运行,访问http://127.0.0.1:8080/hello

启动测试

热部署

为了让咱改了项目内容之后,不用再自己重启项目,可以加上一个插件,让他自己动。

做法很简单,在pom.xml中新增加一个依赖和一个插件就行了。


依赖:
 
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
</dependency>
 

插件:
 
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

重启项目试试,不得行就 ctrl+s ctrl+f9,

还不行就这样试试:https://blog.csdn.net/diaomeng11/article/details/73826564

SPRINGBOOT 错误异常处理统一办法

新增加一个类GlobalExceptionHandler,用于捕捉Exception异常以及其子类。
捕捉到之后,把异常信息,发出异常的地址放进ModelAndView里,然后跳转到 errorPage.jsp

package com.how2java.springboot.exception;
 
import javax.servlet.http.HttpServletRequest;
 
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
 
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", e);
        mav.addObject("url", req.getRequestURL());
        mav.setViewName("errorPage");
        return mav;
    }
 
}

 errorPage:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 
<div style="width:500px;border:1px solid lightgray;margin:200px auto;padding:80px">
 
系统 出现了异常,异常原因是:
    ${exception}
    <br><br>
    出现异常的地址是:
    ${url}
    </div>
    

这样出了啥一场他都会调到errorPage页面给你显示出来。

端口和上下文路径

可以通过修改application.properties,修改访问的端口号和上下文路径(我还没搞懂上下文路径是啥,但端口的确能改变成功)

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
server.port=8888
server.context-path=/test

配置切换

有时候在本地测试是使用8080端口,可是上线使用的又是80端口。 此时就可以通过多配置文件实现多配置支持与灵活切换

3个配置文件:
核心配置文件:application.properties
开发环境用的配置文件:application-dev.properties
生产环境用的配置文件:application-pro.properties
这样就可以通过application.properties里的spring.profiles.active =啥  灵活地来切换使用哪个环境了,下面代码里面spring.profiles.active =pro,就是代表用的application-pro.properties里面的配置。

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
spring.profiles.active=pro

JPA

JPA(Java Persistence API)是Sun官方提出的Java持久化规范,用来方便大家操作数据库。
真正干活的可能是Hibernate,TopLink等等实现了JPA规范的不同厂商,默认是Hibernate。
本知识演示如何在Springboot中快捷方便地使用JPA。

大概就是帮我们处理与数据库的交互的。

查了下资料发现它比Mybatis厉害,不用我们自己去写基础的sql语句,不像Mybatis还要各种Mapper啥的。

第一步 修改application.properties,把数据库信息写进去,要注意的是!

spring.jpa.properties.hibernate.hbm2ddl.auto=update这一句,很der,表示会自动更新表结构,所以表都需要我们去建。

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.hbm2ddl.auto=update

然后在pom里面增加对mysql和jpa的依赖

  <!-- mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.21</version>
        </dependency>
 
        <!-- jpa-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency> 

然准备咱的pojo,这里也和之前的pojo不一样,需要一些注解。

增加一个包:com.how2java.springboot.pojo,然后创建实体类Category。
@Entity 注解表示这是个实体类
@Table(name = "category_") 表示这个类对应的表名是 category_ ,注意有下划线哦
@Id 表明主键
@GeneratedValue(strategy = GenerationType.IDENTITY) 表明自增长方式
@Column(name = "id") 表明对应的数据库字段名

package com.how2java.springboot.pojo;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
 
@Entity
@Table(name = "category_")
public class Category {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;
     
    @Column(name = "name")
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
     
}

然后准备DAO:

增加一个包:com.how2java.springboot.dao,然后创建dao接口CategoryDAO,继承了JpaRepository,并且提供泛型<Category,Integer> 表示这个是针对Category类的DAO,Integer表示主键是Integer类型。
JpaRepository 这个父接口,就提供了CRUD, 分页等等一系列的查询了,直接拿来用,都不需要二次开发的了。

package com.how2java.springboot.dao;
 
import org.springframework.data.jpa.repository.JpaRepository;
 
import com.how2java.springboot.pojo.Category;
 
public interface CategoryDAO extends JpaRepository<Category,Integer>{
 
}

然后就可以试试咱的增删改查了。

准备CategoryController

package com.how2java.springboot.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
 
import com.how2java.springboot.dao.CategoryDAO;
import com.how2java.springboot.pojo.Category;
  
@Controller
public class CategoryController {
    @Autowired CategoryDAO categoryDAO;
     
    @RequestMapping("/listCategory")
     
    public String listCategory(Model m,@RequestParam(value = "start", defaultValue = "0") int start,@RequestParam(value = "size", defaultValue = "5") int size) throws Exception {
        start = start<0?0:start;
         
        Sort sort = new Sort(Sort.Direction.DESC, "id");
        Pageable pageable = new PageRequest(start, size, sort);
        Page<Category> page =categoryDAO.findAll(pageable);
         
        System.out.println(page.getNumber());
        System.out.println(page.getNumberOfElements());
        System.out.println(page.getSize());
        System.out.println(page.getTotalElements());
        System.out.println(page.getTotalPages());
         
        m.addAttribute("page", page);
         
        return "listCategory";
    }
 
    @RequestMapping("/addCategory")
    public String addCategory(Category c) throws Exception {
        categoryDAO.save(c);
        return "redirect:listCategory";
    }
    @RequestMapping("/deleteCategory")
    public String deleteCategory(Category c) throws Exception {
        categoryDAO.delete(c);
        return "redirect:listCategory";
    }
    @RequestMapping("/updateCategory")
    public String updateCategory(Category c) throws Exception {
        categoryDAO.save(c);
        return "redirect:listCategory";
    }
    @RequestMapping("/editCategory")
    public String ediitCategory(int id,Model m) throws Exception {
        Category c= categoryDAO.getOne(id);
        m.addAttribute("c", c);
        return "editCategory";
    }
}

listCategory

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
   
<div align="center">
 
</div>
 
<div style="width:500px;margin:20px auto;text-align: center">
    <table align='center' border='1' cellspacing='0'>
        <tr>
            <td>id</td>
            <td>name</td>
            <td>编辑</td>
            <td>删除</td>
        </tr>
        <c:forEach items="${page.content}" var="c" varStatus="st">
            <tr>
                <td>${c.id}</td>
                <td>${c.name}</td>
                <td><a href="editCategory?id=${c.id}">编辑</a></td>
                <td><a href="deleteCategory?id=${c.id}">删除</a></td>
            </tr>
        </c:forEach>
         
    </table>
    <br>
    <div>
                <a href="?start=0">[首  页]</a>
            <a href="?start=${page.number-1}">[上一页]</a>
            <a href="?start=${page.number+1}">[下一页]</a>
            <a href="?start=${page.totalPages-1}">[末  页]</a>
    </div>
    <br>
    <form action="addCategory" method="post">
     
    name: <input name="name"> <br>
    <button type="submit">提交</button>
     
    </form>
</div>

运行 

的确感觉简洁了很多, 没有spring那里转过来转过去的配置过程了。美滋滋。

学习网站:https://how2j.cn/p/5286

发布了82 篇原创文章 · 获赞 21 · 访问量 7925

猜你喜欢

转载自blog.csdn.net/qq_41658124/article/details/105416162
今日推荐