最近在整合SpringBoot和MyBatis的过程中,收获了很多。所以做这个笔记,希望能给自己做复习使用,也供大家学习参考。同时也欢迎大家留言交流经验!有不足之处,也希望大家多多包涵!
MyBatis是一款优秀的持久层框架,它支持定制SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生类型、接口和Java的POJO(普通Java对象)为数据库中的记录。
简单的说,MyBatis就是一个已经封装好的读取数据库里数据的工具。它的底层已经封装好了基本的JDBC,简化了持久层的开发。使用MyBatis时,只需要通过接口编写指定数据操作的抽象方法,然后配置与之关联的SQL语句,即可完成!所以学习使用MyBatis是十分有必要的。
MyBatis和MyBatis-Plus同是持久层框架。MyBatis-Plus是一款MyBatis的增强工具,在MyBatis 的基础上只做增强不做改变。其是国内团队苞米豆在MyBatis基础上开发的增强框架,扩展了一些功能,以提高效率。
笔者两种框架都使用过,感觉实际使用都差不多。MyBatis-Plus比MyBatis多了许多内置写好的CRUD方法,不用写SQL语句,只用调用相应的方法输入参数即可,对于单表操作会方便很多。但是MyBatis-Plus并没有内置有多表操作的方法,所以说特别复杂的操作还是要手写SQL语句,同时MyBatis-Plus的配置要相对于MyBatis要复杂点,建议初学者可以先学MyBatis,再进阶MyBatis-Plus。
MyBatis有两种使用方法,一种是通过XML,另一种是通过注解。以前的话,使用XML会比较多。但是现在基于注解开发成为一种趋势,这样更加简便。特别是 SpringBoot 的出现,可以说是推动注解开发的进程。因此,在下文中笔者使用的也是注解开发。
MyBatis和Hibernate不一样,MyBatis是半自动的ORM,而Hibernate则是全自动的ORM。ORM模型就是数据库的表和Java对象之间的映射关系模型,数据库中数据表的字段对应Java对象中的属性。
像Hibernate的全自动ORM映射框架,可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成SQL,已经不需要程序员去编写SQL语句。但是MyBatis可以配置动态SQL,它主要解决了数据库和POJO对象的相互映射,MyBatis需要手动匹配提供POJO,SQL和映射关系,相比Hibernate,MyBatis可以优化SQL语句,相对提高了性能。
笔者电脑使用的是IDEA2020.1,jdk1.8,MySQL8.0(数据库版本需要注意,MySQL5.x版本和8.x版本的jar包是不一样的,连接的驱动也不一样)
要使用MyBatis,肯定要先建好数据库和数据表,输入好数据。
第一步,找到MySQL的启动程序,输入账号、密码登录。
第二步,输入指令,建立数据库、数据表,同时输入数据。
第三步,查看数据表是否建好。
下面是笔者所使用的数据库文件(供参考)。
#创建ceshi数据库
create database ceshi;
use ceshi;
#创建student数据表
create table student(
id int not null unique primary key,
name varchar(20) not null
);
#插入三条数据
insert into student values(1,'小明');
insert into student values(2,'小东');
insert into student values(3,'小红');
第一步,新建一个SpringBoot项目
笔者这里一般不选,习惯后面再添加依赖,因为这里添加依赖,不能选择版本。一直点击下一步就好。
点击完成即可。
新建好的项目,可以看到如下的项目结构。
第二步,添加依赖,编写配置文件。
我们可以前往Maven官方仓库,查找相关的依赖,添加到pom.xml文件里。
下面是笔者的pom.xml文件添加依赖部分截图。IDEA2020.1开始后,修改pom.xml后会出现刷新的按钮,点击后才会从中央仓库下载jar包。因此可以添加完所有依赖,再一起刷新。
如果发现下载jar包过慢,可以改成从阿里云的中央仓库下载,这样会快很多。
找到application.properties文件,添加数据库的连接配置。
#连接mysql最基本的四个配置
#设置连接数据库的驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#设置连接数据库用户名
spring.datasource.username=sa
#设置连接数据库密码
spring.datasource.password=123456
#设置连接数据库的字符串
spring.datasource.url=jdbc:mysql://localhost:3306/ceshi?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
#设置控制台显示已执行的sql操作
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
第三步,根据数据库数据表的字段编写一个实体类。
我们先在工程中新建一个bean包,用来存储Java对象实体类。
在bean包下,我们可以自己根据数据表的字段自行编写对应的实体类。并且在实体类上写上构造方法、get方法、set方法以及tostring方法。
package com.xiaolong.shujuku.bean;
public class Student {
private long id;
private String name;
public Student() {
}
public Student(long id, String name) {
this.id = id;
this.name = name;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
第四步,我们在项目中创建一个dao包,用来存放mapper接口。注意,你创建的dao包要和启动类在同一目录下,不然你后面就会报错。然后在dao包下创建一个studentmapper接口,为接下来编写MyBatis的CRUD方法做准备。注意你的接口类上方,要加上@Mapper注解,表明这是一个MyBatis的接口类。这个注解很重要,一定要加上去。还有记得创建的是接口,不是类。如果是类的话,MyBatis也会扫描不到的。
因为我们这里没有编写业务层和表现层的代码,所以下面我们就使用Junit测试类的单元测试来进行操作。因此我们找到测试类,在测试类的上面加上@MapperScan注解。MapperScan注解括号里放的是刚刚dao包的路径,这个注解的意思是扫描括号中dao包下的Mapper注解。所以如果你刚刚忘记添加Mapper注解,这里就会扫描不到了。如果是业务层或者表现层有调用,那应该要在启动类上加上@MapperScan注解,进行调用。
同时我们通过@Autowired注解引入studentmapper接口类,并创建一个私有对象。
第五步,右键点击测试类,选择run运行,启动项目。观察控制台,如果项目启动成功,无报错,则证明上述的配置成功,接下来接可以进行具体的方法编写。
下面我们在studentmapper这个接口编写具体的方法。
以查询学生表的数据为例子,这里需要用到@Select注解,注解的括号里放具体的查询语句。@Results和@Result注解的作用是,建立数据表字段和Java类属性之间的映射。当你的数据表字段名和Java类中的属性名不一致时,就需要映射啦。当然如果一致,Mybatis会自动帮你建立映射,这个注解写不写关系不大。笔者这里为了让大家看得清晰,统一还是写了。具体的使用可以看下面的代码截图。
我们在测试类中调用方法,运行单元测试,就可以在控制台看到执行的SQL语句和结果。
以插入到student表为例,这里需要用到@Insert注解,注解的括号里放具体的插入语句。#{}里放的时动态SQL语句的参数,它相当于占位符的意思。先预编译SQL语句,然后把参数输入进去,取代占位符。当value上面的参数和方法里的参数不一样时,我们可以使用@Param注解起别名,不过尽量还是使用一样的名字。例如我这里values中的参数是ID和Name,而方法里参数的名字是id和name,这时候就要使用@Param注解。
以更新student表为例,这里需要用到@Update注解,注解的括号里放具体的插入语句。当然我们也需要用到#{}来存放动态输入的参数。例如这里笔者把id为100的记录的name改成是‘大可爱’。
以删除student表的记录为例,这里需要用到@Delete注解,注解的括号里放具体的删除语句。使用上和其他语句也是大同小异。例如笔者这里选择删除id为100的记录。
大家在使用@Autowird注解调用studentmapper时候,如果出现报红情况,请不要着急。明明都没有写错,为什么会报红呢?其实这个错误是不影响运行的。之所以会有这个错误,原因是mapper接口类并没有注入到Spring的管理容器中。那不是加了@Mapper注解和@MapperScan注解吗?因为@Mapper注解是MyBatis的注解,而Spring扫描容器的注解是@ComponentScan注解,但是程序里明明没有这个注解啊。那是因为启动类上的
@SpringBootApplication注解已经包含了@Component注解了。
那有没有解决报红的办法呢?最简单的是Mapper的接口类上加上@Compoent注解,但是@Component注解表示这只是一个容器而已,最准确的应该是加上@Repository注解,表明这是一个Mapper。这样才是最准确的。
点击—》源码传送门—《点击
如果大家喜欢的话,不妨点个赞再走呗!