SpringBoot整合Mybatis
本例是基于generator插件生成的pojo类和mapper文件编写的。
1.搭建项目环境
[1]创建项目
[2]pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.qt</groupId>
<artifactId>springbootmybatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springbootmybatis</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
[3]配置数据源
本次配置文件选用yml格式的配置文件
把application.properties文件改成application.yml文件
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 1111
2.配置 Maven 的 generator 插件
[1]添加 generator 插件坐标
<!--配置generator插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
</dependencies>
<!--指定配置文件的路径-->
<configuration>
<configurationFile>${project.basedir}/src/main/resources/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
[2]添加 generator 配置文件
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>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/springboot" userId="root" password="1111">
</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.qt.springbootmybatis.pojo"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.qt.springbootmybatis.mapper"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.qt.springbootmybatis.mapper"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据库表 -->
<table schema="" tableName="users"></table>
</context>
</generatorConfiguration>
[3]运行 generator 插件生成代码
3.配置资源拷贝插件
[1]添加资源拷贝插件坐标
<!--配置资源拷贝插件-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
[2]springboot关联mapper
方式一:修改启动类添加@MapperScan 注解
修改启动类,添加@MapperScan注解
@SpringBootApplication
@MapperScan("com.qt.springbootmybatis.mapper")//指定扫描接口与映射配置文件的包名
public class SpringbootmybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootmybatisApplication.class, args);
}
}
方式二:在每个mapper接口文件上添加注解
@Mapper
@Repository
public interface UsersMapper {
...
}
4.MyBatis 的其他配置项
在application.yml中配置mybatis相关配置
mybatis:
#扫描 classpath 中 mapper 目录下的映射配置文件,针对于映射配置文件放到了 resources 目录下
mapper-locations: classpath:/mapper/*.xml
#定义包别名,使用 pojo 时可以直接使用 pojo 的类型名称不用加包名
type-aliases-package: com.qt.springbootmybatis.pojo
5.添加用户功能
[1]创建前端页面
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:th="http://www.thymeleaf.org">
<head >
<title>Title</title>
<link rel="shortcut icon" href="../resources/favicon.ico" th:href="@{/static/favicon.ico}"/>
</head>
<body>
<form th:action="@{/user/addUser}" method="post">
<p>
用户名:<input type="text" name="username">
</p>
<p>
性别:<input type="text" name="usersex">
</p>
<p>
<input type="submit" value="提交">
</p>
</form>
</body>
</html>
[2]创建Controller
1.创建PageController
/**
* 页面跳转Controller
*/
@Controller
public class PageController {
/**
* 页面跳转方法
* @param path
* @return
*/
@RequestMapping("/{path}")
public String getPath(@PathVariable String path){
return path;
}
}
2.创建UserController
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("addUser")
public String addUser(Users users){
try {
this.userService.addUser(users);
}catch (Exception e){
e.printStackTrace();
return "error";
}
return "redirect:/success";
}
}
[3]创建Service
UserServiceImpl
/**
* 用户管理业务层
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UsersMapper usersMapper;
/**
* 添加用户
* @param users
*/
@Override
@Transactional
public void addUser(Users users) {
this.usersMapper.insert(users);
}
}
6.查询用户
[1]修改Service层
/**
* 查询所有用户
* @return
*/
@Override
public List<Users> findUsers() {
UsersExample example=new UsersExample();
return this.usersMapper.selectByExample(example);
}
[2]修改Controller层
UserController
@GetMapping("findUsers")
public String findUsers(Model model){
try {
List<Users> users = this.userService.findUsers();
model.addAttribute("list",users);
}catch (Exception e){
e.printStackTrace();
return "error";
}
return "showUsers";
}
[3]创建前端页面
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Title</title>
<link rel="shortcut icon" href="../resources/favicon.ico" th:href="@{/static/favicon.ico}"/>
</head>
<body>
<table border="1px" align="center">
<tr>
<th>用户id</th>
<th>用户姓名</th>
<th>用户性别</th>
<th>操作</th>
</tr>
<tr th:each="u:${list}">
<td th:text="${u.userid}"></td>
<td th:text="${u.username}"></td>
<td th:text="${u.usersex}"></td>
<td>
<a th:href="@{/user/preUpdateUser(userid=${u.userid})}">修改</a>
<a th:href="@{/user/delUser(userid=${u.userid})}">删除</a>
</td>
</tr>
</table>
</body>
</html>
7.查询单个用户(实现预更新)
[1]修改Service层
/**
* 根据id查询单个用户
* @param userid
* @return
*/
@Override
public Users findUserById(Integer userid) {
return this.usersMapper.selectByPrimaryKey(userid);
}
[2]修改Controller层
@GetMapping("preUpdateUser")
public String preUpdateUser(Integer userid,Model model){
try {
Users user = this.userService.findUserById(userid);
model.addAttribute("user",user);
}catch (Exception e){
e.printStackTrace();
return "error";
}
return "updateUser";
}
[3]创建前端页面
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Title</title>
<link rel="shortcut icon" href="../resources/favicon.ico" th:href="@{/static/favicon.ico}"/>
</head>
<body>
<form th:action="@{/user/updateUser}" method="post">
<input type="hidden" name="userid" th:value="${user.userid}">
<p>
用户名:<input name="username" type="text" th:value="${user.username}">
</p>
<p>
用户性别:<input name="usersex" type="text" th:value="${user.usersex}">
</p>
<p>
<input type="submit" value="提交">
</p>
</form>
</body>
</html>
8.更新用户
[1]修改service层
/**
* 更新用户
* @param users
*/
@Override
@Transactional
public void updateUser(Users users) {
this.usersMapper.updateByPrimaryKey(users);
}
[2]修改Controller层
@PostMapping("updateUser")
public String updateUser(Users users){
try {
this.userService.updateUser(users);
}catch (Exception e){
e.printStackTrace();
return "error";
}
return "success";
}
9.删除功能
[1]修改Service层
/**
* 删除用户
* @param userid
*/
@Override
@Transactional
public void dropUser(Integer userid) {
this.usersMapper.deleteByPrimaryKey(userid);
}
[2]修改Controller层
@GetMapping("delUser")
public String delUser(Integer userid){
try {
this.userService.dropUser(userid);
}catch (Exception e){
e.printStackTrace();
return "error";
}
return "success";
}