1. MyBatis是什么?
MyBatis 是⼀款优秀的持久层框架,它⽀持⾃定义 SQL、存储过程以及级映射。MyBatis 去除了⼏乎所有的 JDBC 代码以及设置参数和获取结果集的⼯作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接⼝和 Java POJO(Plain Old Java Objects,普通⽼式 Java 对象)为数据中的记录。
简单来说 MyBatis 是更简单完成程序和数据库交互的⼯具,也就是更简的操作和读取数据库⼯具
2. 为什么要学习MyBatis?
对于用后端开发来说,需要通过后端程序操作数据库,即有后端程序连接数据库,MyBatis就是连接数据库的工具,传统方式有JDBC,但是JDBC操作过于繁琐,所以通过MyBatisshi 非常简单的.
后端交互图:
3 MyBatis的框架在后端中的定位及交互
MyBatis 也是⼀个 ORM 框架,ORM(Object Relational Mapping),即对象关系映射。在⾯向对象编程语⾔中,将关系型数据库中的数据与对象建⽴起映射关系,进⽽⾃动的完成数据与对象的互相转换:
- 将输⼊数据(即传⼊对象)+SQL 映射成原⽣ SQL
- 将结果集映射为返回对象,即输出对象
ORM 把数据库映射为对象:
- 数据库表(table)–> 类(class)
- 记录(record,⾏数据)–> 对象(object)
- 字段(field) --> 对象的属性(attribute)
⼀般的 ORM 框架,会将数据库模型的每张表都映射为⼀个 Java 类。也就是说使⽤ MyBatis 可以像操作对象⼀样来操作数据库中的表,可以实现对象和数据库表之间的转换.
下图为后端交互流程图:
4. 配置搭建MyBatis
基于SoringBoot.
- 添加MyBatis框架
- 添加Interface接口文件和.xml文件
- 除了上述还需在application.yml/application.properties配置文件中添加链接数据库字符, .xml文件的文件配置等.
4.1 老项目中添加MyBatis
此处添加框架支持时一定要添加添加 MySQL 驱动!!!
<!-- 添加 MyBatis 框架 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!-- 添加 MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
4.2 新项目中直接添加
4.3 添加application.yml/application-dev.yml配置文件配置以下内容
application.yml为总配置文件,application-dev.yml为开发环境配置文件,需要在总配置文件中选择使用开发环境配置文件还是生产环境配置文件
基于开发环境配置文件,若是配置生产环境则需要改数据库连接操作
application.yml:
#配置开发环境
spring:
profiles:
active: dev #选择环境为开发环境
#配置 mybatis xml的保存路径
mybatis:
mapper-locations: classpath:mybatis/**Mapper.xml #此处文件名必须是**Mapper.xml
application-dev.yml:
#连接数据库
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8 #jdbc的格式因为后面要调用jdbc
username: root
password: 263000
driver-class-name: com.mysql.cj.jdbc.Driver #jdbc驱动 大于5.x版本的 小于5的com.mysql.jdbc.Driver
# 开启 MyBatis SQL 打印
logging:
level:
com:
example:
demo: debug #设置日志打印优先级
#设置打印mybatis的日志实现
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
4.4 在resources目录下面创建一个mybatis文件夹,这个文件夹下创建.xml文件,用于直接操作数据库
注意:此处创建的文件名必须是Mapper.xml(不懂可见配置文件)
下面是一个通过id查询到用户的sql操作,删除select标签,剩下的内容是.xml文件必须的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper"> <!-->前面是文件路径,这里面的UserMapper对应mapepr层的接口文件<!-->
<!-->sql语句<!-->
<!-->根据id查询用户信息<!--> <!-->删除整个查询语句,剩下的内容是.xml文件必须的<!-->
<select id="getUserById" resultType="com.example.demo.model.UserInfo">
select * from userinfo where id=#{id} <!-->
</select>
</mapper>
4.5 在创建工程时就创建好的DemoApplication 启动类同级目录或比DemoApplication低一级目录创建一个mapper目录用于存放接口
这个mapper文件名字会对应到上面.xml的namespace路径,名字需相同.
这个接口必须要加@Mapper注解,比如下面是通过id查询用户的操作. 这个文件里面只是用来声明接口的,不要写业务代码.
package com.example.demo.mapper;
import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface UserMapper {
//根据ID查询名字
public UserInfo getUserById(@Param("id")Integer id); //@Param作用:告诉Integer类型的id在xml里面的名字叫做id
}
4.6 添加服务层(service),和控制层(controller)进行交互.
服务层代码:
package com.example.demo.servce;
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.UserInfo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UserService {
@Resource
public UserMapper userMapper; //通过注入的方式拿到UserMapper对象
public UserInfo getUserById(Integer id ){
return userMapper.getUserById(id);
}
}
控制层代码:
package com.example.demo.controller;
import com.example.demo.model.UserInfo;
import com.example.demo.servce.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
public UserService userMapper;
@RequestMapping("get")
public UserInfo getUserById(Integer id){
if(id==null) {
return null;
}
return userMapper.getUserById(id);
}
}
通过以上步骤,就可以实现前后端交互了,并且是通过MyBatis 来操作数据库.
查询结果:
数据库中数据:
上面过程的交互流程图如下: