SpringBoot+Mybatis(2)

上一篇写了SpringBoot+Mybatis项目创建,以及注解方式实现查询功能。

这篇我们讲一下使用xml方式实现查询功能,以及一些常用的功能和配置。

这样,我们先创建一个Mapper接口,不写对应的xml,调用一下看会不会报错。

1. 创建TestMapper02
package com.example.mybatistest01.demo.mapper;

import org.apache.ibatis.annotations.Mapper;

/**
 * @author 木子的昼夜编程
 */
@Mapper
public interface TestMapper02 {
     int count();
}

2. 不配置xml 直接使用
    @Autowired
    TestMapper02 testMapper02;

    @Test
    void test02() {
        int count = testMapper02.count();
        System.out.println("表aaaa总共有记录数:"+count);
    }

这个时候就报错了,这个错误我们肯能都见过:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

SpringBoot+Mybatis(2)

这个错是什么意思呢,意思就是你调用我干什么,我都不知道执行什么,你倒是给我指定一个SQL呀!!也就是Mybatis接口找不到指定的statement

3. 给他指定一个

首先我们要在配置文件中指定mapper文件所在路径

我们一般放到resources下边,用Mapper结尾(例如testMapper.xml)

mybatis:
  mapper-locations: classpath:mybatis/*Mapper.xml
4. 编写一个xml

Test02Mapper.xml

这里基本语法我们不说了,之前将Mybatis的时候已经讲过了

最主要的是注意一点:namespaceid

namespace 一定是对应Mapper接口地址(com.example.mybatistest01.demo.mapper.TestMapper02.java)

id 是接口中方法的名字

至于为什么这样,其实我们解析Mybatis源码的时候有讲到过 (可以想象成Map的key值)

<?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.example.mybatistest01.demo.mapper.TestMapper02">

    <select id="count"  resultType="integer">
        select count(1) from `aaaa`
    </select>


</mapper>
5. 再次测试

成功了 我们就不演示了

6. 我们返回类型用PO对象
6.1 看一下我们表结构和表数据

SpringBoot+Mybatis(2)

创建PO对象

package com.example.mybatistest01.demo.po;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * @author 木子的昼夜编程
 */
public class TestPO {
    private Long id;
    private String name;
    private BigDecimal money;
    private LocalDateTime time;

    @Override
    public String toString() {
        return "TestPO{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                ", time=" + time +
                '}';
    }
}
6.3 编写一个查询方法

接口方法:

TestPO getById(Long id);

xml方法:

注意我们这里用的是PO全路径,我们可以配置一下type-aliases-package 然后用别名就行了

<select id="getById" resultType="com.example.mybatistest01.demo.po.TestPO">
    select * from aaaa where id = #{id}
</select>
6.4 测试
@Test
void test03() {
    TestPO po = testMapper02.getById(1L);
    System.out.println("查询结果:"+po);
}

输出结果:

查询结果:TestPO{id=1, name='张三', money=10001, time=2021-01-29T11:04:25
6.4 配置PO别名
mybatis:
  # mapper映射
  mapper-locations: classpath:mybatis/*Mapper.xml
  # 别名
  type-aliases-package: com.example.mybatistest01.**.po
6.6 配置别名后直接使用别名即可

说是不区分大小写 TESTPO、TestPO、testPO 都可以

我猜他在找对应PO的时候把resultType转换为全小写(或全大写)进行使用的

<select id="getById" resultType="testPO">
    select * from aaaa where id = #{id}
</select>
插曲

遇到了一个错误:org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1

好像遇到过,但是忘记是因为什么了,搜了一下解决方案:因为yml文件格式不对了,不知道为什么直接成了GBK,可能是因为我有中文注释,改成UTF-8就好了 ,怎么改?

自己百度吧,每个人编辑器都不一样,我是直接右下角有一个编码下拉框,直接改了就好了。

SpringBoot+Mybatis(2)

插曲02

我们看输出可以知道默认用的是com.zaxxer.hikari.HikariDataSource

hikari

唠唠

xml方式也很简单,一般我们配置写好了,就不需要关注这些,只需要关注业务即可。

我们生产中大部分用的都是返回PO的方式,这样结合一些框架比较好实现,比如MybatisPlus、tk.mybatis等

这些我们后边会写简单使用示例,如果项目中有什么问题可以到我公众号留言:木子的昼夜编程

好好学习吧,有一句话说的好:打败你的不是天真,是不会还不学。


欢迎关注公众号:
SpringBoot+Mybatis(2)

上一篇:Java springboot实现定时调用函数


下一篇:springboot-项目实战:登录拦截器