一、什么是Mybatis
二、配置项
三、crud
OK啊,在搞定Mybatis整合springboot之前,咱写了解一下什么是Mybatis,如下文
一:什么是Mybatis?
MyBatis 是一款优秀的持久层框架 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程 MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类 【Plain Old Java Objects,普通的 Java对象】映射成数据库中的记录。 MyBatis 本是apache的一个开源项目ibatis, 2010年这个项目由apache 迁移到了google code,并且改名 为MyBatis 。
1.1持久化
持久化是将程序数据在持久状态和瞬时状态间转换的机制。 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存 中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。 JDBC就是一种持久化机制。文件IO也是一种持久化机制。 在生活中 : 将鲜肉冷藏,吃的时候再解冻的方法也是。将水果做成罐头的方法也是。 为什么需要持久化服务呢?那是由于内存本身的缺陷引起的 内存断电后数据会丢失,但有一些对象是无论如何都不能丢失的,比如银行账号等,遗憾的是,人们还 无法保证内存永不掉电。 内存过于昂贵,与硬盘、光盘等外存相比,内存的价格要高2~3个数量级,而且维持成本也高,至少需 要一直供电吧。所以即使对象不需要永久保存,也会因为内存的容量限制不能一直呆在内存中,需要持 久化来缓存到外存。
1.2 什么是持久层?
完成持久化工作的代码块 . ----> dao层 【DAO (Data Access Object) 数据访问对象】 大多数情况下特别是企业级应用,数据持久化往往也就意味着将内存中的数据保存到磁盘上加以固化, 而持久化的实现过程则大多通过各种关系数据库来完成。 不过这里有一个字需要特别强调,也就是所谓的“层”。对于应用系统而言,数据持久功能大多是必不可 少的组成部分。也就是说,我们的系统中,已经天然的具备了“持久层”概念?也许是,但也许实际情况 并非如此。之所以要独立出一个“持久层”的概念,而不是“持久模块”,“持久单元”,也就意味着,我们的系 统架构中,应该有一个相对独立的逻辑层面,专注于数据持久化逻辑的实现. 与系统其他部分相对而言,这个层面应该具有一个较为清晰和严格的逻辑边界。【说白了就是用来操作 数据库存在的!】
1.3为什么需要Mybatis?
Mybatis就是帮助程序猿将数据存入数据库中 , 和从数据库中取数据 . 传统的jdbc操作 , 有很多重复代码块 .比如 : 数据取出时的封装 , 数据库的建立连接等等... , 通过框架可以 减少重复代码,提高开发效率 . MyBatis 是一个半自动化的ORM框架 (Object Relationship Mapping) -->对象关系映射 所有的事情,不用Mybatis依旧可以做到,只是用了它,所有实现会更加简单!技术没有高低之分, 只有使用这个技术的人有高低之别 MyBatis的优点简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映 射文件就可以了,易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和 实现。 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。sql写在xml里,便于统一管理 和优化。通过sql语句可以满足操作数据库的所有需求。 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清 晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。 提供xml标签,支持编写动态sql。 ....... 最重要的一点,使用的人多!公司需要!
二:Mybatis整合springboot的配置
第一步:
在基本的Springboot项目依赖文件中加入如下依赖
<!-- Mybatis整合springboot-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- MySQL驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
第二步:
配置yml文件
1.修改内置tomcat得端口号
server:
port: 8088 # 端口号
connection-timeout: 1000m # 连接超时时间
第三步:
配置数据源
当我们引入MySQL驱动依赖之后,不添加该配置就会报错(找不到数据库的路径),这时候就需要自己来手动配置一下自己的数据库路径以及账号密码
由于该项目的MySQL驱动依赖是8.0.31版本的,简单来说就是版本为8的以后需要加上cj( driver-class-name: com.mysql.cj.jdbc.Driver),并且URL路径最后要加上一个时区,如下代码加的为↑Shanghai,以下的就不要添加 : driver-class-name: com.mysql.jdbc.Driver
Spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://localhost:3306/jdbc_1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
OK啊准备工作搞完了,接下来就是枯燥的crud代码了
三:crud
第四步:
创建好所需的包Controller,service,Mapper,pojo
这里提一下:原本的Mvc的dao层在整合Mybatis后就替换为了Mapper,当然意思还是以前那个意思都是访问数据库存取那点东西
这里的Mapper层写的是接口类,至于他的实现类也替换为了xml文件,Mapper.xml,意思呢也还是那个意思啊!,通过xml实现接口类里的方法,咱下边走代码喽一眼
创建好Mapper包后里面的类方法还并没有被Spring的bean容器接管,这时候就要在主方法类上加入@MapperScan("com.aaa.mapper")注解,让其被扫描到注入容器中,如果不想这么做可以在mapper下的实现类上添加@Mapper注解,一个样子的
第五步:
在resources下创建一个Mapper包,以下用来存放Mapper.xml文件,如下图
Controller,pojo,service咱就不说了,毕竟还是以前的老样子嘛Controller调service的方法
service调用dao,这里是Mapper!
第六步:
编写基本的crud方法
如下代码依旧是咱最熟悉不过的crud基本方法,那么现在接口也有了,就可以使用xml来实现这些方法了
public interface EmpMapper {
int insert(Student student);
int delete(int id);
int update(Student student);
List<Student> select();
}
第七步:
xml实现接口方法
namespace="com.aaa.mapper.EmpMapper":这里是接口类的路径
id="Select":就是实现类中方法的方法名
resultType:"com.aaa.pojo.Student":这里是sql语句查询到的数据返回的结果集类型
parameterType="com.aaa.pojo.Student":这里是service层传过来的参数类型,也就是该方法的接受的参数类型,因为这里返回的是一个实体类,所以这里直接就写上了实体类的路径
这里的语法问题呢我想也都有疑惑为啥要这样写,但是是实在是太多了,可以参考一下官网的教程好吧!链接放这下面了
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aaa.mapper.EmpMapper">
<select id="Select" resultType="com.aaa.pojo.Student">
select * from student
</select>
<insert id="Insert" parameterType="com.aaa.pojo.Student">
insert student(stuname,sex,birthday,idcard)value(#{stuname},#{sex},#{birthday},#{idcard});
</insert>
<update id="Update">
update student set stuname=#{stuname},sex=#{sex},birthday=#{birthday},idcard=#{idcard} where id=#{id};
</update>
<delete id="Delete">
delete from student where id=#{id}
</delete>
</mapper>