【创建springboot-maven项目搭建mybatis框架】(超详细)

news2025/2/28 20:15:55

目录

1. 创建Spring Boot项目,相关参数

2. 创建数据库

3. 在IntelliJ IDEA中配置Database面板

4. 添加数据库编程的依赖

5. 关于Mybatis框架

6. Mybatis编程:插入相册数据


1. 创建Spring Boot项目,相关参数

项目名称:csmall-product(自己取个名称)

Group:cn.tedu

Artifact:csmall-product

Package:cn.csmall.product

Java版本:1.8

创建项目时勾选的依赖项:无

Spring Boot版本:2.5.9(自行在pom.xml中修改)

2. 创建数据库

登录MySQL客户端,创建mall_pms数据库,命令如下:

create database mall_pms;

 

3. 在IntelliJ IDEA中配置Database面板

 

4. 添加数据库编程的依赖

pom.xml文件的<dependencies>标签内添加:

<!-- Mybatis整合Spring Boot的依赖项 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.2</version>
</dependency>
<!-- MySQL的依赖项 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

 当添加数据库编程的依赖项(以上的mybatis-spring-boot-starter)后,无论是测试,还是尝试启动项目,都会报错:

Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProperties\$DataSourceBeanCreationException: Failed to determine a suitable driver class

这是因为在执行Spring Boot测试,或启动项目时,只要项目中添加了数据库编程的依赖,就会自动读取连接数据库的配置,但是,目前还没有添加这些配置,所以报错!

src/main/resources下的application.properties中添加连接数据库的配置信息,此配置文件是Spring Boot项目默认的主配置文件。

添加的配置信息如下:

# 连接数据库的配置
spring.datasource.url=jdbc:mysql://localhost:3306/mall_pms?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root

注意:添加以上配置后,无论是启动项目,还是执行Spring Boot测试,都不会报告错误,但是,本质上只是读取了以上配置,并不代表以上配置是正确的!

可以在Spring Boot测试类中添加测试方法,以检验以上配置是否正确:

@Autowired
DataSource dataSource; // 数据源,导包时使用java.sql包

@Test
void getConnection() throws Throwable {
    dataSource.getConnection(); // 获取与数据库的连接对象,会执行连接到数据库的操作
}

如果配置信息中,连接数据库的URL中的主机名错误,则会出现:

Caused by: java.net.UnknownHostException: localhast

如果配置信息中,连接数据库的端口号错误,导致无法连接上,则会出现:

Caused by: java.net.ConnectException: Connection refused: connect

另外,如果MySQL服务没有启动,也会导致以上错误!

如果配置信息中,数据库名称错误,则会出现:

java.sql.SQLSyntaxErrorException: Unknown database 'm0ll_pms'

如果配置信息中,服务器时区值错误,则会出现:

Caused by: java.time.zone.ZoneRulesException: Unknown time-zone ID: Asia/Beijing

如果配置信息中,连接数据库的用户名或密码错误,则会出现:

java.sql.SQLException: Access denied for user 'root1234'@'localhost' (using password: YES)
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)

5. 关于Mybatis框架

Mybatis框架是主流的用于处理数据库编程的框架,主要用于简化数据库编程。

使用Mybatis框架,除了首次的“一次性”配置以外,主要的代码量在于:设计抽象方法、配置抽象方法映射的SQL语句。

6. Mybatis编程:插入相册数据

插入相册数据需要执行的SQL语句大致是:

insert into pms_album (name, description, sort) values (?, ?, ?)

提示:以上字段列表中,由于pms_album表的id是自动编号的,则不需要写上id字段名,在values部分也不需要写id字段的值。

使用Mybatis时,抽象方法必须设计在接口中,通常,此类接口使用Mapper作为接口名的最后一个单词。

则在项目的根包(创建项目后就已经自动创建好的包)下创建mapper.AlbumMapper接口:

package cn.tedu.csmall.product.mapper;

