MyBatis是一种开源的持久层框架,它可以与Java程序一起使用,用于简化数据库操作。MyBatis提供了一个简单且灵活的方式来将Java对象映射到关系型数据库中的数据表。
MyBatis的主要目标是通过将SQL查询与Java代码的解耦来简化数据库访问,并提供了丰富的映射功能和灵活的查询选项。使用MyBatis,可以将数据库操作定义为XML文件或注解的形式,然后根据需要执行这些操作。
总之,MyBatis是一个轻量级且功能强大的持久层框架,适用于需要灵活控制SQL和数据库访问的Java应用程序。它提供了一种简单且可定制的方式来进行数据库操作,使开发人员能够更容易地与数据库交互。
MyBatis官网
MyBatis
的使用分为两部分,分别为:
MyBatis
开发环境的配置MyBatis
模式和语法操作数据库。首先我们来创建一个数据库三张表(用户表,文章表,视频表):
将以下代码复制到MySQL5.7
中:
-- 创建数据库
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 timestamp default current_timestamp,
updatetime timestamp default current_timestamp,
`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 timestamp default current_timestamp,
updatetime timestamp default current_timestamp,
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 timestamp default current_timestamp,
updatetime timestamp default current_timestamp,
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);
即为创建完毕.
添加MyBatis框架支持分为两种情况,一种情况是对自己之前的 Spring 项目进行升级,另一种情况是创建一个全新的 MyBatis
和 Spring Boo
t的项目.两者的区别是创建一个全新的 MyBatis项目时直接使用依赖(下面的演示为直接使用依赖),另一个方法是使用插件来引入依赖.(此处不做介绍)
注意此处使用2.x.x
版本的.
添加完依赖后,重新reload
:
然后删除不使用的文件:
(1)设置数据库连接的相关信息
在配置文件中添加以下配置:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8&useSSL=false
username: root
password: '0828'
driver-class-name: com.mysql.cj.jdbc.Driver
注意说明:如果使用的mysql-connector-java
是 5.x
版本之前,driver-class-name
的参数值应设置为com.mysql.jdbc.Driver
,如果版本大于5.x
,driver-class-name
的参数值应设置为com.mysql.cj.jdbc.Driver
。
(2)MyBatis xml保存路径和xml命名模式
设置MyBatis xml
保存路径,xml 文件中保存是对数据库的具体操作SQL,配置如下:
#设置MyBatis保存路径
mybatis:
mapper-locations: classpath:mybatis/*Mapper.xml
(3)启动MyBatis项目:
在设置好MyBatis配置信息后,运行启动MyBatis项目,观察能否成功运行,如果项目成功运行,说明配置成功。
(1)根据xml保存路径创建包
(2)添加实体类对象
在 Java 目录下创建一个实体类包用来存放各种实体类,其中就包含UserEntity
实体类。
package com.example.demo.entity;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class UserEntity {
private Integer id;
private String username;
private String password;
private String photo;
private LocalDateTime createtime;
private LocalDateTime updatetime;
private Integer state;
}
(3)数据库持久层UserMapper接口定义代码
package com.example.demo.mapper;
import com.example.demo.entity.UserEntity;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserMapper {
List<UserEntity> getAll();
}
注意说明:创建好UserMapper
类后立即在类上添加@Mapper
注解,该注解源自org.apache.ibatis.annotations.Mapper
。
@Mapper注解是MyBatis框架中的一个注解,用于标识一个Java接口或抽象类作为数据访问对象(DAO)接口。
当我们在Java接口或抽象类上添加@Mapper注解时,MyBatis会根据接口定义生成对应的实现类。这样,我们就可以在应用程序中通过调用这些接口方法来执行数据库操作。
需要注意的是,使用@Mapper注解时,需要确保接口与对应的XML映射文件名一致,并且同名的XML映射文件可以被正确加载和解析。
(4)添加 mybatis xml
文件
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="">
mapper>
为了更好地理解上述内容,举个例子:UserMapper.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="getAll" resultType="com.example.demo.entity.UserEntity">
select * from userinfo
</select>
</mapper>
namespace
属性用于指定映射器接口的完全限定名,它是与此映射器文件相关联的映射器接口的唯一标识,形式为全包名.类名
。id
属性指定了语句的唯一标识符,与接口中定义的方法名称⼀样的,表示对接口的具体实现方法。resultType
属性指定了查询结果的类型。在这个例子中,查询结果的类型是com.example.mybatis.entity.UserEntity
。综上所述,这个示例的目的是定义了一个名为getAll
的查询语句,它将查询数据库中的userinfo
表,并将结果映射为com.example.mybatis.entity.UserEntity
类型的对象。
通过这个映射文件,可以让MyBatis框架自动生成相应的SQL查询代码,方便在 Java 程序中调用和使用。
package com.example.mybatis.service;
import com.example.mybatis.entity.UserEntity;
import com.example.mybatis.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<UserEntity> getAll(){
return userMapper.getAll();
}
}
(6)添加 Controller 控制层,示例具体实现代码如下:
package com.example.demo.controller;
import com.example.demo.entity.UserEntity;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("getall")
public List<UserEntity> getAll(){
return userService.getAll();
}
}
实现代码说明:在Controller
类(控制层)中注入Service
(服务层),并在Controller
类中调用Service
类中的具体方法。
(1)数据库记录信息
(2)浏览器地址栏输入
MyBatisX
是一个第三方插件工具,可以在常见的Java开发IDE(如IntelliJ IDEA)中安装和使用。MyBatisX是一个用于增强MyBatis框架开发的插件工具,提供了XML语法支持、代码生成器、SQL编辑器、代码导航、代码重构和优化等功能,帮助开发者提升开发效率和代码质量。
MyBatis 在进行查询数据库操作的执行流程主要为:
MyBatis
中,首先需要在配置文件中配置数据源,以便连接到数据库。通常是可以通过使用连接池或者直接配置数据库连接信息连接。MyBatis
使用XML
文件来定义数据库操作语句和映射关系。创建一个映射文件,它包含了数据库查询、插入、更新和删除等操作的语句,以及将结果映射到 Java对象的规则。依赖注入(比如@Autowired)
方式注入Mapper
接口的实例。Controller
类中注入Service
类对象,Service
类中注入 Mapper
接口。MyBatis 在整个框架中的定位,框架交互流程图:
注意说明:MyBatis 是一个ORM
框架,ORM (Object Relational Mapping),即对象关系映射
。在面向对象编程语言中,将关系型数据库中的数据与对象建立起映射关系,进而自动的完成数据与对象的互相转换。
对象关系映射主要完成两步操作,分别为将输入数据(传入对象)+ SQL 映射成原生SQL以及将结果集映射为返回对象(输出对象)。