上一篇创建了一个最简单的Spring Boot 2.x项目,算是有了一个初步的认识。
这一篇我们在上一篇项目的基础上,实现以下目标:
1、项目中整合Mybatis Generator进行mapper相关文件的自动生成;
2、整合Mybatis连接数据库并且实现单表的增删改查;
3、并且使用Sping Boot 2.x默认的HikariCP作为数据库连接池;
一、引入相关依赖
在pom.xml中添加如下依赖项:
org.springframework.boot
spring-boot-starter-jdbc
mysql
mysql-connector-java
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.2
并且排除tomcat的默认jdbc;在spring-boot-starter-web依赖进行修改,如下
org.springframework.boot
spring-boot-starter-web
org.apache.tomcat
tomcat-jdbc
只需要导入spring-boot-starter-jdbc依赖springboot就默认使用Hikari作为数据库连接池了
二、创建数据库表
数据库名称:bgms
用户名:bgms
密码:bgms
我们创建的表的结构如下:
CREATE TABLE `tb_user_info` (
`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID号,自动增长',
`USER_NAME` varchar(32) DEFAULT NULL COMMENT '用户名',
`PASSWORD` varchar(64) DEFAULT NULL COMMENT '密码',
`AGE` int(11) DEFAULT NULL COMMENT '年龄',
`EMAIL` varchar(128) DEFAULT NULL COMMENT '邮箱',
`CREATE_TIME` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
三、整合mybatis-generator并生成mybatis相关文件(实体类,映射文件等)
为了使实体类,映射文件以及数据库操作相关的类自动生成,我们使用mybatis-generator进行生成,这里我们对其进行整合
1、准备工作
在com.aicode.bgms下分别创建mapper、model目录;
在resources下分别创建mapping/generator目录;
将generatorConfig.xml文件复制到generator目录下:
generatorConfig.xml代码如下:
修改mysql连接池使用的jar包地址为你自己本地的地址,修改classPathEntry中的location;
修改其他相关内容,包括model路径,mapping路径,dao文件路径以及数据库表名和对应要生成的类名。
2、在pom.xml中的
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.2
${basedir}/src/main/resources/generator/generatorConfig.xml
true
true
3、在application.properties中添加如下配置内容
spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp
server.port=8080
# datasource start
#数据库连接相关配置
spring.datasource.url=jdbc:mysql://localhost:3306/bgms?zeroDateTimeBehavior=convertToNull&autoReconnect=true&autoReconnectForPools=true&useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=bgms
spring.datasource.password=bgms
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# Hikari will use the above plus the following to setup connection pooling
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=1765000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1
# datasource end
# mybatis start
# mybatis日志配置
logging.level.com.battcn=DEBUG
#注意:一定要对应mapper映射xml文件的所在路径
mybatis.mapper-locations=classpath:mapping/*.xml
mybatis.type-aliases-package=com.aicode.bgms.model
# 驼峰命名规范 如:数据库字段role_code,实体字段要写成 roleCode
mybatis.configuration.map-underscore-to-camel-case=true
# mybatis end
注册上面的mysql驱动类已经变为com.mysql.cj.jdbc.Driver,而不是原来的com.mysql.jdbc.Driver,因为我们引入mysql的jar包依赖时没有标注版本号,查看spring boot的使用版本为,如下图:
另外上面配置中,我们采用spring boot推荐的HiKariCP进行数据库连接。HiKariCP起源于BoneCP。号称性能最好,可以完美地PK掉其他连接池。参考地址:
https://jolbox.com/benchmarks.html
网上对HiKariCP更是好评如潮。
英文不太好的同学也可以参考网友的博文:
https://blog.csdn.net/clementad/article/details/46928621
https://blog.csdn.net/zxl315/article/details/80420688
且不论HiKariCP是否是真的有说的那么优秀吧,这里我们也为了简单,暂且使用它。
4、Intellij Idea 中mybatis-generator启动配置
在Idea中点击依次点击,菜单Run——〉Edit Configurations...
进入如下Run/Debug Run Configurations界面,然后点击左上角的"+",然后选择maven
如上图所示,Name输入generator,Command line输入:
mybatis-generator:generate -e
然后点击"ok"按钮;
5、生成实体类及映射文件
运行上一步配置的generator,此时会生成mybatis相关的实体类及映射文件,生成后,如下图所示:
可以看到新生成的四个文件:UserInfoMapper.java、UserInfoExample.java、UserInfo.java、UserInfoMapper.xml;
此四个文件为自动生成,这里不再贴出,浪费篇幅;
另外,有时我们可能需要自己写一些操作数据库的mapper方法,这里为了不修改自动生成的代码,我们把自行编写的dao方法放在extra目录下xxxxExtraMapper.java中,如下图:
UserInfoExtraMapper.java
package com.aicode.bgms.mapper.extra;
import com.aicode.bgms.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface UserInfoExtraMapper {
UserInfo findUserInfoByUserName(@Param("userName") String userName);
}
UserInfoExtraMapper.xml
ID, USER_NAME, PASSWORD, AGE, EMAIL, CREATE_TIME
如果有自定义的pojo类,可以放在model目录下的extra目录下,命名方式参考其他扩展文件。
四、创建Service相关类
1、创建Service接口类
在com.aicode.bgms下创建service包,然后创建UserInfoSerevice.java接口类,如下:
package com.aicode.bgms.service;
import com.aicode.bgms.model.UserInfo;
import com.aicode.bgms.model.UserInfoExample;
import java.util.List;
public interface UserInfoService {
List findUserListByExample(UserInfoExample example);
List findAll();
UserInfo findUserInfoByUserName(String userName);
UserInfo getUserInfoById(Integer id);
int addUserInfo(UserInfo userInfo);
int updateUserInfo(UserInfo userInfo);
int removeUserInfoById(Integer id);
}
2、创建Service实现类
在com.aicode.bgms.service包下创建impl包,然后创建UserInfoServiceImpl.java类
package com.aicode.bgms.service;
import com.aicode.bgms.mapper.UserInfoMapper;
import com.aicode.bgms.mapper.extra.UserInfoExtraMapper;
import com.aicode.bgms.model.UserInfo;
import com.aicode.bgms.model.UserInfoExample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserInfoServiceImpl implements UserInfoService {
@Autowired
private UserInfoMapper userInfoMapper;
@Autowired
private UserInfoExtraMapper userInfoExtraMapper;
@Override
public List findUserListByExample(UserInfoExample example) {
return userInfoMapper.selectByExample(example);
}
@Override
public List findAll() {
return userInfoMapper.selectByExample(new UserInfoExample());
}
@Override
public UserInfo findUserInfoByUserName(String userName) {
return userInfoExtraMapper.findUserInfoByUserName(userName);
}
@Override
public UserInfo getUserInfoById(Integer id) {
return userInfoMapper.selectByPrimaryKey(id);
}
@Override
public int addUserInfo(UserInfo userInfo) {
return userInfoMapper.insertSelective(userInfo);
}
@Override
public int updateUserInfo(UserInfo userInfo) {
return userInfoMapper.updateByPrimaryKeySelective(userInfo);
}
@Override
public int removeUserInfoById(Integer id) {
return userInfoMapper.deleteByPrimaryKey(id);
}
}
这个时候,在代码中自动装配UserInfoMapper和UserInfoExtraMapper时,Idea会报红,但不影响正常运行,如果您想去掉,可以进行如下设置,依次进行如下操作:
File—〉Settings—〉Inspections—〉右侧找到Spinrg—〉Spring Core —〉Code—〉Autowiring for Bean Class,将右部的Severity设置为Warning即可。
在com.aicode.bgms.controller包下创建UserInfoController.java类
package com.aicode.bgms.controller;
import com.aicode.bgms.model.UserInfo;
import com.aicode.bgms.service.UserInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
public class UserInfoController {
@Autowired
private UserInfoService userInfoService;
@GetMapping("/list")
public List list(){
return userInfoService.findAll();
}
@PostMapping("/add")
public int add(UserInfo userInfo){
return userInfoService.addUserInfo(userInfo);
}
@GetMapping("/get/{id}")
public UserInfo get(@PathVariable("id") Integer id){
return userInfoService.getUserInfoById(id);
}
@PatchMapping("/edit")
public UserInfo modify(UserInfo userInfo) {
Integer id = userInfo.getId();
userInfoService.updateUserInfo(userInfo);
UserInfo userInfoTmp = userInfoService.getUserInfoById(id);
return userInfoTmp;
}
@DeleteMapping("/del/{id}")
public int del(@PathVariable("id") Integer id){
return userInfoService.removeUserInfoById(id);
}
}
代码比较简单,没有添加多余的注释。
这里为了测试接口方便采用了注解@RestController。后面要返回页面时,我们再修改为@Controller
关于@RestController与@Controller的区别如下:
@RestController注解相当于@ResponseBody + @Controller合在一起的作用
1) 、如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。
2) 、如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。
以上代码是按照RESTful的方式进行构建的。
相关注解说明:
文件中代码如下:
@GetMapping(value="/xxx")
等价于
@RequestMapping(value = "/xxx",method = RequestMethod.GET)
@PostMapping(value="/xxx")
等价于
@RequestMapping(value = "/xxx",method = RequestMethod.POST)
@PutMapping(value="/xxx")
等价于
@RequestMapping(value = "/xxx",method = RequestMethod.PUT)
@DeleteMapping(value="/xxx")
等价于
@RequestMapping(value = "/xxx",method = RequestMethod.DELETE)
@PatchMapping(value="/xxx")
等价于
@RequestMapping(value = "/xxx",method = RequestMethod.PATCH)
请求 地址 说明
get /list 获取所有用户信息
post /add 创建一个用户信息
patch /edit 修改用户信息
get /get/{id} 根据 ID 获取用户信息
delete /del/{id} 根据 ID 删除用户信息
好了,剩下的代码可以自己分析了,这里只是为了方便进行RESTful测试,没有对代码进行详细编写。
测试
启动类配置
需要在启动类中添加如下注解:
@MapperScan(basePackages = "com.aicode.bgms.mapper")
方可正常启动。