目录
1.MyBatis是什么?
MyBatis支持自定义SQL:MyBatis允许开发者编写自定义的SQL查询语句,从而更好地优化和控制数据库访问。与其他ORM框架不同,MyBatis不会自动创建SQL语句,而是将这一过程交给开发者,使得开发者能够更好地控制数据库查询逻辑。
MyBatis对存储过程支持:MyBatis支持存储过程的调用,可以通过MyBatis执行存储过程,将Java对象与存储过程进行映射,并处理存储过程的输出参数。
MyBatis支持高级映射:MyBatis提供了高级映射功能,允许开发者将复杂的数据库查询结果映射到Java对象中,从而简化数据的处理和转换。
MyBatis去除JDBC代码:MyBatis屏蔽了大部分JDBC(Java Database Connectivity)代码,减少了繁琐的数据库操作,开发者只需关注SQL语句的编写和Java对象的映射。
参数设置和结果集获取:MyBatis简化了参数设置和结果集获取的过程,开发者只需在配置文件或注解中定义相应的映射关系,MyBatis会自动将Java对象和数据库记录进行转换。
XML和注解配置:MyBatis支持两种方式来配置和映射数据库查询:一种是通过XML文件进行配置,另一种是通过注解来实现。开发者可以根据个人偏好来选择适合的方式。
映射原始类型、接口和Java POJO:MyBatis支持将原始数据类型、Java接口以及普通Java对象(POJO)与数据库记录进行映射。这种灵活性使得MyBatis适用于各种场景和项目规模。
总的来说,MyBatis是一个功能强大且灵活的持久层框架,通过简化数据库交互和提供丰富的映射功能,它大大提高了Java开发者的生产效率,并被广泛应用于各种Java项目中。
2.为什么学习MyBatis?
对于后端开发来说程序是由以下两部分组成:
- 后端程序
- 数据库
在之前的学习我们大多采用JDBC的方式来实现后端程序与数据库的交互,但是JDBC的流程关于繁琐
而MyBatis能够帮助我们更加快熟、便捷的完成后端程序与数据库的交互!
3. 怎么学 MyBatis
学习 MyBatis 两步走
搭建 MyBatis 开发环境
使用 MyBatis 模式和语法操作数据库
4.第⼀个MyBatis查询
开始搭建 MyBatis 之前,我们先来看⼀下 MyBatis 在整个框架中的定位,框架交互流程图:
MyBatis 也是⼀个 ORM 框架,ORM(Object Relational Mapping),即对象关系映射。在面向对象编程语言中,将关系型数据库中的数据与对象建立起映射关系,进而自动的完成数据与对象的互相转换:
- 将输入数据(即传入对象)+SQL 映射成原生SQL
- 将结果集映射为返回对象,即输出对象ORM 把数据库映射为对象
ORM 把数据库映射为对象:
- 数据库表(table)--> 类(class)
- 记录(record,行数据)--> 对象(object)
- 字段(field) --> 对象的属性(attribute)
⼀般的 ORM 框架,会将数据库模型的每张表都映射为⼀个 Java 类。 也就是说使用 MyBatis 可以像操作对象⼀样来操作数据库中的表,可以实现对象和数据库表之间的转换,接下来我们来看 MyBatis 的使用吧。
4.1 添加MyBatis框架支持
添加 MyBatis 框架支持分为两种情况:⼀种情况是对自己之前的 Spring 项目进行升级,另⼀种情况是创建⼀个全新的 MyBatis 和 Spring Boot 的项目,下面我们分别来演示这两种情况的具体实现
4.1.1老项目添加MyBatis
<!-- 添加 MyBatis 框架 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.1</version>
</dependency>
<!-- 添加 MySQL 驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
为什么我在这里添加了MySQL驱动呢?
MyBatis 就像⼀个平台(类似淘宝),而数据库相当于商家有很多种,不止有 MySQL,还有 SQL Server、Oracle等等.....因此这两个都是需要添加的,对比自身所使用的数据库来添加就行了
4.1.2 新项目添加MyBatis
我们创建完新的ssm项目,直接去启动时一定会报错, 因为你添加了数据库依赖而没有连接数据库(配置数据库的连接信息)
4.2 配置连接字符串和MyBatis
4.2.1 配置连接字符串
如果是 application.yml 添加如下内容:
# 数据库连接位置
spring:
datasource:
url: jdbc:mysql://localhost:3306/mycnblog?characterEncoding=utf8&useSSL=false
username: root
password: root
# 驱动
driver-class-name: com.mysql.cj.jdbc.Driver
注意:这里的password和你数据库的吗密码是一样的!
application.properties:
spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/mycnblog?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
#数据库密码
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
注意事项:如果使用 mysql-connector-java 是 5.x 之前的使用的是“com.mysql.jdbc.Driver” ,如果是大于 5.x 使用的是“com.mysql.cj.jdbc.Driver” 。
4.2.2 配置 MyBatis 中的 XML 路径
MyBatis 组成2部分:
- 接口(表的使用操作方法,给程序其他类调用的)
- xml (实现接口,写具体SQL语句)
#mybatis 中 xml 保存路径
mybatis:
mapper-locations:
- classpath:mybatis/**Mapper.xml
5. 使用 MyBatis 的操作模式操作数据库
先创建数据库
-- 创建数据库
drop database if exists mycnblog;
create database mycnblog DEFAULT CHARACTER SET utf8mb4;
-- 使用数据
use mycnblog;
-- 创建表[用户表]
drop table if exists userinfo;
create table userinfo(
id int primary key auto_increment,
username varchar(100) not null,
password varchar(32) not null,
photo varchar(500) default '',
createtime datetime default now(),
updatetime datetime default now(),
`state` int default 1
) default charset 'utf8mb4';
-- 创建文章表
drop table if exists articleinfo;
create table articleinfo(
id int primary key auto_increment,
title varchar(100) not null,
content text not null,
createtime datetime default now(),
updatetime datetime default now(),
uid int not null,
rcount int not null default 1,
`state` int default 1
)default charset 'utf8mb4';
-- 创建视频表
drop table if exists videoinfo;
create table videoinfo(
vid int primary key,
`title` varchar(250),
`url` varchar(1000),
createtime datetime default now(),
updatetime datetime default now(),
uid int
)default charset 'utf8mb4';
-- 添加一个用户信息
INSERT INTO `mycnblog`.`userinfo` (`id`, `username`, `password`, `photo`,
`createtime`, `updatetime`, `state`) VALUES(1, 'admin', 'admin', '', '2021-12-06 17:10:48', '2021-12-06 17:10:48', 1);
-- 文章添加测试数据
insert into articleinfo(title,content,uid) values('Java','Java正文',1);
-- 添加视频
insert into videoinfo(vid,title,url,uid) values(1,'java title','http://www.baidu.com',1);
5.1 添加实体类
先添加用户的实体类:
package com.example.demo.eneity;
import lombok.Data;
import java.time.LocalDateTime;
/**
* Created with IntelliJ IEDA.
* Description:
* User:86186
* Date:2023-08-02
* Time:16:44
*/
@Data
public class Userinfo {
private int id;
private String username;
private String password;
private String photo;
private LocalDateTime createtime;
private LocalDateTime updatetime;
private int state;
}
5.2 添加 Mapper 接口
package com.example.demo.mapper;
import com.example.demo.eneity.Userinfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* Created with IntelliJ IEDA.
* Description:
* User:86186
* Date:2023-08-02
* Time:16:48
*/
@Mapper// 和五大类注解是一样的
public interface UserMapper {
Userinfo getUserById(@Param("id") Integer id);
}
5.3 添加 User Mapper.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">
<select id="getUserById" resultType="com.example.demo.eneity.Userinfo">
select * from userinfo where id=${id}
</select>
</mapper>
5.4 添加 Service
package com.example.demo.service;
import com.example.demo.eneity.Userinfo;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* Created with IntelliJ IEDA.
* Description:
* User:86186
* Date:2023-08-02
* Time:17:16
*/
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public Userinfo getUserById(int id){
return userMapper.getUserById(id);
}
}
5.4 添加 Controller
package com.example.demo.controller;
import com.example.demo.eneity.Userinfo;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Created with IntelliJ IEDA.
* Description:
* User:86186
* Date:2023-08-02
* Time:17:22
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/getuserbyid")
public Userinfo getUserById(Integer id){
if (id == null){
return null;
}
return userService.getUserById(id);
}
}