目录
什么是MyBatis
前置工作
创建MyBatis项目
MyBatis的使用
1.查询
1.1全查询
1.2传参查询
2.删除
3.修改
4.添加
什么是MyBatis
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生 SQL 查询,将接口和 Java 的实体类映射成数据库中的记录。
前置工作
在MySQL数据库中创建好数据库,建立好相关的表
-- 创建数据库
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);
执行下述SQL语句后,能得到相应的数据
创建MyBatis项目
创建一个Spring项目,除了原来的三个依赖外
多添加 MyBatis Framework 和 MySQL Driver 这两个依赖, 后者是数据库驱动, 使用哪个数据库就用哪个
在启动项配置文件里 application.properties 设置MyBatis配置
# 设置数据库的相关连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
# 版本8之前版本的数据库使用 com.mysql.jdbc.Driver
# 版本8以及之后版本的数据库使用 com.mysql.cj.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 设置 MyBatis XML 存放路径和命名格式
mybatis.mapper-locations=classpath:mybatis/*Mapper.xml
# 配置 MyBatis 执行时打印 SQL(可选配置)
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
logging.level.com.example.demo=debug
按照 MyBatis XML 存放路径 新建一个包, 路径与名字要一致
到这里, MyBatis的配置就算结束了
MyBatis的使用
MyBatis常规的写法包含了两个文件:
1.接口: 方法的声明(给其他层(Service)调用)
2.xml: 实现接口
1.查询
1.1全查询
首先 先构建一个实体类Userinfo
package com.example.demo.model;
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;
}
然后在dao包( 数据持久层 )里构建UserMapper接口
package com.example.demo.dao;
import com.example.demo.model.Userinfo;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper // 数据持久层的标志
public interface UserMapper {
List<Userinfo> getAll();
}
这样接口就写好了
接下来, 我们通过xml 来实现这个接口
MyBatis的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">
</mapper>
创建实现UserMapper接口的xml文件, 然后粘贴模板代码
这个mapper路径 必须要与接口的路径一致. 如下,修改后与我代码路径相符, 与模板路径不一致
然后例如我们要实现 查询操作
SQL语句不需要加分号 " ; "
这样就把通过xml实现接口的功能给完成了
接下来 我们来测试一下
在需要测试的类里,右键生成测试类
勾选要测试的方法, 然后确定
给测试类添加注解 @SpringBootTest
通过这个注解告诉当前的测试程序,当前的项目是运行在SpringBoot容器上的
然后运行测试类,查看结果
显然, 其结果与MySQL查询 是一致的
总结:
一共四步
1.首先创建好实体类(model层)
2.创建接口(dao层) 用来定义方法
3.创建xml文件(在resources.mybatis包里创建) 用来实现接口
4.生成测试类,测试结果
1.2传参查询
如果传递的是一个参数,然后根据这个参数来查询的话
例如我们要通过id来查询 Userinfo
接口:
通过注解 @Param 来设置参数名称, Mybatis xml文件以这个参数名称为准, 一般两者都设置为相同名称, 如有不同, 以前者为准
xml文件
通过 #{ } 或 ${ } 两者方式来设置占位符, 括号内的参数名称要与@Param设置的一致
测试类
我们假设传递的id值为1, 然后打印userinfo对象
这样就实现了传参查询
如果我们直接通过 ${ } 的方式来实现传参,它就是直接替换的,有存在SQL注入的风险
2.删除
先插入一条数据
删除操作的返回值是 int 值, 表示受影响的行数, 因此我们要用 Integer
接口:
xml:
测试类:
成功实现了删除操作
3.修改
接口:
修改操作的返回值是受影响的行数,所以用Integer接收
xml实现:
测试:
测试通过, 因为有注解 @Transaactional 数据库也没有被真的修改
4.添加
添加操作返回的也是受影响的行数
接口:
xml实现接口:
测试:
测试结果:
如果获取的返回值,除了受影响的行数外, 还想获取 其对应的自增主键 id
接口不变,xml代码修改
这样就可以实现 将数据库中自增的主键 赋值给 设置的属性
然后测试中 再用get方法获取id 即可
我们再次插入相同的数据, 此时id 就自增为 4 了, 我们得到的返回值也是 4