1、使用Idea创建spring boot工程的博客
https://www.cnblogs.com/black-spike/p/8017768.html
2、本篇博客参考网址
https://blog.csdn.net/supervictim/article/details/54582083
3、整个工程的目录文件如下

4、在pom.xml配置文件中添加springboot依赖
| <?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.example</groupId> |
| <artifactId>demo</artifactId> |
| <version>0.0.1-SNAPSHOT</version> |
| <packaging>jar</packaging> |
| |
| <name>demo</name> |
| <description>Demo project for Spring Boot</description> |
| |
| <parent> |
| <groupId>org.springframework.boot</groupId> |
| <artifactId>spring-boot-starter-parent</artifactId> |
| <version>2.0.1.RELEASE</version> |
| <relativePath/> |
| </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-test</artifactId> |
| <scope>test</scope> |
| </dependency> |
| |
| <dependency> |
| <groupId>org.springframework.boot</groupId> |
| <artifactId>spring-boot-starter-thymeleaf</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> |
| </dependency> |
| |
| <dependency> |
| <groupId>net.sf.json-lib</groupId> |
| <artifactId>json-lib</artifactId> |
| <version>2.4</version> |
| <classifier>jdk15</classifier> |
| </dependency> |
| </dependencies> |
| |
| <build> |
| <plugins> |
| <plugin> |
| <groupId>org.springframework.boot</groupId> |
| <artifactId>spring-boot-maven-plugin</artifactId> |
| </plugin> |
| </plugins> |
| </build> |
| </project> |
| |
5、application.properties配置文件
| |
| spring.mvc.view.prefix=classpath:/templates/ |
| |
| spring.mvc.view.suffix=.html |
| |
| spring.datasource.url = jdbc:mysql://localhost:3306/db_tosys |
| spring.datasource.username = root |
| spring.datasource.password = password |
| spring.datasource.driverClassName = com.mysql.jdbc.Driver |
| |
| spring.jpa.database = MYSQL |
| |
| spring.jpa.show-sql = true |
| |
| spring.jpa.hibernate.ddl-auto = update |
| |
| spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy |
| |
| spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect |
6、以上的pom.xml和application.properties,添加了springboot和thymeleaf依赖,以下查看SpringMvc实例
| package com.example.demo.controller; |
| |
| import com.example.demo.entity.Flight; |
| import com.example.demo.dao.FlightDao; |
| import com.example.demo.utils.DateJsonValueProcessor; |
| import com.example.demo.utils.ResponseUtil; |
| import net.sf.json.JSONArray; |
| import net.sf.json.JSONObject; |
| import net.sf.json.JsonConfig; |
| import org.springframework.beans.factory.annotation.Autowired; |
| import org.springframework.stereotype.Controller; |
| import org.springframework.web.bind.annotation.RequestMapping; |
| import org.springframework.web.bind.annotation.ResponseBody; |
| |
| import javax.servlet.http.HttpServletResponse; |
| import java.util.List; |
| |
| @Controller |
| @RequestMapping("/flight") |
| public class FlightController { |
| |
| private static final String format = "yyyy-MM-dd HH:mm:ss"; |
| |
| @Autowired |
| private FlightDao flightDao; |
| |
| @RequestMapping("/index") |
| public String index(){ |
| return "flightList"; |
| } |
| |
| @RequestMapping("/list") |
| @ResponseBody |
| public String list(HttpServletResponse response) throws Exception { |
| List<Flight> list = flightDao.getList(); |
| int count = flightDao.getCount(); |
| JsonConfig jsonConfig = new JsonConfig(); |
| jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor(format)); |
| JSONArray rows = JSONArray.fromObject(list, jsonConfig); |
| JSONObject result = new JSONObject(); |
| result.put("rows", rows); |
| result.put("total", count); |
| ResponseUtil.write(response, result); |
| return null; |
| } |
| } |
7、thymeleaf模板如下,flightList.html(备注:里面的thymeleay模板必须创建在resource文件夹下面的templates文件夹下面,若此文件夹不存在则自行创建,以下之是显示列表显示部分字段)
| <!DOCTYPE HTML> |
| <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> |
| <html> |
| <head> |
| <title>获得Flight信息列表</title> |
| |
| <link th:href="@{/jquery-easyui-1.5.3/themes/default/easyui.css}" rel="stylesheet"/> |
| <link th:href="@{/jquery-easyui-1.5.3/themes/icon.css}" rel="stylesheet"/> |
| |
| <script th:src="@{/jquery-easyui-1.5.3/jquery.min.js}"></script> |
| <script th:src="@{/jquery-easyui-1.5.3/jquery.easyui.min.js}"></script> |
| <script th:src="@{/jquery-easyui-1.5.3/locale/easyui-lang-zh_CN.js}"></script> |
| |
| </head> |
| <body style="margin:1px;"> |
| <table id="dg" class="easyui-datagrid" title="航班信息列表" style="height:500px" data-options=" |
| fit:true, |
| rownumbers:true, |
| autoRowHeight:true, |
| pagination:true, |
| SingleSelect:false, |
| pageSize:20, |
| pageList: [20, 30, 50], |
| url:'/flight/list', |
| method:'get', |
| toolbar:'#tb'"> |
| <thead> |
| <tr> |
| <th field="cb" checkbox="true" align="center"></th> |
| <th field="id" width="50" align="center">编号</th> |
| <th field="name" width="150" align="center">航班名称</th> |
| <th field="flighttype" width="100" align="center">航班类型</th> |
| <th field="fromcity" width="100" align="center">出发城市</th> |
| <th field="tocity" width="100" align="center">目的城市</th> |
| <th field="fromtime" width="150" align="center">出发时间</th> |
| <th field="totime" width="150" align="center">到点时间</th> |
| </tr> |
| </thead> |
| </table> |
| <div id="tb"> |
| <div> |
| <a href="javascript:openFlightAddDialog()" class="easyui-linkbutton" iconCls="icon-add" plain="true">添加</a> |
| <a href="javascript:openFlightModifyDialog()" class="easyui-linkbutton" iconCls="icon-edit" plain="true">修改</a> |
| <a href="javascript:deleteFlight()" class="easyui-linkbutton" iconCls="icon-remove" plain="true">删除</a> |
| </div> |
| <div> |
| 航班名称:<input type="text" id="s_flightName" style="width: 100px" |
| onkeydown="if(event.keyCode==13) searchFlight()"/> |
| 出发地点:<input type="text" id="s_fromCity" style="width: 100px" |
| onkeydown="if(event.keyCode==13) searchFlight()"/> |
| 到达地点:<input type="text" id="s_toCity" style="width: 100px" |
| onkeydown="if(event.keyCode==13) searchFlight()"/> |
| 出发日期:<input type="text" id="s_fromTime" class="easyui-datebox" style="width: 100px" |
| onkeydown="if(event.keyCode==13) searchFlight()"/> |
| <a href="javascript:searchFlight()" class="easyui-linkbutton" iconCls="icon-search" plain="true">搜索</a> |
| </div> |
| </div> |
| |
| <div id="dlg" class="easyui-dialog" style="width: 700px;height:350px;padding: 10px 20px" |
| closed="true" buttons="#dlg-buttons"> |
| <form id="fm" method="post"> |
| <table cellspacing="8px"> |
| <tr> |
| <td>航班名称:</td> |
| <td><input type="text" id="name" name="flight.name" class="easyui-validatebox" required="true"/></td> |
| <td> </td> |
| <td>航班类型:</td> |
| <td> |
| <select class="easyui-combobox" id="flightType" name="flight.flightType" style="width: 154px;" |
| editable="false" panelHeight="auto"> |
| <option value="">请选择性别</option> |
| <option value="国内航班">国内航班</option> |
| <option value="国际航班">国际航班</option> |
| </select> |
| </td> |
| </tr> |
| <tr> |
| <td>出发地点:</td> |
| <td><input type="text" id="fromCity" name="flight.fromCity" class="easyui-validatebox" required="true"/> |
| </td> |
| <td> </td> |
| <td>出发时间:</td> |
| <td><input type="text" id="fromTime" name="flight.fromTime" class="easyui-datetimebox" required="true"/> |
| </td> |
| </tr> |
| <tr> |
| <td>到达地点:</td> |
| <td><input type="text" id="toCity" name="flight.toCity" class="easyui-validatebox" required="true"/> |
| </td> |
| <td> </td> |
| <td>到达时间:</td> |
| <td><input type="text" id="toTime" name="flight.toTime" class="easyui-datetimebox" required="true"/> |
| </td> |
| </tr> |
| <tr> |
| <td>经济舱票价:</td> |
| <td><input type="text" id="ecPrice" name="flight.ecPrice" class="easyui-validatebox" required="true"/> |
| </td> |
| <td> </td> |
| <td>(经济舱)座位数:</td> |
| <td><input type="text" id="ecTicketTotal" name="flight.ecTicketTotal" class="easyui-numberbox" |
| required="true"/></td> |
| </tr> |
| <tr> |
| <td>头等舱票价:</td> |
| <td><input type="text" id="fcPrice" name="flight.fcPrice" class="easyui-validatebox" required="true"/> |
| </td> |
| <td> </td> |
| <td>(头等舱)座位数:</td> |
| <td><input type="text" id="fcTicketTotal" name="flight.fcTicketTotal" class="easyui-numberbox" |
| required="true"/></td> |
| </tr> |
| <tr> |
| <td>使用客机:</td> |
| <td colspan="4"> |
| <input class="easyui-combobox" id="aircraft" name="flight.aircraft.id" |
| data-options="panelHeight:'auto',editable:false,valueField:'id',textField:'name',url:'aircraft_comboList.action'"/> |
| </td> |
| </tr> |
| </table> |
| </form> |
| </div> |
| |
| <div id="dlg-buttons"> |
| <a href="javascript:saveFlight()" class="easyui-linkbutton" iconCls="icon-ok">保存</a> |
| <a href="javascript:closeFlightDialog()" class="easyui-linkbutton" iconCls="icon-cancel">关闭</a> |
| </div> |
| <script type="text/javascript"> |
| |
| function searchFlight() { |
| $("#dg").datagrid('load', { |
| "s_flight.name": $("#s_flightName").val(), |
| "s_flight.fromCity": $("#s_fromCity").val(), |
| "s_flight.toCity": $("#s_toCity").val(), |
| "s_flight.fromTime": $("#s_fromTime").datebox("getValue") |
| }); |
| } |
| |
| </script> |
| </body> |
| </html> |
8、为mian方法添加一些注解
| package com.example.demo; |
| |
| import org.springframework.boot.SpringApplication; |
| import org.springframework.boot.autoconfigure.SpringBootApplication; |
| import org.springframework.boot.autoconfigure.domain.EntityScan; |
| import org.springframework.data.jpa.repository.config.EnableJpaRepositories; |
| |
| @SpringBootApplication |
| @EnableJpaRepositories(basePackages = "com.example.demo.dao") |
| @EntityScan(basePackages = "com.example.demo") |
| public class DemoApplication { |
| |
| public static void main(String[] args) { |
| SpringApplication.run(DemoApplication.class, args); |
| } |
| } |
9、接下来创建实体层(entity,备注:字段全小写,若是驼峰式命名,查询结果可能出现问题)
| package com.example.demo.entity; |
| |
| import javax.persistence.*; |
| import java.util.Date; |
| |
| @Entity |
| @Table(name="t_flight") |
| public class Flight { |
| |
| @Id |
| @GeneratedValue(strategy= GenerationType.AUTO) |
| private int id; |
| private String name; |
| private String fromcity; |
| private String tocity; |
| private Date fromtime; |
| private Date totime; |
| private int ecprice; |
| private int fcprice; |
| private int ectickettotal; |
| private int fctickettotal; |
| private int ecticketremain; |
| private int fcticketremain; |
| private String flighttype; |
| |
| 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; |
| } |
| |
| public String getFromcity() { |
| return fromcity; |
| } |
| |
| public void setFromcity(String fromcity) { |
| this.fromcity = fromcity; |
| } |
| |
| public String getTocity() { |
| return tocity; |
| } |
| |
| public void setTocity(String tocity) { |
| this.tocity = tocity; |
| } |
| |
| public Date getFromtime() { |
| return fromtime; |
| } |
| |
| public void setFromtime(Date fromtime) { |
| this.fromtime = fromtime; |
| } |
| |
| public Date getTotime() { |
| return totime; |
| } |
| |
| public void setTotime(Date totime) { |
| this.totime = totime; |
| } |
| |
| public int getEcprice() { |
| return ecprice; |
| } |
| |
| public void setEcprice(int ecprice) { |
| this.ecprice = ecprice; |
| } |
| |
| public int getFcprice() { |
| return fcprice; |
| } |
| |
| public void setFcprice(int fcprice) { |
| this.fcprice = fcprice; |
| } |
| |
| public int getEctickettotal() { |
| return ectickettotal; |
| } |
| |
| public void setEctickettotal(int ectickettotal) { |
| this.ectickettotal = ectickettotal; |
| } |
| |
| public int getFctickettotal() { |
| return fctickettotal; |
| } |
| |
| public void setFctickettotal(int fctickettotal) { |
| this.fctickettotal = fctickettotal; |
| } |
| |
| public int getEcticketremain() { |
| return ecticketremain; |
| } |
| |
| public void setEcticketremain(int ecticketremain) { |
| this.ecticketremain = ecticketremain; |
| } |
| |
| public int getFcticketremain() { |
| return fcticketremain; |
| } |
| |
| public void setFcticketremain(int fcticketremain) { |
| this.fcticketremain = fcticketremain; |
| } |
| |
| public String getFlighttype() { |
| return flighttype; |
| } |
| |
| public void setFlighttype(String flighttype) { |
| this.flighttype = flighttype; |
| } |
| } |
10、创建dao层(注:此处创建一个FlightDao的接口,并不需要创建FlightDao的实现,springboot默认会帮我们实现,继承CruReposity,@Param代表的是sql语句中的占位符)
| package com.example.demo.dao; |
| |
| import com.example.demo.entity.Flight; |
| import org.springframework.data.jpa.repository.Query; |
| import org.springframework.data.repository.CrudRepository; |
| |
| import java.util.List; |
| |
| public interface FlightDao extends CrudRepository<Flight,Long> { |
| |
| @Query("select count(f) from Flight as f") |
| int getCount(); |
| |
| @Query("select f FROM Flight f") |
| List<Flight> getList(); |
| |
| |
| |
| |
| } |
11、List列表结果集中时间(date)的工具类(DateJsonValueProcessor.java)
| package com.example.demo.utils; |
| |
| import net.sf.json.JsonConfig; |
| import net.sf.json.processors.JsonValueProcessor; |
| import java.text.SimpleDateFormat; |
| |
| public class DateJsonValueProcessor implements JsonValueProcessor { |
| |
| private String format; |
| |
| public DateJsonValueProcessor(String format) { |
| this.format = format; |
| } |
| |
| public Object processArrayValue(Object value, JsonConfig jsonConfig) { |
| return null; |
| } |
| |
| public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) { |
| if (value == null) { |
| return ""; |
| } |
| if (value instanceof java.sql.Timestamp) { |
| String str = new SimpleDateFormat(format).format((java.sql.Timestamp) value); |
| return str; |
| } |
| if (value instanceof java.util.Date) { |
| String str = new SimpleDateFormat(format).format((java.util.Date) value); |
| return str; |
| } |
| return value.toString(); |
| } |
| } |
12、返回Json数据类型至页面的工具类(ResponseUtil.java)
| package com.example.demo.utils; |
| |
| import javax.servlet.http.HttpServletResponse; |
| import java.io.PrintWriter; |
| |
| public class ResponseUtil { |
| |
| public static void write(HttpServletResponse response, Object o) |
| throws Exception { |
| response.setContentType("text/html;charset=utf-8"); |
| PrintWriter out = response.getWriter(); |
| out.println(o.toString()); |
| out.flush(); |
| out.close(); |
| } |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理