目录
为什么使用MyBatis Plus?
A、再之前学习的Mybatis中 我们对单表的增删改查的操作,都是自己再mapper.xml中进行代码的书写,这样一来我们书写的代码比较的麻烦。
B、我们目前封装数据库的实体的时候,每一表都需要自己的书写实体类,这样一来,我们书写的代码就比较的麻烦。
解决的方案
MyBatis Plus:其实就是对MyBatis的进一步的封装。我们可以理解为代理模式,对mybatis的功能实现了扩展。使用aop。
代码实现
1 搭建ssm框架, 导入mybatisplus的jar包
注意:
其他配置和原有SSM流程不变,在applicationcontext.xml文件中
将Mybatis的工厂bean替换为MybatisPlus的工厂bean即可。
意思是: 用mybatisplus框架生成 factory工厂bean
<bean id="factory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
以上就是只是一个使用了mybatisplus的ssm项目的架构,代码还没有开始写,还没有使用mybatisplus框架写代码,只是一个项目架构
2 数据库建表
create table t_student(
sid int(10) not null auto_increment,
s_name varchar(100) not null,
sage int(3) default null,
ssex char(1) default null,
sphone char(11) default null,
primary key(sid)
)engine = innodb auto_increment=4 default charset = utf8;
以上我们现在就要用mybatisplus 实现对这个表的crud
3 创建实体类pojo
当自己创建的实体类pojo的名字和数据库的表名不一样时候,我们要一一映射,比如,我们现在创建的pojo的名字是Student ,但是数据库的名字是
我们要将两个实现映射,所以用这个注解@TableName()
@TableField(“s_name”) 这个注解是我们自己写的实体类里面的字段的名字和数据库不一样,用这个注解实现映射。
@TableField(exist = false) 这个是实体类里面有这个字段,但是数据库中没有,我们就可以使用这个注解将这个字段过滤掉。
@TableName("t_student")
public class Student {
// @TableId(type = IdType.AUTO)
private Integer sid;
@TableField("s_name")
private String sname;
private Integer sage;
private String ssex;
private String sphone;
@TableField(exist = false)
private String fav;
@Override
public String toString() {
return "Student{" +
"sid=" + sid +
", sname='" + sname + '\'' +
", sage=" + sage +
", ssex='" + ssex + '\'' +
", sphone='" + sphone + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return Objects.equals(sid, student.sid) &&
Objects.equals(sname, student.sname) &&
Objects.equals(sage, student.sage) &&
Objects.equals(ssex, student.ssex) &&
Objects.equals(sphone, student.sphone);
}
@Override
public int hashCode() {
return Objects.hash(sid, sname, sage, ssex, sphone);
}
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Integer getSage() {
return sage;
}
public void setSage(Integer sage) {
this.sage = sage;
}
public String getSsex() {
return ssex;
}
public void setSsex(String ssex) {
this.ssex = ssex;
}
public String getSphone() {
return sphone;
}
public void setSphone(String sphone) {
this.sphone = sphone;
}
public Student() {
}
public Student(Integer sid, String sname, Integer sage, String ssex, String sphone) {
this.sid = sid;
this.sname = sname;
this.sage = sage;
this.ssex = ssex;
this.sphone = sphone;
}
}
4 写mapper层
因为我们现在使用了mybatisplus框架,只要使用了这个,那么就有单表的crud。我们不需要写任何的xml。但是我们只是导入了这个框架的jar包,还没有配置使用,如何使用这个框架呢?
在mapper层的接口,实现人家mybatisplus框架的接口就可以了
BaseMapper接口是mybatisplus框架的接口,我们自己写的mapper接口继承了这个,就可以实现对单表的crud
public interface StudentMapper extends BaseMapper<Student>
{
}
我们看BaseMapper这个接口的源码
看到BaseMapper源码里面,已经有写好的一些方法,就是对单表的crud的一些方法。我们自己写的mapper接口,只要继承了这个人家的BaseMapper,就可以使用
5 创建测试类
从Spring容器中获取StudentMapper的接口的实例化对象并使用对象完成数据的查询操作,查询所有的学生信息
数据库有两条数据
@Test
public void testSelAllStu(){
//获取Spring容器对象
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationcontext.xml");
//获取StudentMapper接口的实例化对象
StudentMapper studentMapper= (StudentMapper) ac.getBean("studentMapper");
//查询所有的学生信息
List<Student> students = studentMapper.selectList(null);
//输出结果
System.out.println(students);
}
selectList() 这个就是mybatisplus自带的方法,查询这个表的全部数据
MyBatis和Mybatis Plus的使用比较
MybatisPlus包含了Mybatis的所有功能,也就说在MybatisPlus中我们仍然可以按照Mybatis的方式来完成数据库的操作(无侵入)。
MybatisPlus的数据库操作的Mapper层的接口只需要继承BaseMapper接口,就自动的拥有了当前对应的表的基本的CRUE操作,无需声明接口方法及其xml文件,极大的提升了开发效率(MybatisPlus是通过实体类来逆向动态生成对应的表的基本的Sql语句)