从0开始学习项目开发-DAY5-MYBATIS实现数据库查询
1、前言
记录从零基础学习编写 SpringBoot 项目的笔记,以防遗忘时可回溯温习。此文乃是笔者在开展从无到有编写 SpringBoot 项目的学习进程中所留存的笔记,同时涵盖了记录期间遭遇的部分问题及其解决之法,亦包含了些许个人的思考与见解。
2、MYBATIS实现数据库查询
在Spring Boot中使用MyBatis进行数据库操作是一种非常常见且高效的方式。MyBatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。它消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
功能描述
通过接口上传phoneNum,从phone_area表查询数据运营商和归属地信息。
创建phone_area表
CREATE TABLE phone_area (
id INT AUTO_INCREMENT PRIMARY KEY,
phone_num VARCHAR(11) NOT NULL,
phone_area VARCHAR(200) NOT NULL,
phone_operator VARCHAR(20) NOT NULL
);
添加依赖项
在Spring Boot项目的pom.xml文件中添加MyBatis和数据库相关的依赖。
<!-- MyBatis Spring Boot Starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
<scope>runtime</scope>
</dependency>
配置application.properties
在application.properties中添加数据库连接配置和mybatis相关配置。
spring.datasource.url=jdbc:mysql://localhost:3306/juziTemplate?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=admin123
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis.type-aliases-package=com.test.juzi.model
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.configuration.map-underscore-to-camel-case=true
创建实体类
package com.test.juzi.model;
public class PhoneArea {
private int id;
private String phoneNum;
private String phoneArea;
private String phoneOperator;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
public String getPhoneArea() {
return phoneArea;
}
public void setPhoneArea(String phoneArea) {
this.phoneArea = phoneArea;
}
public String getPhoneOperator() {
return phoneOperator;
}
public void setPhoneOperator(String phoneOperator) {
this.phoneOperator = phoneOperator;
}
}
创建Mapper接口
@Mapper
public interface PhoneAreaMapper {
PhoneArea getPhoneArea(@Param("phoneNum") String phoneNum);
}
创建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.test.juzi.mapper.PhoneAreaMapper">
<select id="getPhoneArea" resultType="com.test.juzi.model.PhoneArea">
SELECT * FROM phone_area where phone_num= #{phoneNum};
</select>
</mapper>
测试结果
过程中遇到的问题
问题1:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
解决方案:Mapper interface和xml文件的定义对应不上(需要检查包名,namespace)
问题2:Invalid bean definition with name ‘userMapper‘ defined in file
解决方案:mybatis版本问题,spring-boot使用的是3.3.10版本,mybatis使用的为2.2.0版本。替换为3.0.3版本解决。
问题3: mybatis 数据库表字段和mapper字段不一致,例如:数据库为phone_num,mapper字段定义为phoneNum
解决方案:增加mybatis配置,支持phone_num转换为驼峰形式
mybatis.configuration.map-underscore-to-camel-case=true