Springboot整合Mybatis


1.准备工作

在开始本教程之前,请确保已经熟悉一下几点。

  • Spring Boot 基本语法,至少要懂得Controller、RestController、Autowired等这些基本注释。
  • SQL基本语句,至少要能连接上数据库进行操作。
  • 开发工具 Interllij idea的基本操作。
  • mybatis基本语法,至少要namespace、resultMap等

    程序目录结构:

    image.png

    2.程序实现过程

    2.1依赖管理

    引入以下这些:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <!-- SpringBoot的Mybatis启动器 -->
    <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
    </dependency>

    <!--数据库驱动依赖-->
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
    </dependency>

    <!--lombox依赖 -->
    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
    </dependency>
    当添加完依赖以后,右键Maven –》Reimport下。

    application.yml配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    spring:
    datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://193.112.177.168:3306/end?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: silin
    password: tRdJjpwCi2cejKk2

    mybatis:
    mapper-locations: classpath:mapping/UserMapper.xml
    ##2.3实现代码
    话不多说,看代码。
    ###User.java文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Data
    public class User {
    private int id;
    private String userName;
    private String passWord;
    private String realName;
    private String phone;
    private Integer age;
    @JsonIgnore
    private Date createTime;
    }
    可能小伙伴们这时候,不太明白@Date,这就是Pom.xml添加的lombox依赖,而lombox的背景介绍大致意思是Lombok通过增加一些“处理程序”,可以让java变得简洁、快速。而@Data注解在类上,会为类的所有属性自动生成setter/getteequalscanEqualhashCodetoString方法,如为final属性,则不会为该属性生成setter方法。同时在idea开发工具也需要安装 lombox插件,这种感兴趣的小伙伴可以了解一下。
    ###UserMapper.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Repository
    //@Mapper
    public interface UserMapper {

    /**
    * 读取用户名
    * @param username
    * */
    User findByName(String username);

    }

###UserMapper.xml
在resresources文件下新建一个mapping文件,在mapping下新建Usermapper.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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.bin_jade.demo.mapper.UserMapper">

<resultMap id="BaseResultMap" type="com.bin_jade.demo.domain.User">
<result column="id" jdbcType="INTEGER" property="id" />
<result column="userName" jdbcType="VARCHAR" property="userName" />
<result column="passWord" jdbcType="VARCHAR" property="passWord" />
<result column="realName" jdbcType="VARCHAR" property="realName" />
<result column="phone" jdbcType="VARCHAR" property="phone"/>
<result column="age" jdbcType="VARCHAR" property="age" />
<result column="createTime" jdbcType="TIMESTAMP" property="createTime" />
</resultMap>

<select id="findByName" resultType="com.bin_jade.demo.domain.User">
select * from user where userName = #{userName}
</select>


</mapper>

  • 检查xml文件的namespace是否和UserMapper.java文件的package名称一一对应
  • 检查函数名称能否对应上

    UserService .java

    1
    2
    3
    4
    5
    6
    public interface UserService {

    /*
    * 读取用户名*/
    User findByName(String username);
    }

    UserServiceImpl.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Service
    public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public User findByName(String username) {
    return userMapper.findByName(username);
    }
    }
    这里我就不写controll层了,我直接写测试类

    UserServiceImplTest.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class UserServiceImplTest {

    @Autowired
    private UserService userService;

    @Test
    public void findByName() {
    User user = userService.findByName("admin");
    Assert.assertEquals(1,user.getId());

    }
    }
    执行结果:
    image.png

3.报错情况

mybatis配置时出现org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
如果出现:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
一般的原因是Mapper interface和xml文件的定义对应不上,需要检查包名,namespace,函数名称等能否对应上,需要比较细致的对比,我经常就是写错了一两个字母搞的很长时间找不到错误
按以下步骤一一执行:
1:检查xml文件所在的package名称是否和interface对应的package名称一一对应
2:检查xml文件的namespace是否和xml文件的package名称一一对应
3:检查函数名称能否对应上
4:去掉xml文件中的中文注释
5:随意在xml文件中加一个空格或者空行然后保存
一般来说到此就可以排除错误了

同时有可能是在进行application.yml配置mybatis的时候,没有顶左边栏也会报错。

1
2
3
4
5
spring:

mybatis: //这段配置没有顶左边栏也会报错
mapper-locations: classpath:mapping/UserMapper.xml

致谢

感谢您到来,如对您有帮助,请给小编一点温暖~~

查看评论