一、Mybatis是啥?
就是一个用java来操控数据库的框架语言
之前学的datagrip或者navicat这些软件里我们操作数据库,原理是我们编写完的操作语句发送到服务器传送到数据库系统,然后数据库执行完之后再发送给服务器返回给datagrip或者navicat显示
那么Mybatis的逻辑也是一样,只不过是变成从java发送给服务器再到数据库,然后数据库返回给服务器返回给java
二、配置Mabatis项目
提示:新建Spring Initializr模块可以把【服务器 URL】换成阿里云的:http://start.aliyun.com
因为原URL是访问spring.io官网去下载安装项目,而阿里云的服务器下载安装会更快
这里下面是重复我之前在配置sprintboot项目时的步骤,可以参考我这篇文章:
后端之路第二站(正片)——SprintBoot-CSDN博客
点击【创建】(或者finish就配置完了)
(小插曲:遇到下面这种情况的同志请注意)
这特么是我脑残...创建sprint boot的模块时没有选基于【Maven】,选了特么的【Gradle】,不小心的我自己都没发现,塔玛得耗费老子一整上午找问题,记住了老铁,选【Maven】!!!
配置完之后,我看的黑马里的idea是老版本,所以如果是老版本配置完会有以下文件,删掉即可
那新的idea应该是像我这样,我啥也不敢删,但是这两个应该是没用的可以删
最后确认一下:你这个模块必须是在整个大项目的主目录下
然后点开模块的【src】目录下的pom.xml文件就能看到这些依赖的配置是否齐全了
三、开始尝试连接数据库
1、创建一个装Java的数据库表的目录
首先在【模块】的—>【src】—>【main】—>【java】—>【com.xxx】目录下创建目录,用来装所有的数据库表
然后在这个目录里创建一个表
但是!!!这里我这个屌鸡掰软件他麻的又给老子发塔玛得神经,右键居然不能新建class类,我真特么的服了(如下图)
还好身边有后端大神,看了一眼之后就跟我说这个项目的样子不对劲!颜sai不对!
不愧是老中医,他给我看正确的颜色应该是这样
老中医说虽然不知道为何这位“病人”病状这么奇怪,但是不要紧,一套老中医失传老手法来拯救!!
点击【文件】—>【项目结构】
然后点击【src】的【main】的【java】,点击上面的【源代码】,然后应用、确定
同理,resources也是点击【src】的【main】的【resources】,点击上面的【资源】,然后应用、确定
同理,test是点击【test】的【java】,点击上面的【测试】,然后应用、确定
大功告成,美极了,看得我都受不了了,太棒了,能右键直接新建java类简直太舒服了,好爽,快爽死了,爽啊好爽啊,不愧是后端老中医,传统的老手法直接让病人起死回生,直接让我爽喷
那么现在就直接新建一个java类,起名的时候【包名.类名】能自动创建一个包,在包目录下创建这个java类
2、创建数据库表、实体类
java里创建数据库表其实就是写一个标准【JavaBean类】,你对比数据库的的性质都知道是差不多的了,都是定义多个字段、并定义它们的数据类型,只不过java还可以写方法函数,废话不多说,先直接建一个User类
(没有java基础的自己上网查,这里不阐述)
这里只提一下:数据库中这几个数据类型
int 在java对应 Integer
varchar( ) 在java对应 String
tinyint 在java对应 Short
3、在数据库工具创建一个数据库和表先
这里不过多讲解,会的可以直接跳过,就是创建一个库、一个表,而且为了节约时间我只做可视化操作,想用代码建库建表的自己一边呆着去(另外,我这里用的是datagrip)
先创建一个数据库,就叫Mybatis吧
然后建表,就叫User表吧
有如下字段,以及数据类型
然后!!记住你这个数据库的四要素!!!为了连接数据库用的
右键数据库,看属性
第一要素:驱动类名在这,点【转到驱动程序】,然后就能看到
第二要素,url在这,原本的应该是【jdbc:mmysql://localhost:3306】,但是后面连接的时候记得在后面加上【/你的数据库名字】,这样一来就会直接连接到你的这个数据库,而不是连接一整个数据源
至于用户名还能看到,密码就没人知道了,你要是创建数据库的时候忘了......那就卸载了数据库重装吧,不然谁都不知道你的密码
4、连接数据库
现在就到连接数据库了,点到【src】的【main】的【resources】的【application.properties】
然后这又塔玛得什么鬼啊?????槽泥马的没完了
冷静片刻,点击【设置】
然后点【编辑器】的【文件编码】,英文对应【Editor】的【File Encodings】
然后把这三都换成【UTF-8】!!!
正常了!!好爽!!好舒服啊!!!爽!!!!
好,现在删掉这些狗屎,写上我们的【连接数据库4要素】:
#连接数据库的【四要素】
#这是我的,你们别找抄
#1、数据库的驱动类名
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
#2、数据库的Url
spring.datasource.url = jdbc:mysql://localhost:3306/mybatis
#3、数据库的账户名
spring.datasource.username = r**t
#4、数据库的密码
spring.datasource.password = 1***6
这就是上面第3点要你们记住的数据库四要素
5、编写SQL语句(利用注解/XML)
首先创建一个包装操作sql语句的接口,还是直接在写接口的时候用【包名.接口名】方便
然后先写一个注解【@Mapper】,它标识了:在运行时会自动生成实现这个接口的实现对象,并将这个对象交给IOC容器管理
然后再在接口里定义一个抽象方法list(),返回值就是一个集合,作用就是用一个集合封装所有User
还得在这个方法上加一个注解:【@Select("SQL语句")】,这个注解就可以指定要执行什么sql语句
这里注意:我么们之前学java时,接口里的这种没有方法体的方法是抽象方法,要实现接口类里再次重写这个方法才可以用,但这里不是!!这里有了【@Select("SQL语句")】注解,他就是一个可以“干事”的完整方法了,它的返回值就是执行完sql语句的结果!!!可以直接调用,不用重写!!!
(各位先不用深究到底为什么,老实说我学起来也是一知半解迷迷糊糊的)
(另外,注解爆红的,再检查这几个问题:1、鼠标悬停,看看能不能导入包,比如List的包没导入 2、检查你当前是不是在spring boot的项目中 3、检查你是不是Maven项目管理下,如果2、3都不是,直接删了项目重新搭建一次试试)
import com.czm.mybatis01.table.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper //在运行时会自动生成实现这个接口的实现对象,并将这个对象交给IOC容器管理
public interface UsrMapper {
//这就是你要执行的sql语句
@Select("select * from user")//查询数据库User表所有信息
public List<User> list();
//直接在接口里定义一个抽象方法list(),返回值就是一个集合,也就是用一个集合封装所有User
}
然后再直接在【test】包里的【java】的【com.xxx...】目录下的【模块名ApplicationnTests.java】文件,运行测试爽一下!!
那么看初始代码里有一个@SpringBootTes注解,这个就是说明这里可以整合springboot的单元测试
你就理解为之前学java时你写了那么多个JavaBean实体类,就可以在这测试类public static void main(String[] args)这里运行它们的方法(只是方便各位理解)
然后在里面再用一个@Test注解就可以写方法,去运行外面那些接口、类的方法爽一下了
但是我们学java时学过,接口的方法是不能直接调用重写的,只有接口的实现类(public class 实现类 implements 接口)才能重写调用接口的抽象方法
但是我们之前写那个接口时有一个@Mapper注解,一旦有它,就会自动生成一个接口实现对象,并放到IOC容器
那就只用加一个注入依赖的注解就可以用了
这讲得什么乱七八糟的屌东西
不知道的先死去看前面spring boot的《分层解耦》里的“控制反转”和“依赖注入”的内容去,我也有写:后端之路第二站(正片)——SprintBoot之:分层解耦_后端分层-CSDN博客
简单说就是:我这个文章的意思 “控制反转” 就是只要给一个接口实现类加上【@Component】这个注解,他就会流向IOC容器被管理
然后 “依赖注入” 就是:谁要用它就用【@Autowired】这个注解,然后就可直接创建这个接口实现类的实例对象,然后调用对象的方法......
那么【@Component】是用与接口实现类的,而我们这里【@Mapper】这个注解直接是用在接口的,都不用再写接口实现类了,直接自动生成了一个它的接口实现类
那么直接再加一个【@Autowired】注解,就可以创建这个接口实现类的实例对象,然后调用对象的方法就行了!
import com.czm.mybatis01.mapper.UsrMapper;
import com.czm.mybatis01.table.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest //springboot整合单元测试的注解
class Mybatis01ApplicationTests {
//使用@Autowired注解可以【依赖注入】,直接创建UserMapper接口的实例化对象
//可以理解为跳过了【创建实现接口类】这一步,spring boot帮我们创建好了一个
@Autowired
private UsrMapper userMapper;
@Test
public void testUserMapper(){
//在这里调用UserMapper接口的抽象方法:list()
List<User> userList = userMapper.list();
//然后把list()执行完sql语句的结果返回值循环输出,这里用的是stream流的方法
userList.stream().forEach(user -> {
System.out.println(user);
});
}
}
这里解释一下stream流,我也是今天看黑马视频第一次看到,了解了一下这还是一个蛮吊的方法
举个例子:现在有下图这么一个集合,要获得一个既姓张又是长度为3的名字集合,要先把姓张的过滤存到新集合,再过滤长度为3的到一个新集合,再输出
那么用stream流可以直接根据条件、叠加、一次性执行完三次操作
语法就是【集合.stream().方法1().方法2().方法3().方法4()......】
然后.filter(变量 -> 变量.条件()):根据条件过滤留下
.forEach(变量 -> 干啥):循环
最后!!!我们运行试一下
这里又发现了大量疯狂恐怖要人命要死人的刺眼的红色报错,几万行的报错,我都他吗的无奈了
检查这几点:
1、连接的四要素配置错了没,错一点都不行
2、表名字一样不,java里User类的成员跟数据库的user表的字段能对应上不?
3、最后啥都没问题的话!!!重要!!!我不说你到死都不会知道是为什么,不信你就耗着
去数据库的控制台执行这一个语句:
SET GLOBAL time_zone = '+00:00';
然后就正常了
你就学这个b后端吧,一学一个不吱声