目录
1.MyBatis是什么?
2.为什么学习MyBatis?
3. 怎么学 MyBatis
4.第⼀个MyBatis查询
4.1 添加MyBatis框架支持
4.1.1老项目添加MyBatis
4.1.2 新项目添加MyBatis
4.2 配置连接字符串和MyBatis
4.2.1 配置连接字符串
4.2.2 配置 MyBatis 中的 XML 路径
5. 使用 MyBatis 的操作模式操作数据库
5.1 添加实体类
5.2 添加 Mapper 接口
5.3 添加 User Mapper.xml
5.4 添加 Controller
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);
}
}