一:MyBatis概述
(1)为什么要学MyBatis
A:案例
对于下面的SQL语句
-- 创建数据库
create database if not exists `library` default character set utf8mb4; -- 使⽤数据库
use library;
-- 创建表
create table if not exists `soft_bookrack` (
`book_name` varchar(32) NOT NULL,
`book_author` varchar(32) NOT NULL,
`book_isbn` varchar(32) NOT NULL primary key
);
对应的JDBC代码如下
- 创建数据连接池
DataSource
- 通过
DataSource
获取数据库连接Connection
- 编写带占位符的SQL语句
- 通过
Connection
以及SQL创建操作命令对象Statement
- 替换占位符
- 使用
Statement
执行SQL语句 - 查询操作,返回结果集
ResultSet
- 处理结果集
- 释放资源
可以看出整个操作流程相当繁琐。我们不但要拼接每⼀个参 数,而且还要按照模板代码的方式,⼀步步的操作数据库,并且在每次操作完,还要手动关闭连接等,而所有的这些操作步骤都需要在每个方法中重复书写。于是我们就想,那有没有⼀种方法,可以更简 单、更方便的操作数据库呢? 答案是肯定的,这就是我们要学习MyBatis 的真正原因,它可以帮助我们更方便、更快速的操作数据 库
B:理由
学习MyBatis的理由:
- 简化数据库操作: MyBatis提供了一种简单而强大的方式来执行数据库操作,尤其是对于需要执行复杂SQL查询的应用程序。通过将Java对象映射到数据库表,你可以避免手动处理结果集等繁琐的数据库访问细节
- 灵活的SQL查询: MyBatis支持动态SQL,使得你可以根据不同的条件生成不同的SQL语句。这种灵活性对于构建复杂的查询非常有用,同时也能提高应用程序的性能
- 与现有代码集成: MyBatis可以轻松地集成到现有的Java应用程序中,无论是基于Java EE 还是 Spring 等框架。这种灵活性使得你可以选择性地使用MyBatis来处理特定的数据库访问需求
- 解耦数据访问层: MyBatis帮助你实现了数据访问层(DAO)的解耦。通过将SQL语句和数据库映射配置从Java代码中分离出来,你可以更容易地维护和修改数据库访问逻辑,而不影响其他层的代码
- 性能优化: MyBatis提供了缓存机制,包括本地缓存和二级缓存,可以有效提高数据库访问性能。这对于需要频繁读取或写入数据库的应用程序来说尤其重要
- 广泛应用: MyBatis在许多Java项目中得到广泛应用,特别是那些对数据库访问有特殊需求的项目。学习MyBatis可以为你提供一种流行且实用的数据库访问解决方案
(2)什么是MyBatis
MyBatis:是一个Java持久层框架,用于将对象与关系数据库的表之间建立映射关系。它提供了一种将数据库操作和SQL映射配置从Java代码中分离出来的方法,使得开发者可以更方便地管理SQL语句和数据库交互
- SQL映射配置: MyBatis使用XML或注解配置文件来定义数据库操作,包括SQL语句、输入参数和输出映射
- 对象-关系映射(ORM): MyBatis允许你将Java对象与数据库表进行映射,避免了手动处理结果集的繁琐工作
- 动态SQL: MyBatis支持动态SQL,允许在运行时构建动态的SQL语句,根据不同的条件生成不同的查询
- 参数映射: MyBatis可以将Java对象作为参数传递给SQL语句,也可以将查询结果映射到Java对象
- 缓存机制: MyBatis提供了一些缓存机制,可以提高数据库访问的性能,包括本地缓存和二级缓存
- 插件体系: MyBatis允许你使用插件来定制或扩展其行为,例如拦截SQL语句的执行
MyBatis也是一个ORM框架(对象关系映射)。在面向对象编程语言中,将关系型数据库中的数据与对象建立起映射关系,进而自动完成数据与对象的互相转换
- 将输入数据+SQL映射为原生SQL
- 将结果集映射为输出对象
ORM把数据库映射为对象
- 数据库表(
table
)->类(class
) - 记录(
record
)->对象(object
) - 字段(
field
)->对象的属性(attribute
)
(3)如何学习MyBatis
MyBatis学习分为以下两个部分
- 配置MyBatis开发环境
- 使用MyBatis模式和语法操作数据库
二:配置MyBatis开发环境
(1) 准备测试所需表
为了方便说明,使用下面的表
-- 创建数据库
drop database if exists testdatabase;
create database testdatabase DEFAULT CHARACTER SET utf8mb4;
-- 使⽤数据数据
use testdatabase;
-- 创建表[⽤户表]
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 `testdatabase`.`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://ww
w.baidu.com',1);
(2)MyBatis相关配置
A:添加MyBatis框架支持
分为两种情况
- 针对之前的Spring项目进行升级
- 创建一个全新的MyBatis和SpringBoot项目
①:针对老项目
首先下载插件EditStarters
在pom.xml
中右键选择Generate,然后选择EditStarters
在下方勾选
- MyBatis Framework
- MySQL Driver
②:针对新项目
- 略
B:配置连接字符串
在application.yml
中配置以下信息
spring:
datasource:
url: jdbc:mysql://localhost:3306/testdatabase?characterEncoding=utf8&useSSL=false
username: root
password: zxsgdsg612057
driver-class-name: com.mysql.cj.jdbc.Driver
此时项目启动成功
C:配置MyBatis中的XML路径
MyBatis 由以下两部分组成
- 接口(表的所有操作方法):给程序其他类调用
- XML实现接口:具体写SQL语句
MyBatis 使用 XML 文件来定义数据库操作的 SQL 语句(当然可以使用注解,但太过麻烦),以及 SQL 语句与 Java 对象之间的映射关系。这些 XML 文件通常称为映射文件,其中包含了与数据库交互的 SQL 语句和相关的配置信息
例如,一个简单的映射文件可能如下所示。这里,namespace
属性指定了该映射文件对应的 Mapper 接口的全限定名。映射文件中定义了一个查询操作和一个插入操作,以及结果映射配置,将数据库中的列映射到 Java 对象的属性
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="UserResultMap" type="com.example.model.User">
<id property="id" column="user_id"/>
<result property="username" column="user_name"/>
<result property="password" column="user_password"/>
</resultMap>
<select id="getUserById" resultMap="UserResultMap">
SELECT * FROM users WHERE user_id = #{id}
</select>
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO users (user_name, user_password) VALUES (#{username}, #{password})
</insert>
</mapper>
为了让MyBatis找到所需要的XML映射文件,我们需要配置MyBatis XML的文件路径。在application.yml
中配置如下,所有的.xml
文件在resources/mybatis
下
mybatis:
mapper-locations: classpath:mybatis/**Mapper.xml
(3) 第一个MyBatis查询
从现在开始,我们所建立的项目必须遵循标准的JavaEE项目规范
我们的目标是通过id
查询user
select * from userinfo where id = 1
①:添加实体类
实体类要和表相对应
package com.example.mybatisstudy.entity;
import lombok.Data;
import java.time.LocalDateTime;
@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;
}
②:添加mapper接口
package com.example.mybatisstudy.mapper;
import com.example.mybatisstudy.entity.UserInfo;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper {
UserInfo getUserById (Integer id);
}
③:添加Xml
核心模板如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybati s.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="待实现接口名">
</mapper>
完整代码如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybati s.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mybatisstudy.mapper.UserMapper">
<select id="getUserById" resultType="com.example.mybatisstudy.entity.UserInfo">
select * from userinfo where id = ${id}
</select>
</mapper>
④:添加Service
服务器层代码如下
package com.example.mybatisstudy.service;
import com.example.mybatisstudy.entity.UserInfo;
import com.example.mybatisstudy.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
// Spring会找这个interface的实现类
// 如果有多个实现类就会报错(可以使用resource解决)
@Autowired
private UserMapper userMapper;
// 这个方法名建议和接口中的方法名一致
public UserInfo getUserById(Integer id) {
return userMapper.getUserById(id);
}
}
⑤:添加Controller
控制层代码如下
package com.example.mybatisstudy.controller;
import com.example.mybatisstudy.entity.UserInfo;
import com.example.mybatisstudy.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
// 当返回实体对象时,Spring会自动转换为json
@RequestMapping("/getuserbyid")
public UserInfo getUserById(Integer id) {
if (id == null) return null;
return userService.getUserById(id);
}
}
评论区