public interface AlbumMapper {
}

 然后,在接口中声明“插入相册数据”的抽象方法,即:

xx  xx(xx);

在使用Mybatis时,如果执行的是增、删、改操作,始终使用int作为返回值类型,表示“受影响的行数”,或者,也可以使用void,但不推荐。

关于方法的名称,阿里巴巴的《Java开发手册》提出了参考:

1) 获取单个对象的方法用 get 做前缀。
2) 获取多个对象的方法用 list 做前缀。
3) 获取统计值的方法用 count 做前缀。
4) 插入的方法用 save/insert 做前缀。
5) 删除的方法用 remove/delete 做前缀。
6) 修改的方法用 update 做前缀。

关于参数列表,应该根据SQL语句中的参数来设计,如果需要执行的SQL语句中的参数较多,且具有相关性,应该进行封装,本次需要执行“插入相册数据”,则可以使用“相册”数据的实体类作为参数。

关于MySQL中的字段类型与Java中的数据类型的对应关系:

MySQL中的数据类型Java中的数据类型
tinyint / smallint / intInteger
bigintLong
char / varchar / text系列String
decimalBigDecimal
datetimeLocalDateTime

为了便于编写Xxx类,先在pom.xml中添加lombok依赖:

<!-- Lombok的依赖项,主要用于简化POJO类的编写 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
    <scope>provided</scope>
</dependency>

此依赖项可以通过注解,在编译期生成某些代码,例如:Setters & Getters、hashCode()equals()toString()、无参数构造方法、全参数构造方法等。

在根包下创建pojo.entity.Album类:

package cn.tedu.csmall.product.pojo.entity;

import lombok.Data;

import java.io.Serializable;
import java.time.LocalDateTime;

@Data
public class Album implements Serializable {

    private Long id;
    private String name;
    private String description;
    private Integer sort;
    private LocalDateTime gmtCreate;
    private LocalDateTime gmtModified;

}

接下来,在AlbumMapper接口中添加抽象方法:

int insert(Album album);

然后,在src/main/resources下创建mapper文件夹,并在此文件夹中粘贴得到AlbumMapper.xml文件,关于此文件:

  • 根标签必须是<mapper>
  • 根标签上必须配置namespace属性,取值为对应的接口的全限定名
  • 使用<insert> / <delete> / <update> / <select>标签配置SQL语句,每个这类标签必须配置id属性,取值为抽象方法的名称,在标签内配置SQL语句

AlbumMapper.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="cn.tedu.csmall.product.mapper.AlbumMapper">

    <insert id="insert">
        INSERT INTO pms_album (
            name, description, sort
        ) VALUES (
            #{name}, #{description}, #{sort}
        )
    </insert>

</mapper>

