-- `student_info`
create table if not exists `student_info`
(
`sid` int not null auto_increment comment '学生表主键' primary key,
`sname` varchar(20) not null comment '学生账号登录名、姓名',
`pwd` varchar(32) not null comment '密码',
`sex` varchar(20) not null comment '性别、男或女',
`mobile` varchar(11) not null comment '手机号',
`email` varchar(50) not null comment '邮箱'
) comment '`student_info`';
insert into `student_info` (`sid`, `sname`, `pwd`, `sex`, `mobile`, `email`) values (1, '林子骞', '882038', '男', '15935418717', '[email protected]');
insert into `student_info` (`sid`, `sname`, `pwd`, `sex`, `mobile`, `email`) values (2, '王展鹏', '938486', '女', '15893542626', '[email protected]');
insert into `student_info` (`sid`, `sname`, `pwd`, `sex`, `mobile`, `email`) values (3, '孙明哲', '227987', '男', '17615636437', '[email protected]');
insert into `student_info` (`sid`, `sname`, `pwd`, `sex`, `mobile`, `email`) values (4, '许思', '620600', '女', '15004232582', '[email protected]');
insert into `student_info` (`sid`, `sname`, `pwd`, `sex`, `mobile`, `email`) values (5, '孟明辉', '371096', '男', '17353566984', '[email protected]');
-- `score_info`
create table if not exists `score_info`
(
`scid` int not null auto_increment comment '课程表主键' primary key,
`scname` varchar(20) not null comment '课程名称',
`score` float(5, 2) not null comment '课程分数',
`sid` int not null comment '学生ID'
) comment '`score_info`';
insert into `score_info` (`scid`, `scname`, `score`, `sid`) values (1, '软件工程', 100.00, 1);
insert into `score_info` (`scid`, `scname`, `score`, `sid`) values (2, '大数据科学与技术', 100.00, 1);
insert into `score_info` (`scid`, `scname`, `score`, `sid`) values (3, '计算机科学与技术', 100.00, 1);
insert into `score_info` (`scid`, `scname`, `score`, `sid`) values (4, '软件工程', 100.00, 2);
insert into `score_info` (`scid`, `scname`, `score`, `sid`) values (5, '大数据科学与技术', 100.00, 2);
insert into `score_info` (`scid`, `scname`, `score`, `sid`) values (6, '计算机科学与技术', 100.00, 2);
insert into `score_info` (`scid`, `scname`, `score`, `sid`) values (7, '软件工程', 100.00, 3);
insert into `score_info` (`scid`, `scname`, `score`, `sid`) values (8, '大数据科学与技术', 100.00, 3);
insert into `score_info` (`scid`, `scname`, `score`, `sid`) values (9, '计算机科学与技术', 100.00, 3);
insert into `score_info` (`scid`, `scname`, `score`, `sid`) values (10, '软件工程', 100.00, 4);
insert into `score_info` (`scid`, `scname`, `score`, `sid`) values (11, '大数据科学与技术', 100.00, 4);
insert into `score_info` (`scid`, `scname`, `score`, `sid`) values (12, '计算机科学与技术', 100.00, 4);
insert into `score_info` (`scid`, `scname`, `score`, `sid`) values (13, '软件工程', 100.00, 5);
insert into `score_info` (`scid`, `scname`, `score`, `sid`) values (14, '大数据科学与技术', 100.00, 5);
insert into `score_info` (`scid`, `scname`, `score`, `sid`) values (15, '计算机科学与技术', 100.00, 5);
推荐一个网站:代码生成 - SQL之父 (sqlfather.com)
能快速生成SQL语句并添加数据
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.7.5
com.example
Mybatis-Plus
0.0.1-SNAPSHOT
Mybatis-Plus
Mybatis-Plus
1.8
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
com.mysql
mysql-connector-j
runtime
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
com.baomidou
mybatis-plus-boot-starter
3.5.2
com.baomidou
mybatis-plus-generator
3.5.3
org.apache.velocity
velocity
1.7
org.springframework.boot
spring-boot-maven-plugin
org.projectlombok
lombok
server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/student?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123456
thymeleaf:
cache: false
mybatis-plus:
configuration:
map-underscore-to-camel-case: true # 开启驼峰法则
auto-mapping-behavior: full
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL打印
mapper-locations: classpath*:mapper/**/*Mapper.xml # 存放sql语句的xml文件目录
官方文档
代码生成器(新) | MyBatis-Plus (baomidou.com)
/**
*
* MyBatisPlus代码生成器
*
*/
public class CodeGeneratorUtils {
/**
* 执行 run TODO 注意修改TODO处的信息
*/
public static void main(String[] args) {
// TODO 数据库配置(DataSourceConfig)
String url = "jdbc:mysql://localhost:3306/student?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true";
FastAutoGenerator.create(url, "root", "123456")
// 全局配置(GlobalConfig)
.globalConfig(builder -> {
builder.disableOpenDir() // 禁止打开输出目录
.outputDir(System.getProperty("user.dir") + "/src/main/java") // 指定输出目录
.author("YSX") // TODO 作者名
.commentDate("yyyy-MM-dd hh:mm:ss"); // 注释日期
})
// 包配置(PackageConfig)
.packageConfig(builder -> {
builder.parent("com.example") // TODO 设置父包名
.moduleName("mybatisplus") // TODO 设置父包模块名(即启动类所在包的包名)
.entity("pojo") // 设置 Entity 包名
.service("service") // 设置 Service 包名
.serviceImpl("service.impl") // 设置 Service Impl 包名
.mapper("mapper") // 设置 Mapper 包名
.xml("mapper") // 设置 Mapper XML 包名
.controller("controller") // 设置 Controller 包名
.pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "/src/main/resources/mapper")); // 设置mapperXml生成路径
})
// 策略配置(StrategyConfig)
.strategyConfig(builder -> {
builder.addInclude("score_info,student_info") // 设置需要生成的表名,多个表名用英文逗号隔开
// Entity 策略配置
.entityBuilder()
.enableTableFieldAnnotation() // 开启生成实体时生成字段注解
.naming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略 默认下划线转驼峰命名:NamingStrategy.underline_to_camel
.idType(IdType.AUTO) // 全局主键类型
.enableFileOverride() // 覆盖已生成文件
// Controller 策略配置
.controllerBuilder()
.enableFileOverride() // 覆盖已生成文件
// Mapper 策略配置
.mapperBuilder()
.superClass(BaseMapper.class) // 设置父类
.enableFileOverride() // 覆盖已生成文件
// Service 策略配置
.serviceBuilder()
.superServiceClass(IService.class)
.superServiceImplClass(ServiceImpl.class)
.enableFileOverride(); // 覆盖已生成文件
})
.execute();
}
}
注意
在全局配置中的用于覆盖已生成文件的方法fileOverride方法在3.5.3版本中已被弃用,然而官方文档中目前还未更新。
点进源码可以看见:
继续查看源码可知:
与之前版本不同的是,现在配置Entity、Mapper、Service、Controller覆盖已生成文件需要单独配置,而不是像之前一样在全局配置中配置一次,所有已生成的文件都会被覆盖。
在包配置中用于给生成的文件设置生成路径的pathInfo方法中设置xml文件生成路径时使用OutputFile.mapperXml会报错应改为OutputFile.xml,然而官方文档中目前还未更新。
在Mapper策略配置中用于给mapper接口添加@Mapper注解的enableMapperAnnotation方法在3.5.3版本中已被弃用,然而官方文档中目前还未更新。
不写该方法也可以,因为在启动类上加了@MapperScan注解
@MapperScan("com.example.mybatisplus.mapper")
MyBatis-Plus CRUD接口文档
CRUD 接口 | MyBatis-Plus (baomidou.com)
@Controller
@RequestMapping("/mybatisplus/login")
public class LoginController {
final IStudentInfoService studentInfoService;
public LoginController(IStudentInfoService StudentInfoService) {
this.studentInfoService = StudentInfoService;
}
// @Autowired
// private IStudentInfoService StudentInfoService;
/**
* 跳转到登录页面
*
* @return 登录页面
*/
@RequestMapping("/studentlogin")
public String studentlogin() {
return "login";
}
/**
* 登录学生的id
*/
static int sid;
/**
* 登录操作
*
* @param sname 用户名
* @param pwd 密码
* @return 学生个人成绩页面
*/
@RequestMapping("/studentscores")
public String Login(@RequestParam String sname, @RequestParam String pwd) {
StudentInfo studentInfo = studentInfoService.getOne(new QueryWrapper().eq("sname", sname).eq("pwd", pwd));
sid = studentInfo.getSid();
return "redirect:/mybatisplus/scoreInfo/scores";
}
}
使用字段注入或者构造函数注入都可以,Spring官方推荐使用构造函数注入。
学生登录
学生登录
注意
上面两行代码一定要按顺序排列,不能反过来。之后的页面代码也是这样,不能反过来。
common.css一定要在上面
* {
margin: 0;
padding: 0;
}
.content {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
text-align: center;
border-radius: 20px;
border: 1px solid black;
}
form {
margin: 20px;
}
input:not([type="submit"]) {
width: 180px;
height: 30px;
border-radius: 10px;
border: 1px solid black;
}
input[type="submit"], button {
width: 100px;
height: 40px;
margin-top: 15px;
border-radius: 10px;
border: 1px solid black;
}
a {
color: black;
text-decoration: none;
}
.content {
width: 350px;
height: 240px;
}
input:not([type="submit"]) {
margin-bottom: 20px;
}
@Controller
@RequestMapping("/mybatisplus/register")
public class RegisterController {
final IStudentInfoService studentInfoService;
public RegisterController(IStudentInfoService StudentInfoService) {
this.studentInfoService = StudentInfoService;
}
/**
* 学生注册
*
* @return 学生注册页面
*/
@RequestMapping("/studentregister")
public String studentregister() {
return "register";
}
/**
* 学生信息注册操作
*
* @param studentInfo 学生信息
* @return 登录页面
*/
@RequestMapping("/studentInforegister")
private String studentInforegister(StudentInfo studentInfo) {
studentInfoService.save(studentInfo);
return "login";
}
}
学生注册
学生注册
.content {
width: 400px;
height: 370px;
}
input:not([type="submit"]) {
margin-top: 15px;
}
import org.springframework.ui.Model;
@Controller
@RequestMapping("/mybatisplus/scoreInfo")
public class ScoreInfoController {
final IScoreInfoService scoreInfoService;
public ScoreInfoController(IScoreInfoService scoreInfoService) {
this.scoreInfoService = scoreInfoService;
}
/**
* 跳转到指定学生的成绩页面
*
* @param model 指定学生的成绩列表
* @return 指定学生的成绩页面
*/
@RequestMapping("/scores")
private String scores(Model model) {
List scoreInfoList = scoreInfoService.list(new QueryWrapper().eq("sid", LoginController.sid));
model.addAttribute("scoreInfoList", scoreInfoList);
return "scoreList";
}
/**
* 跳转到指定学生的成绩添加页面
*
* @param model 指定学生的id
* @return 指定学生的成绩添加页面
*/
@RequestMapping("/scoreInfoAdd")
private String scoreInfoAdd(Model model) {
model.addAttribute("sid", LoginController.sid);
return "scoreAdd";
}
/**
* 指定学生的成绩添加操作
*
* @param scoreInfo 指定学生的成绩信息
* @return 学生的成绩页面
*/
@RequestMapping("/AddScoreInfo")
private String addScoreInfo(ScoreInfo scoreInfo) {
scoreInfoService.save(scoreInfo);
return "redirect:/mybatisplus/scoreInfo/scores";
}
/**
* 删除学生指定成绩
*
* @param scid 成绩主键id
* @return 学生的成绩页面
*/
@RequestMapping("/RemoveScoreInfo/{scid}")
private String removeScoreInfoById(@PathVariable Integer scid) {
scoreInfoService.removeById(scid);
return "redirect:/mybatisplus/scoreInfo/scores";
}
/**
* 跳转到更新学生指定成绩页面
*
* @param scid 成绩id
* @param model 学生指定成绩信息
* @return 成绩更新页面
*/
@RequestMapping("/scoreInfoUpdate/{scid}")
private String scoreInfoUpdate(@PathVariable("scid") Integer scid, Model model) {
ScoreInfo scoreInfo = scoreInfoService.getById(scid);
model.addAttribute("scoreInfo", scoreInfo);
return "scoreUpdate";
}
/**
* 更新学生指定成绩操作
*
* @param scoreInfo 指定学生的成绩信息
* @return 学生的成绩页面
*/
@RequestMapping("/UpdateScoreInfo")
private String updateScoreInfoById(ScoreInfo scoreInfo) {
scoreInfoService.updateById(scoreInfo);
return "redirect:/mybatisplus/scoreInfo/scores";
}
/**
* 通过课程名称查询学生成绩
*
* @param model 学生成绩信息
* @param scname 课程名称
* @return 学生信息页面
*/
@RequestMapping("/QueryScoreInfo")
public String queryScoreInfo(Model model, @RequestParam String scname) {
List scoreInfoList = scoreInfoService.list(new QueryWrapper().eq("scname", scname).eq("sid", LoginController.sid));
model.addAttribute("scoreInfoList", scoreInfoList);
return "scoreList";
}
}
学生个人成绩
.content {
border: 0;
}
input:not([type="submit"]) {
margin-bottom: 20px;
}
input[type="submit"], button {
width: 90px;
}
table {
width: 900px;
margin: auto;
}
添加学生成绩
添加学生成绩
.content {
width: 400px;
height: 270px;
}
input:not([type="submit"]) {
margin-top: 15px;
}
修改学生成绩
修改学生成绩
.content {
width: 400px;
height: 270px;
}
input:not([type="submit"]) {
margin-top: 15px;
}
下面代码是学生信息的增删改查后端代码,前端代码可以参照上面的代码编写。注意路径。
import org.springframework.ui.Model;
@Controller
@RequestMapping("/mybatisplus/studentInfo")
public class StudentInfoController {
final IStudentInfoService studentInfoService;
public StudentInfoController(IStudentInfoService studentInfoService) {
this.studentInfoService = studentInfoService;
}
// TODO 下面代码须要添加路径(1/2/3/4/5/6/7)
/**
* 跳转到学生信息页面
*
* @param model 学生信息列表
* @return 学生信息页面
*/
@RequestMapping("/1")
public String studentInfoList(Model model) {
List studentInfos = studentInfoService.list();
model.addAttribute("studentInfos", studentInfos);
return "";
}
/**
* 跳转到学生信息添加页面
*
* @return 学生信息添加页面
*/
@RequestMapping("/2")
private String studentInfoAdd() {
return "";
}
/**
* 学生信息添加操作
*
* @param studentInfo 学生信息
* @return 学生信息页面
*/
@RequestMapping("/3")
private String addStudentInfo(StudentInfo studentInfo) {
studentInfoService.save(studentInfo);
return "";
}
/**
* 删除指定学生信息操作
*
* @param id 学生id
* @return 学生信息页面
*/
@RequestMapping("/4/{id}")
private String removeStudentInfo(@PathVariable Integer id) {
studentInfoService.removeById(id);
return "";
}
/**
* 跳转到更新学生信息页面
*
* @param id 学生id
* @param model 学生信息
* @return 学生信息更新页面
*/
@RequestMapping("/5/{id}")
private String studentInfoUpdate(@PathVariable("id") Integer id, Model model) {
StudentInfo studentInfo = studentInfoService.getById(id);
model.addAttribute("studentInfo", studentInfo);
return "";
}
/**
* 更新学生信息操作
*
* @param studentInfo 学生信息
* @return 学生信息页面
*/
@RequestMapping("/6")
private String updateStudentInfo(StudentInfo studentInfo) {
studentInfoService.updateById(studentInfo);
return "";
}
/**
* 通过姓名查询学生信息
*
* @param model 学生信息
* @param sname 学生姓名
* @return 学生信息页面
*/
@RequestMapping("/7")
public String queryStudentInfo(Model model, @RequestParam String sname) {
List studentInfoList = studentInfoService.list(new QueryWrapper().eq("sname", sname));
model.addAttribute("studentInfoList", studentInfoList);
return "";
}
}