上一篇写了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)
这个错是什么意思呢,意思就是你调用我干什么,我都不知道执行什么,你倒是给我指定一个SQL呀!!也就是Mybatis接口找不到指定的statement
3. 给他指定一个
首先我们要在配置文件中指定mapper文件所在路径
我们一般放到resources下边,用Mapper结尾(例如testMapper.xml)
mybatis:
mapper-locations: classpath:mybatis/*Mapper.xml
4. 编写一个xml
Test02Mapper.xml
这里基本语法我们不说了,之前将Mybatis的时候已经讲过了
最主要的是注意一点:namespace 、id
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 看一下我们表结构和表数据
创建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就好了 ,怎么改?
自己百度吧,每个人编辑器都不一样,我是直接右下角有一个编码下拉框,直接改了就好了。
插曲02
我们看输出可以知道默认用的是com.zaxxer.hikari.HikariDataSource
hikari
唠唠
xml方式也很简单,一般我们配置写好了,就不需要关注这些,只需要关注业务即可。
我们生产中大部分用的都是返回PO的方式,这样结合一些框架比较好实现,比如MybatisPlus、tk.mybatis等
这些我们后边会写简单使用示例,如果项目中有什么问题可以到我公众号留言:木子的昼夜编程
好好学习吧,有一句话说的好:打败你的不是天真,是不会还不学。
欢迎关注公众号: