目录
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语句后,能得到相应的数据
创建一个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常规的写法包含了两个文件:
1.接口: 方法的声明(给其他层(Service)调用)
2.xml: 实现接口
首先 先构建一个实体类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
getAll(); - }
这样接口就写好了
接下来, 我们通过xml 来实现这个接口
MyBatis的xml文件模板如下
- "1.0" encoding="UTF-8"?>
- 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.生成测试类,测试结果
如果传递的是一个参数,然后根据这个参数来查询的话
例如我们要通过id来查询 Userinfo
接口:
通过注解 @Param 来设置参数名称, Mybatis xml文件以这个参数名称为准, 一般两者都设置为相同名称, 如有不同, 以前者为准
xml文件
通过 #{ } 或 ${ } 两者方式来设置占位符, 括号内的参数名称要与@Param设置的一致
测试类
我们假设传递的id值为1, 然后打印userinfo对象
这样就实现了传参查询
如果我们直接通过 ${ } 的方式来实现传参,它就是直接替换的,有存在SQL注入的风险
先插入一条数据
删除操作的返回值是 int 值, 表示受影响的行数, 因此我们要用 Integer
接口:
xml:
测试类:
成功实现了删除操作
接口:
修改操作的返回值是受影响的行数,所以用Integer接收
xml实现:
测试:
测试通过, 因为有注解 @Transaactional 数据库也没有被真的修改
添加操作返回的也是受影响的行数
接口:
xml实现接口:
测试:
测试结果:
如果获取的返回值,除了受影响的行数外, 还想获取 其对应的自增主键 id
接口不变,xml代码修改
这样就可以实现 将数据库中自增的主键 赋值给 设置的属性
然后测试中 再用get方法获取id 即可
我们再次插入相同的数据, 此时id 就自增为 4 了, 我们得到的返回值也是 4