紧接上文,当我们吧环境配置好以后,肯定是继续学习其代码啦
1.入门
【1】 CRUD
是增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)的简写
基于Mybatis
需要编写Mapper接口,并需要手动编写CRUD方法
提供Mapper 的映射文件 并手动编写相对应的sql语句
基于MP
只需要创建 Mapper接口,并继承BaseMapper接口,这就是MP需要完成的所有操作,甚至不需要创建sql映射文件
【2】应用插入操作insert(代码时间)
(1)创建文件
在src/main/java下再次创建一个包,起名为mapper
再在mapper下创建一个一个名为EmployeeMapper的接口让后让这个接口去继承上文所说的MP的类型BaseMapper,代码如下
/*
* Mapper接口
*
* 基于Mybatis: 再Mapper接口中编写CRUD相关的方法,提供Mapper接口所对应的SQL映射文件 以及方法对应的SQL语句
*
*
* 基于 eMapper接口即可
* BaseMapper:泛型指定的就是当前Mapper接口所操作的实体类类型
*
* */
public interface EmployeeMapper extends BaseMapper{
}
为什么MyBatis Plus不用再去编写CRUD或者说去创建接口?
CTRL+点击你的BaseMapper进入以后你会发现basemapper已经为你创建好了很多东西如图:
(ps:如果出不来的话请点击ALT+7)
说了这么多概念性的东西,接下来我们用实例来看看MP的具体用法
我们以里面的insert方法为例
首先我们要从ioc当中获取employMapper的具体对象才能实现里面的方法
所以打开TestMP 定义一个变量去获取Employeemapper的值
具体代码如下
public class TestMP {
private ApplicationContext ioc = new
ClassPathXmlApplicationContext("applicationContext.xml");
private EmployeeMapper employeeMapper =ioc.getBean("employeeMapper",EmployeeMapper.class);
然后就开始定义我们的插入操作
我们先去调用insert方法,在打方法的时候我们会发现inset里需要一个employee对象如下图
所以我们开始对employee对象经行创建并且初始化
初始化之后,再调用insert他就会帮我们插入到数据库中
在MP里insert执行完之后会自动返回影响条数,所以我们创建一个值对它进行接收即可
总体代码如下
@Test
public void testCommonInsert(){
//初始化Employee
Employee employee = new Employee();
employee.setLastName("MP");
employee.setEmail("[email protected]");
employee.setGender(1);
employee.setAge(22);
//插入到数据库
Integer result=employeeMapper.insert(employee);
System.out.println("result:"+result);
}
这时候我们执行testCommonInsert()这个函数,我们会发现出错
这是为什么呢?报错的地方是无法将id进行插入
这是因为我们未给id创建主键策略的缘故
视频里视频的up主再代码生成器里找到了关于主键策略的描述,但是我们却没有
在搜索框搜主键策略或是idtype.AUTO这种字样都是搜不出来的
这时候其实我还以为主键策略以及被新版本的MPban掉了
知道我往后学,才发现
他的描述其实已经在@TableId下的IdType下了(原来是网页简化了,不过现在在官网上确实已经搜不到主键策略这一词了,想要了解的话在搜索栏打tableid就可以到我这个界面)
因为我们未使用主键策略,所以MP会使用默认的方式帮我们解决,最后导致我们出错,所以我们现在要给id这个对象创建主键策略,这时候就得用到
@TableId这个注解
/*
@TableId
value:如果定义值和数据库值时一样的value就不用写了
type:指定主键策略
*/
@TableId(value = "id", type = IdType.AUTO)
这次我们再次运行发现,唉还是错的,这又是这么回事呢?
原因就是在我们MP运行时,MP去寻找的数据库的表就是我们所定义的那个类的名称的表
而我们在数据库所创建的表名称叫做tbl_employee
所以这时我们运行程序他就会说找不到我们所要insert的表名
这时候该这么办呢?需要把我们的类名改为数据库名吗?其实是不需要的
这时候我们就需要用到MP内另一个注解 @TableName
只需在搜索框搜索tablename
如上图,这时候只许这个注释,并将这个注释的value值改为我们的数据库表名,那么这个问题就迎刃而解了
/*
* MP会默认使用实体类类名去寻找表
* */
@TableName(value = "tbl_employee")
这时候我们再次运行testCommonInsert()
就会发现程序已经运行成功,并且数据库已经加入了我们所初始化的数据
到这里相信有一些细心的小伙伴就已经发现了一个问题,就是我们数据库所写的是last_name
而我们代码里写的是LastName这个为什么就不会出错呢?
从这就引出了我们下一个知识点,叫做全局策略配置
我们在配置文件applicationContext.xml下随意找个地方写入bean
我所在写的位置是在sqlSessionFactory下为什么,看到后面就懂了
注意!!!视频里的内容是老版的MP配置方法,新版的内容有了很大的出入,我也是配置了好久好久才配置完且没有错的,不知道看到这个的你现在的MP是第几代,记得一定要去官网上看看,你所配置的内容是在什么配置文件下
下面就给大家说说我的配置思路
视频第一段说要配置全局配置globalconfiguration 我们这个不用注意,我们看其里面的配置
视频中说里面有一个配置叫做dbcolumnunderline,这个东西是用来将我们上述的驼峰命名和下划线命名互相转换的东西,但是我们在官网上搜这个东西的时候其已经不见了,或许是迭代更新已经被默认配置了,或许是我没有找到,总而言之这个东西是什么东西配置的我们已经不知道了,所以我们暂时当他已经默认配置了
再来它所配置的是一个叫做全局主键策略IdType,这时候我们查询IdType,发现其是在Dbconfg和globalConfig里的
这时候思路就有了
我们创建一个 id我们起dbConfig(看到后面你就明白了),class里面我们打Dbconfig然后选择确定
在bean中创建property 里面name就写我们需要的内容idType 其后面的value视频中所写的是0,但是现在我们打0就会出错,结合上面我们就可以推断出这里的value值就是写auto
(在这里写的property和我们刚写的employee@TableId(value = “id”, type = IdType.AUTO)其实是一样的,但是@TableId只是在employee里起作用而全局配置是在整个程序都有作用)
所以加上以后就可以把@TableId注释掉了
之后就会出现我们如下的代码啦
这时候不要着急去执行testMP里的testCommonInsert()因为执行之后还是会出错,为什么呢?因为我们的这个bean没有注入到sqlSessionFactory里面
所以我们开始注入
我们在sqlSessionFactory里建立起property name当然就是我们现在要用的idtype的那个id名
注意!!!在这里又与视频不一样了,我在按视频的方法注入后发现有报错,然后我有搜了好久好久,最终发现这个里面不能将DbCofig注入,必须得再建立一个globalconfig再将dbconfig注入到这个里面,然后再将globalconfig注入到这个总的sqlSessionFactory里面,进行一个套娃操作,我个人理解是
是两个的合体,globalconfig是大哥(因为打dbconfig就自动出现上图的那段,这样知道我在使用globalconfg$dbconfig时为什么不用globalconfig当id了吧),然后小弟归大哥所管,所以将图的id注入到大哥的property,大哥同理(大哥的上级是sqlSessionFactory)不知道为什么更新的这么麻烦了,大概的步骤就如下了
我们先创建大哥globalconfig
然后将小弟注入大哥
再将大哥注入到boss上级那里
全体代码入下
注意!globalConfig的bean的结束和property的结束都是在dbConfig总体结束之后的(果真时大哥罩着小弟)
这时候我们再去执行testMP里的testCommonInsert() 就会发现已经insert成功了,数据库里也出现了你所初始化的数据
这里和视频出入很大,所以大家明白其中原理就行了,代码完全可以复制我的改改就行
下面视频中介绍的注释是@TableField(这里大都现在已经没啥用了,但是还是写出来了,这一块想了解的小伙伴了解一下就行了。)
这个注解也是可以在官网的页面直接搜到的
视频中说到,这个@tableFieId是在无法进行驼峰装换成下划线时使用的(就是Dbcolumnunderline的默认值为false)(但是我上面也说了dbcolumnunderline这个值已经在官网里面无法搜索出来了,应该是默认时true,现在这个注释用来以防万一,或者用来指定专门的数据库列表用),从上图也不难看出value值就是写的时数据库字段名,那么该怎么写这个@TableField
其实就在需要相对应的数据上面写上@TableFieId(value=“数据库的列名”)就行
如图
写到这里我的感悟就是,这个bean中的内容,要不就写的和数据库一模一样不用改,要不为了整体的美观或是确保不会出错最好每一条都加上与数据库相匹配的语句。(ps:只是个人感受)
其二就是其exist属性,这个属性就是向MP这个insert语句说明,你声明的这个数据不存在于数据库,那么insert语句就不会将这条语句插入数据库,如果不进行说明,程序就会报错,说在数据库里找不到这一列进行插入操作。
到此为止视频中@tableFieId部分就已经结束了
怎么获取插入数据后主键的值?
mybatis:
先创建一个对象,然后再去写其映射文件
useGeneratedKeys=”true” keyProperty=”对应的主键的对象”。
useGeneratedKeys:
此时设置useGeneratedKeys参数值为true,在执行添加记录之后可以获取到数据库自动生成的主键ID(大致意思就是获取id)
keyProperty:当你插入成功是它会将你的主键的值插入到这对象上面
//Integer insertEmployee(Employee employee)
// SQL...
mybatis plus:
直接获取即可
我们在TestMP下的testCommonInsert()函数下写入如下代码:
Integer key=employee.getId();
System.out.println("key: "+key);
然后运行,其插入对应的主键值就可以显示出来了
insert与insertallcolumn
视频里还介绍了insert和insertallcolumn的区别,但是insertallcolumn已经在官网搜不见了,这里不再过多赘述,但是在这里大致说一下,两个的区别就是在于mysql语句,前者未定义的会自动跳过mysql就不会插入未定义的对象,后者就是mysql会把所有对象全部插入进去,未定义的对象将当作空值处理。但是对于结果而言两者没什么区别。