还没取好名字先写

使用的软件版本

Jetbrains IDEA 2019.1

开始建项目

首先打开IDEA新建项目,选择Spring Initializr


image.png

填写项目的信息

这里我用Gradle

其他内容可以参考着写,填完之后下一步

项目信息

选择这些,然后进入下一步,填写项目保存的目录

配置的组件

点击完成,等待项目初始化

配置

刚建完的项目可能是这样的


image.png

在项目的resource目录下有application.properties

打开文件输入

# 数据库的配置

# 如果使用SQLite可以用下面这个配置(需要在Gradle引入SQLite依赖)
# spring.datasource.url=jdbc:sqlite:bunny.sqlite3
# spring.datasource.driverClassName=org.sqlite.JDBC

# MySQL数据库的配置
spring.datasource.url=jdbc:mysql://localhost:3306/spring?useSSL=false&characterEncoding=utf8&serverTimezone=UTC
spring.datasource.username=spring
spring.datasource.password=123456
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver

# mybatis的配置
# 填Model包的位置
mybatis.mapper-locations=classpath*:mapper/*.xml
mybatis.type-aliases-package=cc.bunnies.pocketsnacks.model

# 日志配置
logging.level.mapper=DEBUG
logging.level.org.springframework=INFO
logging.level.org.spring.springboot.dao=INFO
logging.file=logs/spring-boot-logging.log

# 编码配置
spring.http.encoding.force=true
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
server.tomcat.uri-encoding=UTF-8

# 模板引擎
# 目录为resource下的目录
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=LEGACYHTML5
spring.thymeleaf.encoding=UTF8

# 热部署
spring.devtools.restart.enabled=true

spring.session.store-type=none

开始Hello World

首先先在项目的包下建立相关的文件夹,类似

目录结构

在Controller下建立IndexController类,输入如下代码

package cc.bunnies.pocketsnacks.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class IndexController {
    @RequestMapping("/")
    @ResponseBody
    String index() {
        return "Hello World";
    }
}

点击运行

Run

等待服务器初始化完成

打开浏览器http://localhost:8080
看到如下界面,说明的环境搭完了

Hello World

操作数据库

还记得之前在配置文件里面填写的数据库相关信息么。在IDEA里面有数据库操作的插件。

image.png

添加数据源

image.png

添加一个数据链接

image.png

之后可以用这个进行简单的数据管理

image.png

右键可以新建console,可以运行SQL脚本。

简单的新建一个表,运行

CREATE TABLE `user` (
  `uid` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(20) NOT NULL,
  `password` VARCHAR(20) NOT NULL,
  PRIMARY KEY(`uid`)
);

然后在model包下新建一个User类,形如

package cc.bunnies.pocketsnacks.model;

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class User {
    private int uid;
    private String username;
    private String password;
}

使用Lombok可以通过注解生成Java字节码,这样你的类就会在编译时候自动添加相关函数,不需要手动再写一次。Model类的内容就和数据表的字段相对应即可。
@Data注解是自动为类内部的变量添加Getter和Setter
比如getUsername和setUsername
@Builder注解是给类添加一个Builder,可以用构造器模式构造类的实例比如这里就可以用

User user = User.builder().username("Ivan").password("123").build();

这种代码来构造一个username为Ivan,password为123的User类实例

当然你也可以为你的实体类写一个构造函数形如

public User(String username,String password){
  this.username= username;
  this.password = password;
}

接下来建立一个Dao类的接口,形如

package cc.bunnies.pocketsnacks.dao;

import cc.bunnies.pocketsnacks.model.User;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;

import java.util.List;

@Mapper
@Component
public interface UserDao {
    @Select("select * from user")
    List<User> getAllUser();

    @Select("select * from user where username = #{username} limit 1")
    User getUserByUsername(@Param("username") String username);

    @Insert("insert into user(username,password) values (#{username},#{password})")
    @Options(useGeneratedKeys = true, keyProperty = "uid")
    int insert(User user);
}

@Select注解里面是执行对应的SQL语句并返回SQL语句对应的结果

@Insert注解会执行对应的Insert语句

@Options注解可以额外设置一些属性,比如在这里的就是设置返回值为自增ID

这些注解都使用形如#{名字}这种占位符,占位符对应的参数可以通过@Param("占位符名字")来指定,也可以传入一个实体类,然后使用#{实体类的属性}来传递值。

接下来创建一个Controller命名为UserController

package cc.bunnies.pocketsnacks.controller;

import cc.bunnies.pocketsnacks.dao.UserDao;
import cc.bunnies.pocketsnacks.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@Controller
public class UserController {

    private UserDao userDao;

    @Autowired
    public UserController(UserDao userDao) {
        this.userDao = userDao;
    }

    @RequestMapping("/user/list")
    public String list(ModelMap modelMap) {
        List<User> users = userDao.getAllUser();  //获取所有用户
        modelMap.addAttribute("users", users);  //将数据传递给view
        return "user_list";  //view 的名字
    }

    @RequestMapping(value = "/user/add", method = RequestMethod.POST)
    public String add(ModelMap modelMap, @RequestParam String username, @RequestParam String password) {
        User user = User.builder().username(username).password(password).build();
        int uid = userDao.insert(user);
        if (uid <= 0) {
            modelMap.addAttribute("err_msg", "插入出错");
        }
        List<User> users = userDao.getAllUser();
        modelMap.addAttribute("users", users);
        return "user_list";
    }
}

在Controller里面,通过RequestMapping来指定url由哪一个函数去处理比如"/user/list"是由UserController的list函数去处理的,可以通过指定method参数去限制函数只能响应特定的请求方式。使用ModelMap可以将数据传递给View层,这个是由Spring处理的。通过return的字符串,Spring去寻找对应的模板文件然后去渲染。

接下来创建一个HTML模板

<!DOCTYPE html>
<html lang="zh-cn" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>User List</title>
</head>
<body>
<form action="/user/add" method="post">
    <input type="text" name="username"/>
    <input type="text" name="password"/>
    <input type="submit" value="添加">
    <p th:if="${err_msg!=null}" th:text="${err_msg}"></p>
</form>
<table>
    <tr th:each="user:${users}">
        <td th:text="${user.username}"></td>
        <td th:text="${user.password}"></td>
    </tr>
</table>
</body>
</html>

这里使用Thymeleaf模板引擎,可以用${变量名}获取到Controller传递过来的值

未完待续

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容