Mybatis
Mybatis是一个基于数据持久层(DAO层)的一款框架,他能极大的简化Java中连接数据库,操作数据库也就是jdbc的操作。
在定义mybatis相关接口时,不需要定义实现类,因为在程序启动时,mybatis底层会自动生成相关的实现类。
Mybatis第一个入门程序
创建一个springboot项目的程序,使用mybatis框架将本地数据库user中的数据取出并存入创建的User实体类中,最后将存入的User实体类对象打印出。
1、连接数据库
需要使用mabatis操作数据库,首先需要连接数据库,在创建好的spingboot项目中,自动提供了一个application.properties配置文件,在其中就可以添加数据库的相关配置来连接数据库,1、相关数据库的驱动类名称2、连接数据库的url。3、数据库的用户名。4、数据库的密码,通过该配置文件就能实现在程序启动时,mybatis框架自动连接相关数据库
2、创建mapper接口
mapper接口相当于之前的DAO层中的接口,实现的是将数据库中的数据取出,该接口使用@Mapper注解表示在程序运行时,会自动创建这个接口的实例化对象,并交给IOC容器管理,而在这个接口里,使用@Select注解定义里面的抽象方法,注解后面跟上相关的查询语句,那么在该实例化对象被创建时,会自动实现该抽象方法,也就是执行@Select注解后面的查询语句,这样也就实现了对数据库的查询操作。
3、通过依赖注入创建实例化类
将查询出的数据作为该实体化类的对象进行存储,因为在之前Mapper接口已经被添加了@Mapper注解,在程序启动时会自动创建该接口的实例化对象并交给IOC容器管理,于是在启动类里直接创建该接口的对象不赋值,给该语句添加@Autowired注解,这样通过依赖注入就能自动创建Mapper接口的实例化对象,再在启动类里直接调用该对象的方法执行查询语句,再将查询后的信息转化为实体化对象User通过集合存储,最后将对象打印,这样一个mabatis对数据库进行操作的简单入门程序就完成了。
通过mybatis实现基本增删改查操作
1、删除操作
删除一般是在前端发送过来请求删除数据,而发送过来的往往是该数据的唯一标识,也就是主键id,所以删除语句执行的判断条件就是id与前端请求的id相同,通过@delete注解就能实现写入删除sql语句进行删除数据,而在接口的编写中,由于删除的次数可以多次,所以不能将id写死,所以需要mybatis提供的占位符#{id},这样的话就能将方法传入的参数赋值给#{数据}占位符内的数据:
使用#{}占位符能实现sql预编译的功能,预编译相当于是创建了一个缓冲池,将之前执行过的sql语句放入该池中,如果后面有新的语句执行,则会直接将对应不同的部分直接带入进池中执行,不需要重新编译,能有效的避免sql注入,从而提高项目的安全性并且由于已经编译过,在下次使用时直接就能代入执行,所以性能更高。
2、添加操作
添加操作与删除操作类似,也是在接口里创建一个@Insert注解标识的方法,并在其后实现添加语句,但是因为添加的属性往往很多,这时我们一般是将这些属性先封装成一个实体类对象,然后再通过调用这个实体类对象的属性进行添加的操作
创建实体类对象:
编写添加接口
在测试类中给实体类对象赋值,以及创建实例化对象调用接口的方法
这样就能初步实现利用mybatis对数据库进行添加数据的操作,有时需要拿到添加元素的ID,则需要在添加注解的基础上添加一个Options注解
3、更新操作
更新操作主要使用update注解,主要更新方式与之前的删除添加语句类似,如下:
4、查询操作
在执行查询操作时,想让数据库里的属性通过对象的方式封装返回,但由于表的命名规范与Java的驼峰命名有时不一致,例如数据库中创建时间为create_time,Java中为createTime,所以容易导致有时候无法将数据库里的这类属性封装到实体类中,这时就得打开mybatis自带的驼峰命名,将create_time这种下划线格式在封装进对象时自动变为Java中的驼峰命名createTime,这样就能避免一些因为属性名不一样导致的错误
在有时候查询会遇到模糊查询的情况,例如查出姓张的人,这时就需要使用like和占位符,但是在sql语句的书写时,由于#{}的原因,会将里面的所有内容当作字符串进行匹配,这样就达不到占位符的目的,这时就需要concat函数对%,‘张’,%进行一个拼接。
使用xml配置文件进行sql操作
在通常的数据库操作中,往往通过配置文件的方式使用mybatis对数据库进行操作而不使用注解
动态sql语句
通过xml文件能实现数据库的相关操作,但是如上的代码会有一个弊端,也就是如果我只想查找姓张的员工,不想添加其他限制条件,这个时候按之前的sql语句查询的话就不行,这个时候就需要动态sql语句的执行,主要是利用动态sql标签实现
if标签和where标签
if标签修饰的sql语句跟Java中的if一样,只有if标签内的条件成立,后面的sql语句才会执行,这样的话如果我们只需要查询姓张的员工不需要其他限制条件的查询时,就能直接将其他查询需要的属性值直接设置为null,而where标签则能自动识别哪些地方需要and,哪些地方不需要,避免因为and导致不必要的sql语句语法错误。
同理在修改相关数据的时候,同样也能使用动态sql语句,且使用动态set标签能自动避免多余的逗号导致的sql语法错误,即动态更新语句会将需要修改的值进行修改,如果没传入需要修改的值,则会认为该值自动为null,则不会对其进行修改,保持该值原来的属性
foreach标签
使用foreach标签能对一个范围内进行遍历,例如在in关键字后面的范围中,实例如下:下面为一个批量删除的操作。传入一个集合,对该集合内部的元素进行遍历,按照该集合内的id对相应id的用户信息进行删除。
foreach标签内的各个属性如下:
sql标签和include标签
在实际开发中如果出现大量的重复需要查询的对象,如果不对其进行封装,后期维护或者修改业务需求的话会很难,所以使用sql标签将这部分重复的代码封装起来,如下:将需要查询的重复语句封装起来,如果需要,直接调用include标签传递相关名字的片段。