MyBatis是一款有序的持久层框架,能更简单的完成程序和数据库交互的工具,也就是更简单的的操作和读取数据库的工具。
我们原来操作数据库的时候,是使用JDBC的代码,但是它是非常麻烦的。每次都要建立数据库连接池,通过DataSource获取数据库连接Connection,然后执行语句,最后还要释放资源等等,这是相当繁琐的步骤。学习使用MyBatis就能更加简单的操作数据库了。
MyBatis学习分为两个部分:
开始搭建MyBatis之前,我们先看一下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';
-- 添加⼀个⽤户信息
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);
下面是application.yml的文件的相关配置:
Spring:
datasource:
url: jdbc:mysql://localhost:3306/mycnblog?characterEncoding=utf8&userSSL=fasle
username: root
password: 1020118096
dirver-class-name: com.mysql.jdbc.Driver
# 配置 mybatis xml的文件路径名,在resources/mapper创建所有表的xml文件
mybatis:
mapper-locations: classpath:mapper/**Mapper.xml
下面是后端开发的工程思路,也就是下面的流程来实现MyBatis查询所有的用户功能:
先添加用户的实体类:
import lombok.Data;
import java.util.Date;
/**
* Describe:
* User:lenovo
* Date:2023-07-28
* Time:9:14
*/
@Data
public class User {
private Integer id;
private String username;
private String password;
private String photo;
private Date createTime;
private Date updateTime;
}
数据持久层的接口定义:
@Mapper
public interface UserMapper {
public List getAll();
}
数据持久层的实现,mybatis的固定xml格式:
UserMapper.xml查询所有用户的具体实现SQL:
以下是对标签的说明:
测试代码实现如下:
@SpringBootTest //不能省略,告诉当前程序项目是在Spring Boot框架中运行的。
class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
void getAll() {
List list = userMapper.getAll();
System.out.println(list);
}
}
接下来,我们将实现用户的增加、删除、修改的操作,对应使用MyBatis的标签如下:
mapper interface:
@Mapper
public interface UserMapper {
//查询所有用户操作
public List getAll();
//添加用户操作
Integer add(User user);
}
mapper.xml:
insert into userinfo(user, password,photo,state)
values(#{username}, #{password}, #{photo}, 1)
Test:
@Test
void add() {
User user = new User();
user.setUsername("zhangsan");
user.setPassword("123");
user.setPhoto("cat.png");
System.out.println(userMapper.add(user));
}
默认情况下,这个方法返回值为受影响结构的行数
mapper interface:
//更新用户操作
Integer update(User user);
mapper.xml:
update userinfo set username = #{username} where id = #{id}
test:
@Test
void update() {
User user = new User();
user.setUsername("lisi");
user.setId(2);
System.out.println(userMapper.update(user));
}
mapper interface:
//删除用户操作
Integer delById(User user);
mapper.xml:
delete from userinfo where id = #{id}
test:
@Test
void delById() {
User user = new User();
user.setId(2);
System.out.println(userMapper.delById(user));
}
不同点:
resultMap使用场景:
字段名和属性名不同的情况
创建User1类:
@Data
public class User1 {
private Integer id;
private String username;
private String pwd;
private String photo;
private Date createTime;
private Date updateTime;
}
创建User1Mapper类:
@Mapper
public interface User1Mapper {
//查询操作
List getUserById(Integer id);
}
创建User1Mapper.xml文件:
test方法:
@SpringBootTest
class User1MapperTest {
@Autowired
private User1Mapper user1Mapper;
@Test
void getUserById() {
System.out.println(user1Mapper.getUserById(1));
}
}
在进行多表查询的时候,如果我们使用resultType标签,在一个类中包含了另一个对象是查询不出来所包含的对象的,比如以下代码:
@Data
public class ArticleInfo {
private Integer id;
private String title;
private String content;
private LocalDateTime createtime;
private LocalDateTime updatetime;
private Integer rcount;
//包含了另一个对象
private User user;
}
这个时候,由于我们查询文章的时候,又需要查询作者的信息,导致对象中包含了对象,我们使用MyBatis是无法进行响应的user对象中字段匹配的。
ArticleInfoMapper.java 类:
@Mapper
public interface ArticleInfoMapper {
//查询文章以及对应的作者名字
List getAll();
}
ArticleInfoMapper.xml文件:
Test类:
@SpringBootTest
class ArticleInfoMapperTest {
@Autowired
private ArticleInfoMapper articleInfoMapper;
@Test
void getAll() {
List list = articleInfoMapper.getAll();
System.out.println(list);
}
}
修改如下:
以上使用association>标签,表示一对一结果映射:
一对多,我们需要使用
在我们填写一些信息的时候,可能会遇到这问题,比如在注册的时候只有账号,密码,和确认密码是必填项,真实姓名、性别、年龄等是选填,这个时候我们应当如何构造SQL语句呢?
假设注册场景:名字、密码必填,头像图片选填。
UserMapper.java文件:
//添加用户
Integer add1(User user);
UserMapper.xml文件:
insert into userinfo(
username,
photo,
password
) values(
#{username},
#{photo},
#{password})
我们现在只插入姓名和密码的结果为:
之前插入用户的时候,我们只有一个photo是可选字段,但是如果姓名,密码,照片都为可选字段我们要怎么做呢?
调整UserMapper.xml的插入语句:
insert into userinfo(
username,
password,
photo
) values(
#{username},
#{password},
#{photo},
)
我们只添加名字和密码:
传入的用户对象,根据属性做where条件查询,用户对象中属性不为null的,都可以作为查询条件。
UserMapper.java:
List selectByCondition(User user);
UserMapper.xml:
7.4
根据川渝的用户对象属性来更新数据。
UserMapper接口中修改用户,根据传入的用户ID,修改其他非空属性。
//标签的使用
int updateById(User user);
UserMapper.xml:
update userinfo
username = #{username},
password = #{password},
photo != #{photo}
where id = #{id}
对集合进行遍历时可以使用该标签。
根据多个文章id查询文章数据:
//根据Id查询文章,的使用
List selectByIds(List list);
.xml: