1.搭建springboot架构
(1)安装sts插件
(2)创建spring starter project
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.java1234</groupId>
<artifactId>HelloSpringBoot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>HelloSpringBoot</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
(3)创建entity book.java
package com.java1234.entity;
import java.io.Serializable;
import javax.annotation.Generated;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "t_book")
public class Book implements Serializable {
/**
*
*/
private static final long serialVersionUID = 2048434898255725560L;
@Id
@GeneratedValue
private Integer id;
@Column(length = 100)
private String name;
@Column(length = 50)
private String author;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
(4)更改application.properties为application.yml
server:
port: 80
servlet:
context-path: /
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_book
username: root
password: root
jpa:
hibernate:
ddl-auto: update
show-sql: true
(5)在templates下创建bookList.ftl(引入了freemarker)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="/bookAdd.html">添加</a>
<form action="/book/list2" method="post">
图书名称:<input type="text" name="name" value="${book.name!}">
图书作者:<input type="text" name="author" value="${book.author!}">
<input type="submit" value="搜索">
</form>
<table>
<tr>
<th>编号</th>
<th>图书名称</th>
<th>图书作者</th>
<th>操作</th>
</tr>
<#list bookList as book>
<tr>
<td>${book.id}</td>
<td>${book.name}</td>
<td>${book.author}</td>
<td>
<a href="/book/preUpdate/${book.id}">修改</a>
<a href="/book/delete?id=${book.id}">删除</a>
</td>
</tr>
</#list>
</table>
</body>
</html>
(6)BookController.java
package com.java1234.controller;
import java.util.List;
import java.util.Map;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.java1234.dao.BookDao;
import com.java1234.entity.Book;
@Controller
@RequestMapping("/book")
public class BookController {
@Autowired
private BookDao bookDao;
/**
* 查询所有图书
* @return
*/
@RequestMapping("/list")
public ModelAndView list() {
ModelAndView mav = new ModelAndView();
List<Book> findAll = bookDao.findAll();
mav.addObject("bookList", findAll);
mav.setViewName("bookList");
return mav;
}
/**
* 根据多条件查询
* @param book
* @param map
* @return
*/
@RequestMapping("/list2")
public String list2(Book book, Map<String, Object> map) {
List<Book> bookList = bookDao.findAll(new Specification<Book>() {
private static final long serialVersionUID = 1757370531887647569L;
@Override
public Predicate toPredicate(Root<Book> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
Predicate predicate = criteriaBuilder.conjunction();
if(book != null) {
if(book.getName() != null && !"".equals(book.getName())) {
predicate.getExpressions().add(criteriaBuilder.like(root.get("name"), "%" + book.getName() + "%"));
}
if(book.getAuthor() != null && !"".equals(book.getAuthor())) {
predicate.getExpressions().add(criteriaBuilder.like(root.get("author"), "%" + book.getAuthor() + "%"));
}
}
return predicate;
}
});
map.put("bookList", bookList);
map.put("book", book);
return "bookList";
}
/**
* 根据id获取book
* @param id
* @return
*/
@RequestMapping("/preUpdate/{id}")
public ModelAndView preUpdate(@PathVariable("id") Integer id) {
ModelAndView mav = new ModelAndView();
Book book = bookDao.getOne(id);
mav.addObject("book", book);
mav.setViewName("bookUpdate");
return mav;
}
/**
* 添加图书
* @param book
*/
@PostMapping("/add")
public String add(Book book) {
bookDao.save(book);
return "redirect:/book/list";
}
/**
* 更新图书信息
* @param book
*/
@PostMapping("/update")
public String update(Book book) {
bookDao.save(book);
return "redirect:/book/list";
}
/**
* 根据id删除图书
* @param id
*/
@GetMapping("/delete")
public String delete(Integer id) {
bookDao.deleteById(id);
return "redirect:/book/list";
}
@ResponseBody
@RequestMapping("/findByName")
public List<Book> findByName() {
return bookDao.findByName("冰");
}
@ResponseBody
@RequestMapping("/randomList")
public List<Book> randomList() {
return bookDao.randomList(2);
}
}
(7)BookDao.java
package com.java1234.dao;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import com.java1234.entity.Book;
public interface BookDao extends JpaRepository<Book, Integer>, JpaSpecificationExecutor<Book>{
@Query("select t from Book t where t.name like %?1%")// hql查询
public List<Book> findByName(String name);
@Query(value="select * from t_book order by rand() limit ?1", nativeQuery=true)// sql查询
public List<Book> randomList(Integer n);
}
另附上@Aspect使用方法
RequestAspect.java
package com.java1234.aspect;
import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.jboss.logging.Logger;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@Aspect // 切入类标识
@Component
public class RequestAspect {
private Logger logger = Logger.getLogger(RequestAspect.class);
@Pointcut("execution(public * com.java1234.controller.*.*(..))") // 切入点及表达式
public void log() {
}
@Before("log()") // 指定调用方法
public void doBefore(JoinPoint joinPoint) {
logger.info("方法执行前...");
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
logger.info("url:" + request.getRequestURI());
logger.info("ip:" + request.getRemoteHost());
logger.info("method:" + request.getMethod());
logger.info("class_method:" + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
logger.info("args:" + joinPoint.getArgs());
}
@After("log()")
public void doAfter(JoinPoint joinPoint) {
logger.info("方法执行后...");
}
@AfterReturning(pointcut="log()", returning="result") // 声明切入点方法及返回值
public void doAfterReturning(Object result) {
logger.info("方法返回值:" + result);
}
}