从零开始,写一个springboot项目
一.从spring官网创建一个新的项目
spring官网
在projects中选择最后一项spring Intializr,进入如下界面。
输入你的配置信息,右侧建议选择spring web和thymeleaf两个依赖,点击GENERATE生成springboot项目的压缩包。将这个压缩包解压到你想放的位置,打开后如下:
target文件需要项目编译运行后才会生成。
下面,用IDEA导入创建的springboot项目即可。
二.创建数据库
我这里是在数据库manger下面,创建一张书籍表books,字段如下:
create table books
(
bookID int(10) auto_increment comment '书号',
bookName varchar(10) not null comment '书名',
bookCounts int not null comment '数量',
detail varchar(200) not null comment '描述'
)
charset = utf8;
create index bookID
on books (bookID);
接下来再创建一张用户表user,用于登录认证,字段如下:
create table user
(
username varchar(20) not null,
password varchar(20) not null,
userId int(4) not null
primary key
);
三、创建项目架构
1、实体类的创建:pojo下面新建Books类,属性和数据库字段保持一致:
package com.han.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Books {
private int bookID;
private String bookName;
private int bookCounts;
private String detail;
}
2、dao(mapper)层,新建BookMapper接口类
package com.han.dao;
import com.han.pojo.Books;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository //mapper层注解专用,是一个component,service层是service,controller层是controller,都是component
@Mapper
public interface BookMapper {
//增加一本书
int addBook(Books books);
//删除一本书
int deleteBookById(@Param("bookId") int id);
//更新一本书
int updateBook(Books books);
//查询一本书
Books queryBooKById(@Param("bookId") int id);
Books queryBooKByName(@Param("bookName") String bookName);
//查询所有的书
List<Books> queryAllBook();
}
3、在resources下面新建mapper文件夹,并创建BookMapper.xml配置文件,写入sql语句,实现BookMapper接口中的方法
因为要操作数据库,先在application.yml文件中配置数据库连接信息:
#数据库连接配置信息
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/manger?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
接着在application.properties配置文件中,整合mybatis
#springboot整合mybatis
mybatis.type-aliases-package=com.han.pojo
mybatis.mapper-locations=classpath:mapper/*.xml
上面两步是必须先完成的。接下来就可以写sql语句了:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--一个mapper对应一个接口,通过namespace-->
<mapper namespace="com.han.dao.BookMapper">
<!--增加一本书-->
<insert id="addBook" parameterType="Books">
insert into manger.books (bookName, bookCounts, detail)
values (#{bookName},#{bookCounts},#{detail});
</insert>
<!-- 删除一本书-->
<delete id="deleteBookById" parameterType="int">
delete from manger.books where bookID=#{bookId}
</delete>
<!-- 更新一本书-->
<update id="updateBook" parameterType="Books">
update manger.books set bookName=#{bookName},bookCounts=#{bookCounts},detail=#{detail}
where bookID=#{bookID};
</update>
<!-- 根据id查询书-->
<select id="queryBooKById" resultType="Books">
select * from manger.books where bookID=#{bookId}
</select>
<!-- 根据书名查询书籍-->
<select id="queryBooKByName" resultType="Books">
select * from manger.books where bookName=#{bookName}
</select>
<!-- 查询数据库中所有书籍-->
<select id="queryAllBook" resultType="Books">
select * from manger.books
</select>
</mapper>
4、Service层,新建BookService接口类
package com.han.service;
import com.han.pojo.Books;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BookService {
//增加一本书
int addBook(Books books);
//删除一本书
int deleteBookById( int id);
//更新一本书
int updateBook(Books books);
//查询一本书
Books queryBooKById( int id);
Books queryBooKByName( String bookName);
//查询所有的书
List<Books> queryAllBook();
}
5、service层新建接口类实现类BookServiceImpl
package com.han.service;
import com.han.dao.BookMapper;
import com.han.pojo.Books;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BookServiceImpl implements BookService {
@Autowired
BookMapper bookMapper; //注入mapper层
//重写方法
@Override
public int addBook(Books books) {
return bookMapper.addBook(books);
}
@Override
public int deleteBookById(int id) {
return bookMapper.deleteBookById(id);
}
@Override
public int updateBook(Books books) {
return bookMapper.updateBook(books);
}
@Override
public Books queryBooKById(int id) {
return bookMapper.queryBooKById(id);
}
@Override
public Books queryBooKByName(String bookName) {
return bookMapper.queryBooKByName(bookName);
}
@Override
public List<Books> queryAllBook() {
return bookMapper.queryAllBook();
}
}
到这里,mapper层和service层的代码就写好了。
6、在templates下新建需要的html,用于展示的增删改查
home.html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<head>
<meta charset="UTF-8">
<title>书籍管理</title>
<link rel="stylesheet" href="./css/layui.css">
</head>
<body>
<div style="background-color: #0e90d2;text-align: center;border-radius: 7px;margin-bottom: 20px;width: 60%;margin-left: 20%;margin-top: 20px;" >
<h1>书籍管理中心</h1>
</div>
<div style="text-align: center;">
<a class="layui-btn layui-btn-sm layui-btn-primary" href="/add">添加书籍</a>
<a class="layui-btn layui-btn-sm layui-btn-primary" href="/tomain">返回主页</a>
</div>
<div style="margin-left: 10px; margin-bottom: 10px;text-align: center;width: 20%;">
<p th:text="${error}" style="color: red; "></p>
</div>
<!--根据书名查找数据 th:action="@{/search}" -->
<form th:action="@{/search}" method="post" style="margin-left: 10px;margin-bottom: 10px;">
<label>查询书籍:</label>
<input type="text" name="queryBookName" placeholder="请输入要查询的书籍名称" >
<input type="submit" value="查询" class="layui-btn layui-btn-sm layui-btn-primary">
</form>
<!--springboot2.0.9以下生效-->
<!--<div sec:authorize="isAuthenticated()">-->
<!-- <a>-->
<!-- 用户名:<span sec:authentication="name"></span>-->
<!-- </a>-->
<!--</div>-->
<div style="margin-top: 20px;">
<script src="./js/layui.js"></script>
<table class="layui-table">
<colgroup>
<col width="350">
<col width="350">
<col width="350">
<col>
</colgroup>
<thead>
<tr>
<th>bookID</th>
<th>bookName</th>
<th>bookCounts</th>
<th>detail</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<!-- 拿到后端数据booklist数组,循环出来的每一项为listbook , 展示数据库中的书籍信息-->
<tr th:each="listbook:${booklist}">
<td th:text="${listbook.getBookID()}"></td>
<td th:text="${listbook.getBookName()}"></td>
<td th:text="${listbook.getBookCounts()}"></td>
<td th:te