SpringBoot搭建&JPA&@Aspect

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!}">&nbsp;
		图书作者:<input type="text" name="author" value="${book.author!}">&nbsp;
		<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);
	}
	
	
	
}

猜你喜欢

转载自blog.csdn.net/jamesge2010/article/details/81609918