最后,还需要完成首次使用Mybatis时的一次性配置,主要有2处:

  • 使得Mybatis明确Mapper接口的位置

    • 【推荐】在配置类上使用@MapperScan配置Mapper接口的根包
      • 在根包下,且添加了@Configuration的类,就是配置类
    • 【不推荐】在各Mapper接口上添加@Mapper注解
  • 使得Mybatis明确配置SQL语句的XML文件的位置

    • application.properties中配置

    • # 使用Mybatis时,配置SQL语句的XML文件的位置
      mybatis.mapper-locations=classpath:mapper/*.xml

至此,“插入相册数据”的功能开发完成,应该在src/test/java下的根包下,创建mapper.AlbumMapperTests测试类,编写并执行测试:

package cn.tedu.csmall.product.mapper;

import cn.tedu.csmall.product.pojo.entity.Album;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class AlbumMapperTests {

    @Autowired
    AlbumMapper mapper;

    @Test
    void insert() {
        Album album = new Album();
        album.setName("测试数据");
        album.setDescription("测试数据的简介");
        album.setSort(99); // 注意:sort值必须是[0, 255]之间的

        int rows = mapper.insert(album);
        System.out.println("插入数据完成,受影响的行数:" + rows);
    }

}

注意:测试类的名称不要与被测试的接口名称相同!

如果@MapperScan的包配置错误,导致Mybatis找不到Mapper接口,会出现错误:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'cn.tedu.csmall.product.mapper.AlbumMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

如果代码中存在发下某种错误:

  • 在XML中<mapper>标签的namespace值有误
  • 在XML中<insert>这类标签的id值有误
  • application.properties中配置的XML文件的位置有误

会出现错误:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.tedu.csmall.product.mapper.AlbumMapper.insert

如果SQL语句中的字段名拼写错误,会出现类似以下错误:

Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'descripton' in 'field list'

如果SQL语句中的参数值中#{}中的名称拼写错误(不是类中的属性名),会出现类似以下错误:

Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'descripton' in 'class cn.tedu.csmall.product.pojo.entity.Album'

个人主页:居然天上楼

感谢你这么可爱帅气还这么热爱学习~~

人生海海,山山而川

你的点赞👍 收藏⭐ 留言📝 加关注✅

是对我最大的支持与鞭策

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38986.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]java毕业设计中小企业人力资源管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

javaEE飞机航班信息查询网站系统

本系统主要包含了订票管理、航班信息管理、站内新闻管理、活动信息管理、用户信息管理、留言等多个功能模块。下面分别简单阐述一下这几个功能模块需求。 管理员的登录模块&#xff1a;管理员登录系统后台对本系统其他管理模块进行管理。 添加管理员模块&#xff1a;向本系统中…

UE5笔记【十】第一个蓝图项目:bluePrint。

我们将上升的斜坡或者楼梯隐藏&#xff0c;往下移动&#xff0c;使其隐藏在地面以下。然后将方块也向下移动&#xff0c;漏出一点来。我们要模拟的场景是&#xff1a;当人移动到蓝色方块上时&#xff0c;踩在方块上&#xff0c;上升的楼梯升起来。然后人可以上楼。 将蓝色方块…

HTML静态网页作业——电影介绍-你的名字 5页 无js 带音乐

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

基于双层优化的微电网系统规划设计方法matlab程序(yalmip+cplex)

基于双层优化的微电网系统规划设计方法matlab程序&#xff08;yalmipcplex&#xff09; 参考文献&#xff1a;基于双层优化的微电网系统规划设计方法 摘要&#xff1a;规划设计是微电网系统核心技术体系之一。从分布式电源的综合优化(组合优化、容量优化)和分布式电源间的调度…

【虚幻引擎UE】UE5 两种球体绘制方法

一、网格球体绘制 center 中心点向量 segments参数越大&#xff0c;线条越多 radius是球体半径 thickness 厚度可以不用管 Depth Priority 是渲染深度可以不用管 F Life Time 是持续时间 C代码如下—— .cpp #include "drawBallFunc.h" #include "Components…

机器学习中的数学基础(二)

机器学习中的数学基础&#xff08;二&#xff09;2 线代2.1 矩阵2.2 矩阵的秩2.3 内积与正交2.4 特征值与特征向量2.5 SVD矩阵分解2.5.1 要解决的问题2.5.2 基变换2.5.3 特征值分解2.5.4 奇异值分解&#xff08;SVD&#xff09;在看西瓜书的时候有些地方的数学推导&#xff08;…

使用redis快速实现session共享,springboot

1.引入依赖 <dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId> </dependency> <!-- 引入 redis 依赖 --> <dependency><groupId>org.springframework.b…

8.2 数据结构——插入排序

1、基本思想&#xff1a;每步将一个排序的对象&#xff0c;按其关键码大小插入到前面已经排好序的一组对象的适当位置上&#xff0c;直到对象全部插入为止。即边插入边排序&#xff0c;保证子序列中随时都是有序的。 2、基本操作&#xff1a; &#xff08;1&#xff09;在有序…

嗯哦哎辟 NOIP 2022 游寄

虽然上次不是假的&#xff0c;但这次是真的寄了。 Day 0 虽然是南京本地人&#xff0c;但因疫情原因&#xff0c;晚上决定去住了酒店。 看了一眼考场&#xff0c;感觉位置小得离谱。不愧是 NOI 2022 团体总分第十的“强省”江苏。 刚开始去了 409&#xff0c;发现房间里一股…

非凡社群管理之社群管理如何制定规则

1、加人规则&#xff1a;我们上篇文章里说到了&#xff0c;拉人前也是要进行一个明确定位的&#xff0c;不能什么人都拉&#xff0c;这就是我们常说的“设门槛”&#xff0c;避免占用群资源以及后期花费精力对其进行筛除。常用到的方式有这么几种&#xff1a;邀请式&#xff08…

【C++】类和对象(下)(再谈构造函数 初始化列表 explicit关键字 static成员 特性 友元 友元函数 友元类 内部类 匿名对象)

文章目录再谈构造函数初始化列表explicit关键字static成员特性友元友元函数友元类内部类匿名对象再谈构造函数 我们之前学习构造函数的时候&#xff0c;调用构造之后对象中就已经有了一个初始值&#xff0c;但不能说它是对对象像成员变量的初始化&#xff0c;构造函数体中的语…

windows10不支持Miracast无线投屏(不能进行无线投影)

电脑屏幕小看视频不爽&#xff0c;想把电脑屏幕投屏到电视上&#xff08;单独买一块高质量显示屏太贵&#xff0c;而且没有大尺寸的电视看的爽&#xff09;&#xff0c;但是windows提示不支持Miracast&#xff0c;跟着下面步骤教你解决问题。 当链接电视时出现下图提示不支持Mi…

SpringBoot 3.0 来啦!

SpringBoot 3.0 来啦&#xff01;&#xff01; 大家好&#xff0c;我 是 Ding Jiaxiong。 没赶上热乎的&#xff0c;晚了两天&#xff0c;2022年11月24日&#xff0c;SpringBoot 3.0 正式发布了&#xff01; 文章目录SpringBoot 3.0 来啦&#xff01;&#xff01;1 看看官网2…

ARM 37 个通用寄存器详解

一、简介 1、ARM 总共有 37 个寄存器&#xff0c;但是每种模式下最多只能看到 18 个寄存器&#xff0c;其他寄存器虽然名字相同&#xff0c;但是在当前模式不可见。 2、例如&#xff0c;对 r13 这个名字来说&#xff0c;在 ARM 中共有 6 个名叫 r13&#xff08;又叫 sp&#x…

SpringBoot SpringBoot 原理篇 1 自动配置 1.10 bean 的加载方式【八】

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.10 bean 的加载方式【八】1.10.1 BeanDefinitionRegistryPostPro…

ABAP学习笔记之——第五章:内表

内表&#xff1a; 内表是可以在程序内部定义且使用的表&#xff0c;属于本地表。 与C语言比较&#xff1a; C语言的数组和内表比较&#xff1a; 内表是动态数组(Dynamic Data Object) INITIALSIZE 语句并非实际占用内存空间&#xff0c;而只是预约(RESERVE)内存空间。 创建…

Python每日一练 06

Python每日一练 06 文章目录Python每日一练 06while循环实例一、斐波那契数列前n项实例二、Leibniz公式计算圆周率while循环 循环结构表示程序重复执行某个或某些操作&#xff0c;直到某条件为假&#xff08;或为真&#xff09;时才可终止循环。 在问题求解过程中&#xff0c;…

[算法笔记]最长递增子序列和编辑距离

最长递增子序列 例如对于 a[] {2,1,5,3,6,4,8,9,7}其最长递增子序列为{1,3,4,8,9}所以长度&#xff08;或者说是结果&#xff09;为5。 对于a[0...n-1]&#xff0c;用dp[i]表示a[0...i]中以a[i]结尾的最长递增子序列长度 其状态状态方程&#xff1a; dp[i]1 // 0≤i≤…

【无人机通信优化】基于粒子群算法的多跳无线网络部署优化附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …