所需工具Idea,数据库Mysql
新建一个Spring Boot项目
在项目中选择下图中的相关依赖
当前项目结构为
打开pom.xml添加Thymeleaf(前端框架)的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
在MySql中创建数据库readingList,执行代码创建book表
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for book
-- ----------------------------
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL,
`reader` varchar(255) DEFAULT NULL,
`isbn` varchar(255) DEFAULT NULL,
`description` varchar(255) DEFAULT NULL,
`authro` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of book
-- ----------------------------
INSERT INTO `book` VALUES ('14', '123', '123', '123', '123', '123');
INSERT INTO `book` VALUES ('15', '123', '123', '123', '123', '123');
在com.example.demo中创建Controller,mapper,Service,Pojo文件夹,在resouce文件中创建mapper文件夹(存放Mybatis映射文件)。
项目结构如下图所示
在pom.xml中plugs中加入依赖(用于Mybatis的反向映射)
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
</plugin>
在resources中创建generatorConfig.xml(其中数据库密码,文件创建位置自行修改),并在其中加入代码
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<classPathEntry location="C:\\Users\\dell\\.m2\\repository\\mysql\\mysql-connector-java\\8.0.16\\mysql-connector-java-8.0.16.jar"></classPathEntry>
<context id="mybatisGenerator" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/readinglist?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC" userId="root"
password="****">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成PO类的位置 -->
<javaModelGenerator targetPackage="com.example.demo.Pojo"
targetProject="./src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="mapper"
targetProject="./src/main/resources">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.example.demo.mapper"
targetProject="./src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据库表 -->
<table tableName="book"></table>
<!-- 有些表的字段需要指定java类型
<table schema="" tableName="">
<columnOverride column="" javaType="" />
</table> -->
</context>
</generatorConfiguration>
并在下图中执行
项目结构更改为
将application.properties修改为application.yml(Spring官方推荐格式)在其中配置数据库连接信息以及视图位置
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/readinglist?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: *****
driver-class-name: com.mysql.cj.jdbc.Driver
thymeleaf:
prefix: classpath:/templates/
suffix: .html
encoding: utf-8
cache: false
mybatis:
mapper-locations: classpath:/mapper/*Mapper.xml
type-aliases-package: com.example.demo.Pojo
在Controller中创建ReadingListController控制器加入代码
package com.example.demo.Controller;
import com.example.demo.Pojo.Book;
import com.example.demo.Service.BookServiceDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.List;
@Controller
public class ReadingListController {
@Autowired
private BookServiceDao bookServiceDao;
@RequestMapping(value="/Book/{reader}" , method= RequestMethod.GET)
public String readersBooks(@PathVariable String reader, Model model)
{
List readList=bookServiceDao.findBookByReader(reader);
if(readList!=null)
{
model.addAttribute("books",readList);
}
return "readingList";
}
@RequestMapping(value="/Book/{reader}" , method=RequestMethod.POST)
public String addToReadingList(@PathVariable String reader, Book book)
{
book.setReader(reader);
bookServiceDao.saveBook(book);
return "redirect:/Book/{reader}";
}
@RequestMapping(value="/CreateList/")
public String createReadingList()
{
return "readingList";
}
}
在templates创建页面ReadingList.html页面
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Reading List</title>
<link rel="stylesheet" th:href="@{/style.css}"></link>
<meta name="_csrf" th:content="${_csrf.token}"/>
<meta name="_csrf_header" th:content="${_csrf.headerName}"/>
</head>
<body>
<h2>Your Reading List</h2>
<div th:unless="${#lists.isEmpty(books)}">
<dl th:each="book : ${books}">
<dt class="bookHeadline">
<span th:text="${book.title}">Title</span> by
<span th:text="${book.authro}">Authro</span>
(ISBN: <span th:text="${book.isbn}">ISBN</span>)
</dt>
<dd class="bookDescription">
<span th:if="${book.description}"
th:text="${book.description}">Description</span>
<span th:if="${book.description eq null}">
No description available</span>
</dd>
</dl>
</div>
<div th:if="${#lists.isEmpty(books)}">
<p>You have no books in your book list</p>
</div>
<hr/>
<h3>Add a book</h3>
<form method="POST" th:action="@{/Book/123}">
<label for="title">Title:</label>
<input type="text" name="title" size="50"></input><br/>
<label for="authro">Author:</label>
<input type="text" name="authro" size="50"></input><br/>
<label for="isbn">ISBN:</label>
<input type="text" name="isbn" size="15"></input><br/>
<label for="description">Description:</label><br/>
<textarea name="description" cols="80" rows="5"></textarea><br/>
<input type="submit"></input>
</form>
</body>
</html>
在Service层创建接口BookServiceDao,以及BookServiceDaoImp
分别加入代码
package com.example.demo.Service;
import com.example.demo.Pojo.Book;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Transactional
public interface BookServiceDao {
public List findBookByReader(String reader);
public void saveBook(Book book);
}
package com.example.demo.Service;
import com.example.demo.Pojo.Book;
import com.example.demo.Pojo.BookExample;
import com.example.demo.mapper.BookMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Transactional
public class BookServiceDaoImp implements BookServiceDao{
@Autowired
private BookExample bookExample;
@Autowired
private BookMapper bookMapper;
@Override
public List findBookByReader(String reader) {
BookExample.Criteria criteria=bookExample.createCriteria();
criteria.andReaderEqualTo(reader);
return bookMapper.selectByExample(bookExample);
}
@Override
public void saveBook(Book book) {
bookMapper.insertSelective(book);
}
}
最终项目结构
运行项目
在浏览器中输入localhost:8080/Book/123
出现Spring-security的登录页面
用户:User
密码:Idea控制台中Using generated security password对应的字符串
登录后,大功告成
项目地址:https://github.com/nobei/BookAndMybaits