使用的软件版本
Jetbrains IDEA 2019.1
开始建项目
首先打开IDEA新建项目,选择Spring Initializr
填写项目的信息
这里我用Gradle
其他内容可以参考着写,填完之后下一步
选择这些,然后进入下一步,填写项目保存的目录
点击完成,等待项目初始化
配置
刚建完的项目可能是这样的
在项目的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";
}
}
点击运行
等待服务器初始化完成
打开浏览器http://localhost:8080
看到如下界面,说明的环境搭完了
操作数据库
还记得之前在配置文件里面填写的数据库相关信息么。在IDEA里面有数据库操作的插件。
添加数据源
添加一个数据链接
之后可以用这个进行简单的数据管理
右键可以新建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 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 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 users = userDao.getAllUser();
modelMap.addAttribute("users", users);
return "user_list";
}
}
在Controller里面,通过RequestMapping来指定url由哪一个函数去处理比如"/user/list"是由UserController的list函数去处理的,可以通过指定method参数去限制函数只能响应特定的请求方式。使用ModelMap可以将数据传递给View层,这个是由Spring处理的。通过return的字符串,Spring去寻找对应的模板文件然后去渲染。
接下来创建一个HTML模板
User List
这里使用Thymeleaf模板引擎,可以用${变量名}
获取到Controller传递过来的值