1,pom.xml
<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>cn.net</groupId>
<artifactId>spring-boot-helloword</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spring-boot-helloword</name>
<url>http://maven.apache.org</url>
<parent>
<!-- spring-boot-starter-parent -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--指定jdk-->
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<!--spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
<!-- mysql依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- jpa依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--thymeleaf依赖配置信息 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--freemarker依赖配置信息 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<!--springloaded hot deploy
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin </artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.4.RELEASE</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--fork : 如果没有该项配置,肯呢个devtools不会起作用,即应用不会restart -->
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
</project>
2,application.properties
########################################################
###server 配置信息
########################################################
#springboot默认端口号是8080
#server.port = 8081
#springboot默认context-path是/
#server.context-path=/spring-boot-helloword
#server.port=8080
#server.address= # bind to a specific NIC
#server.session-timeout= # session timeout in seconds
#the context path, defaults to '/'
#server.context-path=/spring-boot
#server.servlet-path= # the servlet path, defaults to '/'
#server.tomcat.access-log-pattern= # log pattern of the access log
#server.tomcat.access-log-enabled=false # is access logging enabled
#server.tomcat.protocol-header=x-forwarded-proto # ssl forward headers
#server.tomcat.remote-ip-header=x-forwarded-for
#server.tomcat.basedir=/tmp # base dir (usually not needed, defaults to tmp)
#server.tomcat.background-processor-delay=30; # in seconds
#server.tomcat.max-threads = 0 # number of threads in protocol handler
#server.tomcat.uri-encoding = UTF-8 # character encoding to use for URL decoding
########################################################
###THYMELEAF (ThymeleafAutoConfiguration)配置信息
########################################################
#spring.thymeleaf.prefix=classpath:/templates/
#spring.thymeleaf.suffix=.html
#spring.thymeleaf.mode=HTML5
#spring.thymeleaf.encoding=UTF-8
# ;charset=<encoding> is added
#spring.thymeleaf.content-type=text/html
# set to false for hot refresh
spring.thymeleaf.cache=false
########################################################
###FREEMARKER (FreeMarkerAutoConfiguration)配置信息
########################################################
spring.freemarker.allow-request-override=false
spring.freemarker.cache=false
spring.freemarker.check-template-location=true
spring.freemarker.charset=UTF-8
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.expose-spring-macro-helpers=false
#spring.freemarker.prefix=
#spring.freemarker.request-context-attribute=
#spring.freemarker.settings.*=
spring.freemarker.suffix=.ftl
#spring.freemarker.template-loader-path=classpath:/templates/ #comma-separated list
#spring.freemarker.view-names= # whitelist of view names that can be resolved
########################################################
###datasource 指定mysql数据库连接信息
########################################################
spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10
########################################################
### Java Persistence Api jpa配置信息
########################################################
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
#[org.hibernate.cfg.ImprovedNamingStrategy #org.hibernate.cfg.DefaultNamingStrategy]
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
3,app.java 主函数入口
package cn.net;
import java.util.ArrayList;
import java.util.List;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
/**
* Helloworld
* @author Administrator
* @version v.0.1
* @date 2018年6月13日
*/
@SpringBootApplication
public class App extends WebMvcConfigurerAdapter{
// public class App{
//第一种方式
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// TODO Auto-generated method stub
super.configureMessageConverters(converters);
// 1、需要先定义一个 convert 转换消息的对象;
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//2、添加fastJson 的配置信息,比如:是否要格式化返回的json数据;
FastJsonConfig fastConfig = new FastJsonConfig();
fastConfig.setSerializerFeatures(
SerializerFeature.PrettyFormat
);
//处理中文乱码问题(不然出现中文乱码)
List<MediaType> fastMediaTypes = new ArrayList<MediaType>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
//3、在convert中添加配置信息.
fastConverter.setFastJsonConfig(fastConfig);
//4、将convert添加到converters当中.
converters.add(fastConverter);
}
//第二种方式
/*@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
// 1、需要先定义一个 convert 转换消息的对象;
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//2、添加fastJson 的配置信息,比如:是否要格式化返回的json数据;
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//处理中文乱码问题(不然出现中文乱码)
List<MediaType> fastMediaTypes = new ArrayList<MediaType>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
//3、在convert中添加配置信息.
fastConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter = fastConverter;
//4、将convert添加到converters当中.
return new HttpMessageConverters(converter);
}*/
public static void main( String[] args )
{
SpringApplication.run(App.class, args);
// System.out.println( "Hello World!" );
}
}
4,Demo.java(实体类)
package cn.net;
import java.util.Date;
import com.alibaba.fastjson.annotation.JSONField;
/**
* 这是一个测试实体类.
* @author Angel -- 守护天使
* @version v.0.1
* @date 2016年12月10日
*/
public class Demo {
private int id;
private String name;
//com.alibaba.fastjson.annotation.JSONField
@JSONField(format="yyyy-MM-dd HH:mm")
private Date createTime;//创建时间.
/*
* 我们不想返回remarks?
* serialize:是否需要序列化属性.
*/
@JSONField(serialize=false)
private String remarks;//备注信息.
public String getRemarks() {
return remarks;
}
public void setRemarks(String remarks) {
this.remarks = remarks;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
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;
}
}
5,controller.java
package cn.net;
import java.util.Date;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 在这里@Restcontroller等价于(@controller加上@ResponseBody)
* @author Administrator
* @version v.0.1
* @date 2018年6月13日
*/
@RestController
public class HelloController {
/**
* 在这里使用@RequestMapping请求,建立请求映射
* http://127.0.0.1:8080/hello
* @return
*/
@RequestMapping("/hello")
public String Hello()
{
return "springboot";
}
@RequestMapping("/getDemo")
public Demo getDemo()
{
Demo demo =new Demo();
demo.setId(1);
demo.setName("ahnxahsjs你好");
demo.setCreateTime(new Date());
demo.setRemarks("java你好");
return demo;
}
@RequestMapping("/sprin")
public String spgi()
{
return "你好 ";
}
@RequestMapping("/hao")
public String hao()
{
return "你好萨达 ";
}
}
----controller.java
package cn.net;
import java.util.Date;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 在这里@Restcontroller等价于(@controller加上@ResponseBody)
* @author Administrator
* @version v.0.1
* @date 2018年6月13日
*/
@RestController
public class HelloController {
/**
* 在这里使用@RequestMapping请求,建立请求映射
* http://127.0.0.1:8080/hello
* @return
*/
@RequestMapping("/hello")
public String Hello()
{
return "springboot";
}
@RequestMapping("/getDemo")
public Demo getDemo()
{
Demo demo =new Demo();
demo.setId(1);
demo.setName("ahnxahsjs你好");
demo.setCreateTime(new Date());
demo.setRemarks("java你好");
return demo;
}
@RequestMapping("/sprin")
public String spgi()
{
return "你好 ";
}
@RequestMapping("/hao")
public String hao()
{
return "你好萨达 ";
}
}
5,dao,java
package cn.net.demo.bean.dao;
import javax.annotation.Resource;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import cn.net.demo.bean.Cat;
@Repository
public class CatDao {
/**
* 定义一个sql语句
* 定义一个RowMapper
* 执行查询方法
*/
@Resource
private JdbcTemplate jdbcTemplate;
public Cat selectByCatName(String catName){
//定义一个sql语句
String sql = "select *from cat where cat_name=?";
//定义一个RowMapper
RowMapper<Cat> rowMapper = new BeanPropertyRowMapper<Cat>(Cat.class);
// return jdbcTemplate.queryForObject(sql, rowMapper,new Object[]{catName});
//执行查询方法
return jdbcTemplate.queryForObject(sql, rowMapper,catName);
}
}
22,实体类
package cn.net.demo.bean;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
/**
* 1,创建了一个实体类
*
* 如何持久化呢?
*
* 使用@entity实现实体类的持久化操作,当jpa检测到我们实体类当中有@entity
*
* 注解的时候,会在数据库中生成对应的表结构信息
*
* 2,使用@id指定主键
*
* @author Administrator
*
*/
@Entity
public class Cat {
private int id;//主键
private String catName;//姓名
private int catAge;//年龄
/**
* 使用@id指定主键
* 使用代码@GeneratedValue(strategy=GenerationType.AUTO)
* 指定主键的生成策略,MySQL默认的是自增长
* @return
*/
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCatName() {
return catName;
}
public void setCatName(String catName) {
this.catName = catName;
}
public int getCatAge() {
return catAge;
}
public void setCatAge(int catAge) {
this.catAge = catAge;
}
}
3,controller.java
package cn.net.demo.controller;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.net.demo.bean.Cat;
import cn.net.demo.service.CatService;
@RestController
@RequestMapping("/cat")
public class CatController {
@Resource
private CatService catService;
@RequestMapping("/save")
public String save()
{
Cat cat =new Cat();
cat.setCatName("pake");
cat.setCatAge(3);
catService.save(cat);
return "save.ok";
}
@RequestMapping("/delete")
public String delete()
{
catService.delete(9);
return "save.ok";
}
@RequestMapping("/getAll")
public Iterable<Cat> getAll()
{
return catService.getAll();
}
@RequestMapping("/findByCatName")
public Cat findByCatName(String catName)
{
return catService.findByCatName(catName);
}
@RequestMapping("/findByCatName2")
public Cat findByCatName2(String catName)
{
System.out.println("CatController.findByCatName2");
return catService.findByCatName2(catName);
}
@RequestMapping("/selectByCatName")
public Cat selectByCatName(String catName)
{
return catService.selectByCatName(catName);
}
}
2,设置全局异常类
package cn.net.demo.excption;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
//import org.springframework.web.servlet.ModelAndView;
/**
* 1,新建一个类GlobalDefaultExceptionHandler,
* 2,在class注解上@ControllerAdvice
* 3,在class上添加一个方法
* 在方法上注解上@ExceptionHandler(Exception.class)
* @author 龚道松
* @date 2018年6月15日 上午10:09:31
* @version v.0.1
*
*/
@ControllerAdvice
public class GlobalDefaultExceptionHandler {
@ResponseBody
@ExceptionHandler(Exception.class)
public String defaultErrorHandler(HttpServletRequest req, Exception e) {
// ModelAndView mv =new ModelAndView();
// mv.setViewName("请转到其他页面");
return "对不起服务器繁忙,请稍后再试!";
}
}
3,查询类
package cn.net.demo.repository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import cn.net.demo.bean.Cat;
/**
* 1,查询方法以 get | safind | read 开头
* 2,涉及查询条件时,条件是属性用条件关键字连接,条件属性首字母大写
* @author 龚道松
* @date 2018年6月14日 下午9:17:34
* @version v.0.1
*
*/
public interface Cat2Repository extends CrudRepository<Cat, Integer>{
//根据catName查询,
public Cat findByCatName(String catName);
/**
* 如何编写jpql语句
* hibernate。。。hql语句
* jpql语句和hql语句类似的语句
*/
@Query("from Cat where catName=:cn")
public Cat findMyCatName(@Param("cn")String catName);
}
4,service
package cn.net.demo.service;
import javax.annotation.Resource;
import javax.transaction.Transactional;
import org.springframework.stereotype.Service;
import cn.net.demo.bean.Cat;
import cn.net.demo.bean.dao.CatDao;
import cn.net.demo.repository.Cat2Repository;
import cn.net.demo.repository.CatRepository;
@Service
public class CatService {
@Resource
private CatRepository catRepository;
@Resource
private Cat2Repository cat2Repository;
@Resource
private CatDao catDao;
/**
* save update delete 方法需要绑定事物
*
* 使用@Transactional进行事物绑定
*
* @param cat
*/
//保存数据
@Transactional
public void save(Cat cat)
{
catRepository.save(cat);
}
//删除数据
@Transactional
public void delete(int id)
{
catRepository.delete(id);
}
//查询数据
public Iterable<Cat> getAll()
{
return catRepository.findAll();
}
//查询数据
public Cat findByCatName(String catName)
{
return cat2Repository.findByCatName(catName);
}
//查询数据
public Cat findByCatName2(String catName)
{
return cat2Repository.findMyCatName(catName);
}
//查询数据
public Cat selectByCatName(String catName)
{
return catDao.selectByCatName(catName);
}
}
5,页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>Insert title here</title>
</head>
<body>
<h1>
Hello,thymeleaf
<br/>
this is my first thymeleaf demo
<hr/>
welcome <span th:text="${name}"></span>
</h1>
</body>
</html>
页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>Insert title here</title>
</head>
<body>
<h1>
<h1>Hello.v.2</h1>
<p>${name}</p>
</h1>
</body>
</html>