SpringBoot整合MyBatis
一、准备工作
首先新建一个空工程,springboot相关的整合都放在该工程下。
该空工程名称为spring-boot-example
创建好的空工程如下:
接着我们创建模块
注:使用Spring Initializr是从Spring.io上获取工程,需要保证电脑有网。
模块分组为com.spring.boot.example
模块名为spring-boot-mybatis
添加MyBatis
添加MySQL驱动依赖
整合mybatis只需要添加MyBatis Framework,SQL驱动即可,
但为了从前端到调用后端接口的完整流程,我们将Web中Spring Web也加上。
创建完成后如下图所示
完整pom.xml依赖
<?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.2.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.spring.boot.example</groupId> <artifactId>spring-boot-mybatis</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-boot-mybatis</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!-- web依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency> <!-- MySQL驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </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>
准备工作做完后,我们接下来创建一张表。和该表对应的实体类。
建表语句:
CREATE TABLE `user` ( `id` int(11) NOT NULL COMMENT 'id', `name` varchar(50) DEFAULT NULL COMMENT 'name', `address` varchar(100) DEFAULT NULL COMMENT 'address', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
创建实体类
package com.spring.boot.example.springboot.mybatis.dao; public class User { private Integer id; private String name; private String address; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
二、配置
整体流程:
1首先配置数据库连接地址,用户名密码、驱动。
2编写对应xml文件并与接口关联
3 配置文件添加mybatis相关配置,Spring启动类添加注解扫描对应接口
2.1 配置数据库基本信息
在application.properties中进行配置,具体内容如下:
#数据库地址,localhost使用的本地数据库,如未配置localhost映射可使用127.0.0.1 spring.datasource.url=jdbc:mysql://localhost:3306/spring-boot-example #用户名密码 spring.datasource.username=xxxx spring.datasource.password=xxxxxx #数据库驱动 #此處驱动有两个 #com.mysql.jdbc.Driver #com.mysql.cj.jdbc.Driver #MySQL5用的驱动url是com.mysql.jdbc.Driver,MySQL6以后用的是com.mysql.cj.jdbc.Driver。 #使用何种驱动,根据安装MySQL的版本而定 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #附:使用com.mysql.cj.jdbc.Driver如果出现时区问题(Caused by: java.sql.SQLException: The server time zone value 'XXXXXXXXX' is unrecognized...) #解决方法一:可参阅https://blog.csdn.net/weixin_43976890/article/details/91397749(未尝试) #解决方法二:在数据库中执行如下语句: set GLOBAL time_zone='+8:00';(已尝试) #以上配置都在org.springframework.boot.autoconfigure.jdbc包中。 #mybatis-spring-boot-starter依赖了spring-boot-starter-jdbc。 #自动配置时会将数据库连接相關信息注入到mybatis中
数据库连接信息配置后,我们先来测试下。
在test文件下,找到测试类,SpringBootMyBatisApplicationTests.
测试类具体内容如下:
package com.spring.boot.example.springboot.mybatis; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.sql.DataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; @SpringBootTest //使其运行在spring环境中进行测试. //@RunWith如果没有,需要添加Junit依赖,具体解决方法在下面。 @RunWith(SpringJUnit4ClassRunner.class) class SpringBootMybatisApplicationTests { @Autowired private DataSource dataSource; @Test void contextLoads() throws SQLException {
//根据配置的数据库信息获取连接,执行语句 Connection connection = dataSource.getConnection(); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("select * from user"); //打印结果 while(resultSet.next()){ int id = resultSet.getInt(1); String name = resultSet.getString(2); String address = resultSet.getString(3); System.out.println("id:" + id + " name:" + name + " address:" + address); } } }
将光标放置contextLoads方法名上,鼠标右键点击运行该方法。
控制台中打印了数据库表中数据
没有RunWith可将光标移至RunWith出,按住Alt+Enter点击AddJUnit4 to classpath.
如果没有提示,可直接在pom.xml中添加JUnit依赖,两者效果一致。
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency>
至此,数据库信息配置正确。
2.2编写接口类xml文件。
首先编写接口类,具体内容如下:
package com.spring.boot.example.springboot.mybatis.mapper; import com.spring.boot.example.springboot.mybatis.dao.User; public interface UserMapper { User getUserById(Integer id); }
然后在resource文件夹下新建一个mapper文件夹编写对应的xml
具体内容如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- 此处与接口类地址对应 --> <mapper namespace="com.spring.boot.example.springboot.mybatis.mapper.UserMapper"> <!-- 此处与接口方法名对应 指定参数类型与返回结果类型--> <select id="getUserById" parameterType="java.lang.Integer" resultType="com.spring.boot.example.springboot.mybatis.dao.User"> select * from user where id = #{id} </select> </mapper>
2.3配置文件添加相关信息,SpringBoot启动类添加扫描接口注解
在application.properties中添加如下配置,指明映射文件位置。
#指定映射xml文件位置 #classpath对应resource,*.xml表示配置mapper下所有xml文件 mybatis.mapper-locations=classpath:mapper/*.xml
在SpringBoot启动类下添加扫描接口的注解,这里扫描的是接口,不是xml。
package com.spring.boot.example.springboot.mybatis; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.spring.boot.example.springboot.mybatis.mapper")//扫描指定包下接口 public class SpringBootMybatisApplication { public static void main(String[] args) { SpringApplication.run(SpringBootMybatisApplication.class, args); } }
我们继续在test下找到测试类,编写测试UserMapper的方法
package com.spring.boot.example.springboot.mybatis; import com.spring.boot.example.springboot.mybatis.dao.User; import com.spring.boot.example.springboot.mybatis.mapper.UserMapper; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.sql.DataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; @SpringBootTest //使其运行在spring环境中进行测试. //@RunWith如果没有,需要添加Junit依赖,解决方法参考下述 @RunWith(SpringJUnit4ClassRunner.class) class SpringBootMybatisApplicationTests { @Autowired private DataSource dataSource; @Autowired private UserMapper userMapper; // @Test // void contextLoads() throws SQLException { // Connection connection = dataSource.getConnection(); // Statement statement = connection.createStatement(); // ResultSet resultSet = statement.executeQuery("select * from user"); // // while(resultSet.next()){ // int id = resultSet.getInt(1); // String name = resultSet.getString(2); // String address = resultSet.getString(3); // System.out.println("id:" + id + " name:" + name + " address:" + address); // } // } @Test void testUserMapper(){ User userById = userMapper.getUserById(1); System.out.println(userById.getId() + " " + userById.getAddress() + " " + userById.getName()); } }
运行testUserMapper,控制台中输出了查询到的信息。
最后我们新建一个controller文件夹,创建一个UserController类。
package com.spring.boot.example.springboot.mybatis.controller; import com.spring.boot.example.springboot.mybatis.dao.User; import com.spring.boot.example.springboot.mybatis.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class UserController { @Autowired private UserMapper userMapper; @ResponseBody @RequestMapping("/getUserById") public User getUserById(Integer id){ return userMapper.getUserById(id); } }
运行SpringBootDataApplication,
在地址栏输入如下地址(或用127.0.0.1代替localhost)
参考:
https://blog.csdn.net/superdangbo/article/details/78732700
https://www.cnblogs.com/huang-changfan/p/10244855.html
https://www.bilibili.com/video/av38657363?p=59