00:02
创建实体类呢,首先我们需要在我们的项目当中,针对我们数据库的表来创建一个实体,那面向对象开发的一个基本的思想,实际上就是把一切东西看作对象,那我们在开发数基于数据库的增长改查的时候呢,第一个步骤就是分析数据库这个表是不是能够抽象为一个对象啊,抽象为一个类的定义,所以呢,根据我们之前的这样的一些开发经验,我们知道这样的一个user表,我们需要呢,在我们的应用程序当中为它定义一个user类,那这个user类呢,我们管它叫实体类,所以呢,在这个地方我就把它创建到一个叫做实体的包当中,实体在英文当中叫an,那所以呢,我打开我们的Java这个源代码目录,在买贝斯plus这个包当中,我们创建一个安这样的一个包好。那么在安这个包当。
01:02
说呢,我们右键new一下,我们拗一个叫做user的这么一个类,那么在user类当中呢,我们创建一些成员,这些成员呢,应该对应我们数据库当中的ID name age和email啊,那这几个成员因为比较简单啊原理,所以创建的过程呢,我就不给大家具体的去演示了,我直接呢把这些内容呢给它复制过来了,所以呢,我们对应数据库当中的四个字段,分别创建了long型的ID string型的name in tIgEr型的age以及string型的ma。好,接下来呢,我们再来看一下,在我们的笔记当中呢,有一个非常明显的一个区别,和我们刚才写的内容,就是它添加了一个艾特贝哈这样的一个注解,那这个注解是做什么的呢?我们来试验一下,在这个地方呢,我们添加一个at贝塔,大家可以发现这个艾特data塔注解。
02:03
呢,它是属于longb,也就是刚才我们在上一个步骤当中引入的那个依赖,那这个依赖是做什么的呢?我们先把它引进来再说,那你会发现呢,引入了这个依赖之后,我们再来看当前的这个user类的它的类结构啊。这是idea编译出来的类结构,它编译出来的类结构里面呢,就包含了为这个user类自动生成的所有的get方法。还有所有的set方法。对吧,还有一些equals呀,什么has code呀,To string呀等等这些方法,那这些方法呢,都是我们的at data注解帮助我们自动的创建出来的,那前提呢,是我们需要在我们的idea当中呢,事先先装上long of插件,这也是我们前面给大家已经提到过的一个内容,好,那这个entity实体类我们创建完成之后呢,我们再来看下一个步骤,那下一个步骤呢,就是创建我们的matter接口了,那我们的matter接口呢,我们给它创建到一个叫做matter的包当中,我们给它起一个名字叫user map,好,那所以首先呢,我们来创建一个map包啊。
03:29
在买威plus这个包下面,我们右键new一个package,叫做map,好,那在这个map下面呢,我们先new new一个Java class,这个Java class呢,它不是一个普通的class,它是一个interface。叫接口,那我们给它起个名字,这个名字呢,就叫user map,好,然后我们直接回车就可以了,这个user matter呢,他也不是一个普通的interface,它呢需要继承,继承谁呢?
04:05
啊,继承一个叫做base matter,叫做通用matter,通用matter这个概念大家应该之前接触过,那么你们之前接触的通用map呢,大都是自己写的一些通用map可以实现的一些通用的增长改查,那在my plus当中,他呢给我们实现了一个通用matter,我们点进去看一下这个通用map呢,我们来看一下它的structure里面呢,实现了一些基本的增生改查,包括insert,还有delete by ID。啊,根据ID进行删除,这个呢是delete by map是吧?根据一个map集合啊组成的一个条件进行删除,还有呢,Delete啊,这个rapper是什么呢?这个rapper呢是后面我们要学习的一个叫做条件构造器,可以帮助我们去构建一些复杂的查询条件,好等等,我就不一一给大家去看了,那基本上大家可以通过这个名字呢,能猜到这个方法是做什么的,比如说select,对吧,就是根据某一个查询条件呢,去查询一条记录,比如说select count,根据某一个查询条件呢去查询一共有多少条记录,所以呢,这个是我们的通用map,当然了,这个通用map大家可以发现它呢有一个泛型。
05:28
你点进去啊,这面呢,有一个泛型,这个泛型是什么呢?这个泛型实际上就是你要管理的实体对象,那么这个泛型你写什么,你这个matter所管理的实体对象就是什么,所以呢,在user matter这个地方呢,我们需要给它定义一个泛型叫做user,意思呢就是我当前的这个map呢,要管理的就是刚才我们刚刚创建的entity里面的user,好然后接下来呢,我们来看一下现在我们的优色写好了,我们的好泛型定义好了。
06:07
我们下面最后一个步骤呢,就是要让我们当前的这个接口下面的map能够在应用程序运行的时候呢运行起来,那么应用程序运行的时候,它怎么才能运行起来呢?我们知道像这样的一个文件呢,要被我们的论容器管理,所以呢,我们需要呢,将这个文件呢,被我们的扫描到啊,那么最简单的一个方式,我们呢,就是在我们的启动类当中添加一个扫描注解,而这个扫描注解是专门扫描的,所以呢,这个扫描注解呢,我们管它叫micro。好,Matter sky,我们扫描的这个包的名字一定是这个matter所在的包的名字,所以呢,大家需要把matter所在的这个包呢,给它复制一下,复制到我们matter sky这个注解后面的这个参数当中,到这为止呢,我们所有的编码工作就做完了。
07:10
那做完了编码工作之后呢,最后一个步骤就是测试了,所以接下来呢,我们来打开test这个目录,在test这个目录下面呢,我们来打开这个里面自动为我们创建出来的一个测试用例文件,我们双击把它打开,这个里面呢有一个文件,这个文件里面呢,有一个叫做spring test的这样的一个注解,这个注解帮助我们自动创建spring,自动创建我们的上下文环境,也就是说当我们的spring应用程序运行起来的时候呢,那么它依赖的是这个。启动类里面的这个扫描对不对,扫描它会扫描什么呀?它会扫描我们的matter目录下面的这样的一个啊接口,那么当我们的这个启动类没有运行,而单独的让我们的这个测试类运行,就能够启动我们整个的磁spring环境,那我们怎么做呢?在spring的这个测试工具当中,它给我们提供了这样的一个注解叫spring test,可以自动的初始化spring环境,在没有进行启动类运行的情况下啊,帮助我们自动的初始化spring的上下文环境,所以呢,我们必须要添加这个注解,好这个注解添加完了之后呢,我们就可以将我们spring环境当中已经被初始化出来的user matter给它注入进来了。那么注入user matter呢?首先我们先定义它叫user matter。
08:48
User matter user matter定义完了之后呢,这面呢,我们可以用我们常见的啊注入的一个注解,那么我们常见的第一个注解呢,就是这个outwe的好,这个outwe你写完了之后呢,你会发现有一个问题,这个问题是什么呢?就是idea呢,它会告诉我们一个错误,这个错误呢叫could not out well,他说不能够自动装配,为什么不能自动装配呢?他说no beans of use matter try found啊,Type,不found什么意思呢?就是没有任何一个user matter的类型被找到,那么我们实际上呢,在项目当中已经创建了一个user matter了,但是呢,这个user matter呢,它并不是一个啊,真正的这个。
09:34
可以创建出对象的那么一个类对不对啊,它是一个接口啊,它是抽象的,所以呢,通过这样的一个。User map这样的一个抽象的接口呢,并不能够实例化出一个具体的实例来,那买这个idea呢,他就告诉我们说这个项目运行的时候呢,啊,他是找不到一个具体的实例的,那在这个地方呢,有两种解决方案,第一种解决方案呢是。
10:01
在这个位置就是在user make里面,我们来欺骗一下idea,就是你告诉他我有啊。还有的话呢,比如说我在这个地方应该是19层吧,19层我们管它叫repository啊,Repository你说我我有我我就是那个将要实例化出来的那个那个那个类,但是实际上不是,你只是用这个艾特repository呢做了一个障眼法,然后呢来迷惑idea,所以呢在这个位置。你就会发现呢,Idea居然信了,是不是这样呢,我们的这个user matter呢,就成功的注入进来了,当然这是其中的一种方式,这种方式使用了障眼法,就是总归来说不是很专业哈,好,那接下来呢,我们用第二种方式。我把刚才我写的这个repository呢给它屏蔽掉,那第二种方式呢,就是刚才同学下面说的resource。
11:03
Resource了对吧?啊好,那所以接下来呢,我在刚才的这个地方呢,把out改成resource。好,这样的话,如果我们用resource的话呢,它实际上默认情况下,它就有自动啊识别的这样的一个功能,好,那默认情况下呢,实际上outwe呢,是按类型装配的啊,它是spring的注解,然后这个resource呢,它默认是按名称装配,如果找不到和名称匹配的这个B呢,它就会按照类型装配,它实际上呢是接to意义的主解啊。截图de的,它是谁的,它是死路认的对吧?好,所以这个是一个具体的标准,它呢实际上是一个相当于实现了,那接下来呢,我们在后面的这个项目开发的过程当中呢,我做依赖注入的时候呢,也都会统一的采用resource这样的一个方式来对我们的项目当中的依赖进行注入,好,那注入完了之后呢,我们就可以写我们的测试了,这个测试这块呢,我给它改一个名字啊,叫test select list啊,我呢要测试一个查询的功能,那么测试查询的功能呢,肯定是要用到刚才我们的user matter了,好,用到这个user matter,我们来点一下,看看它里面给我们提供了什么功能,那和我们刚才呃,在我们的user matter的这个类结构当中看到的一样啊。
12:38
这个里面base mapper这个里面呢,它给我们提供了很多增强改查的方法,所以呢,这些啊,Base mapper当中的增改查的方法呢,都被我们的user map继承下来了,那我们user map呢,就可以直接进行使用了,那么我们使用它其中一个叫做select list的方法,那这个select list这个方法呢,它接收一个参数,这个参数呢是一个rapper类型的,这个rapper呢,是我们后面要接触到的一个条件构造起它可以帮助我们组装复杂的查询条件,那么如果我们把这个值之为none呢,就是没有条件进行查询,也就是说查询语句不带where啊,如果我们组装了这个条件呢,就是查询语句后面呢会更复杂一些,好,那所以接下来呢,在这个地方,我们就先暂时给他直接写一个,那这样的话呢,我们就完成了一次查询,完成查询之后呢,我们会得到一个结果,这个结果呢,我们可以存到。
13:38
一个集合当中,这个集合的泛型呢是user,为什么这个集合的泛型是user呢?因为这个user map这个接口,当时我们给他定义的泛型就是什么呀,就是user类型的,所以呢,这个user matter接口,他只负责管理user实体啊,那这样的话呢,我们在。当前看到的这个测试当中。
14:04
把这个没用的先关掉啊。好,我们在当前看到的这个测试当中,就会自动的以这个user泛型的形式呢来存储这个集合了,那接下来呢,我们来看一下这个集合里面输出了什么内容,我们可以打印一下它哈,我们可以用for each啊,我们用一下这个LA的表达式的这种方式把SOC啊,好直接呢用冒号冒号print LN这种方式呢,把users里面的每一个成员给它打印出来,那这样的话,我们当前的这个测试呢,就写好了,写好了之后呢,我们来右键运行一下。运行的话恐怕就不太行啊,为什么不太行呢?我们先来看一下他报的错误。
15:06
好,那为什么他没报错呢?原因是我在数据库当中。他有这个库,如果是你们的环境的话,你们就给他报错了,为什么?因为是不是刚才我在这个地方。数据库不是刚才咱们创建的数据库呀,和刚才咱们创建的数据库的名字不一样,那么恰好我的这个环境当中有这样一个数据库,所以呢,它就执行了查询,但是并不是我们想要查询的这个数据库,好吧,好,那接下来呢,我们就把它改成我们要查询的那个数据库,就是DB200921啊下划线,好,这样的话呢,才是我们查询的数据库,那很显然刚才这个就不太对了哈。我们运行一下。
16:05
好,接下来呢,我们把日志呢,翻到最后,你会发现在这个地方是我们刚才通过拉姆达那句话。打印出来的这样的一个日志啊,那因为呢,在我们的实体当中已经自动的为每一个对象生成的凸丝砖方法,所以呢,它使用的是凸丝砖方法打印了这个数据,那这块呢,就是我们的第一个测试了。
我来说两句