自己做的网站怎么绑域名,网站建设平台安全问题有哪些方面,wordpress 知更鸟 公告,网页设计与制作教程书文章目录 一. MyBatis概述二. MyBatis项目的创建1. 准备一个数据表2. 创建项目 三. MyBatis的使用1. 基本使用2. SpringBoot单元测试 四. 使用MyBatis实现单表操作1. 查询2. 修改3. 删除4. 新增 五. 基于注解完成SQL 一. MyBatis概述
MyBatis 是一款优秀的持久层框架#xff… 文章目录 一. MyBatis概述二. MyBatis项目的创建1. 准备一个数据表2. 创建项目 三. MyBatis的使用1. 基本使用2. SpringBoot单元测试 四. 使用MyBatis实现单表操作1. 查询2. 修改3. 删除4. 新增 五. 基于注解完成SQL 一. MyBatis概述
MyBatis 是一款优秀的持久层框架它支持自定义 SQL、存储过程以及高级映射MyBatis 去除了几乎所有的 JDBC 代码和动设置参数以及获取结果集的工作MyBatis可以使用简单的 XML 或注解来配置和映射原始类型将接口和 Java 的 POJOPlain Old Java Objects普通老式的 Java 对象映射成数据库中的记录。
简单来说 MyBatis 其实就是对JDBC进行了封装它是更简单的完成程序和数据库交互的⼯具也就是更简单的操作和读取数据库工具。
所以我们使用 MyBatis 的时候需要创建 MapperDao层接口以及对应的xml文件也可以使用注解代替xml文件进行写 SQL 的方式但是 SQL 语句复杂的时候使用注解这种方式不太好实现且不太美观
MyBatis 在整个框架中的定位交互如下图 MyBatis 也是⼀个 ORM 框架ORMObject Relational Mapping即对象关系映射在面向 对象编程语⾔中将关系型数据库中的数据与对象建立起映射关系进而自动的完成数据与对象 的互相转换
将输⼊数据即传入对象 SQL 映射成原⽣ SQL将结果集映射为返回对象即输出对象
ORM 把数据库映射为对象
数据库表table– 类class记录record行数据– 对象object字段field -- 对象的属性attribute
⼀般的 ORM 框架会将数据库模型的每张表都映射为⼀个 Java 类也就是说使⽤ MyBatis 可以像操作对象⼀样来操作数据库中的表可以实现对象和数据库表之间的转换。
二. MyBatis项目的创建
1. 准备一个数据表
这里创建以下数据库和数据表。
-- 创建数据库
drop database if exists mycnblog2023;
create database mycnblog2023 DEFAULT CHARACTER SET utf8mb4;-- 使用数据数据
use mycnblog2023;-- 创建表[用户表]
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 mycnblog2023.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);下面的内容主要是对userinfo表进行操作演示目前执行上述 sql 后表内的数据如下
所以我们针对我们要操作的数据表还应该有对应的映射类userinfo 表对应一个 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;
}2. 创建项目
1️⃣第一步创建 SpringBoot 项目。
2️⃣第二步勾选上 MyBatis 相关依赖包括Mybatis Framework一定不能少和MySQL Driver看你使用的是哪个数据库就添加哪个。 3️⃣第三步项目创建好后此时如果我们直接启动项目是会报错的我们还需要在application配置文件中配置数据库数据源和 MyBatis xml文件保存路径其中这个xml文件是用来编写sql语句用的。
先配置数据库链接信息需要配置数据库的 url账号与密码以及驱动。
.properties文件格式
# 设置数据库的相关连接信息
spring.datasource.urljdbc:mysql://127.0.0.1:3306/mycnblog2023?characterEncodingutf8
spring.datasource.usernameroot
spring.datasource.password111111
# 版本8之前版本的数据库使用 com.mysql.jdbc.Driver
# 版本8以及之后版本的数据库使用 com.mysql.cj.jdbc.Driver
spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver.yml文件格式
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncodingutf8username: rootpassword: 111111driver-class-name: com.mysql.cj.jdbc.Driver接下来设置 MyBatis xml 文件的路径
.properties文件格式
# 设置 MyBatis XML 存放路径和命名格式
mybatis.mapper-locationsclasspath:mybatis/*Mapper.xml.yml文件格式
mybatis:mapper-locations: classpath:mybatis/*Mapper.xml其中*Mapper.xml表示只认Mapper.xml结尾的文件存放在资源文件resources的mybatis路径下。
如果需要更方便观察有关 sql 的运行情况还可以配置一些日志文件来显示 sql 相关的日志debug级别默认是不显示的
.properties文件格式
# 配置 MyBatis 执行时打印 SQL可选配置
mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl
logging.level.com.example.demodebug.yml文件格式
logging:level:com:example:demo: debug
mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl这样我们的项目就创建好了下面的内容介绍 MyBatis 的基本使用。
三. MyBatis的使用
1. 基本使用
MyBatis 的基本使用流程
创建一个使用注解Mapper修饰的接口用来给 Service 层调用该注解来自 MyBatis作用是与我们配置的Mapper.xml结尾的文件做连接。在该接口里面定义方法。在 xml 文件中按照 MyBatis 的规则编写 sql接口的具体实现xml 文件的作用是生成数据库可执行的 sql并且能将结果映射到程序的对象中。
1️⃣第一步我们定义接口该接口在软件分层中属于数据持久层所以我们定义在自建的dao包下也可定义为 mapper为了提高代码的可读性和规范性接口名称建议Mapper结尾。
Mapper
public interface UserMapper {//方法声明
}2️⃣第二步我们在该接口下声明方法由于该方法的目的就是为了被xml文件“实现”然后去操作数据库的比如我们需要所有查询User对象的结果我们声明一个getAll方法。
// 查询全部用户信息
ListUserInfo getAll();3️⃣第三步在配置文件所规定的目录下创建UserMapper.xml文件并加上下面的代码一般一个 xml 负责一个表的增删查改操作
?xml version1.0 encodingUTF-8?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.example.demo.mapper.UserMapper/mapper当我们要编写 sql 时需要在mapper标签里面写对应的标签来实现对数据库的操作比如查询使用select标签插入使用insert标签更新使用pudate标签删除使用delete标签等。
而在mapper标签中我们需要设置该mapper标签对应的接口在哪里就是在mapper标签头中设置namespace属性值为加包名的Mapper接口如
mapper namespacecom.example.demo.mapper.UserMapper
/mapper比如要查询全部用户信息其中标签头的id属性与要实现的方法名对应resultType表示需要映射的类是哪一个需要写出完整的包名这样就会将查询的结果存入到该类的对象中对对象数组中有一点是需要注意的那就是使用resultType映射对象一定得保证数据库中的字段名与对象中的属性名一模一样否则不能匹配赋值。
select idgetAll resultTypecom.example.demo.model.UserInfoselect * from userinfo
/select2. SpringBoot单元测试
完成上面的工作后我们可以使用单元测试验证我们写的代码是否符合预期。
1️⃣第一步我们在类中代码右键选择Generate选项比如我们在 Mapper 接口中生成单元测试的类我们就在右键选择Generate选项。 然后会跳出一个框选择 Test。
2️⃣第二步进行配置 Test和选择需要测试的方法。
3️⃣第三步第二步勾选上需要测试的方法后会在 test 目录下生成一个同级的目录会自动生成测试类和测试方法当然我们也能够手动创建创建的测试类就在原来类名最后加上一个Test即可。
单元测试的类创建在如图目录下
再完成以下步骤
配置单元测试的类在类上加上SpringBootTest注解这个一定不要忘记它的作用是告诉当前的测试程序当前的项目是运行在 SpringBoot 容器中。添加测试方法并加上Test注解通过注入 Mapper 对象调用里面操作数据库的方法进行单元测试。 执行单元测试测试通过结果如下
四. 使用MyBatis实现单表操作
上面已经创建好了 Mapper 接口和对应的 xml 文件了此时我们就可以开始写数据库 sql 的语句了先介绍基础使用完成对单表的 CRUD 操作。
1. 查询
1️⃣第一步在 Mapper 接口中声明一个方法比如通过用户id查询用户信息就可以声明一个方法getUserById。
UserInfo getUserById(Param(value id) Integer id);Param注解中的value参数值表示对变量重命名此时传入到 xml 文件中的变量名字就是设置的这个值建议该名字与数据库中的字段相对应并同名。
2️⃣第二步设置 xml 文件所映射的 Mapper 接口假设我们映射了一个如下图dao包中的UserMapper接口该接口一定要使用Mapper修饰否则就不是属于 MyBatis 中的“接口”不能与 xml 产生映射。 我们将mapper标签中的namespace设置为对应接口在项目目录下的带包全称。
mapper namespacecom.example.demo.mapper.UserMapper3️⃣第三步设置查询标签以及配置与方法的映射查询操作使用select标签查询标签至少设置两个属性第一个是id表示与哪一个方法相对应就是设置成相关联的方法的方法名比如我们在 Mapper 接口中的查询方法是getUserById则设置idgetUserById
然后设置resultType属性的值我们查询需要返回查询结果UserInfo对象如果可能有多个结果对应的方法返回值就写ListUserInfo否则写UserInfo即可resultType属性中只需要设置成带包名的类名即可。
select idgetUserById resultTypecom.example.demo.model.UserInfo4️⃣第四步在 mapper 标签中编写查询 sql查询 sql 对应的标签就是select标签如我们要查询id为1的用户那么标签里写的内容如下
select idgetUserById resultTypecom.example.demo.model.UserInfoselect * from userinfo where id1
/select但是这样写太 sql 就写死了代码没有通用性我们可以使用预处理符#{}或者替换符${}来将程序传入的参数替换到 sql 语句中
select idgetUserById resultTypecom.example.demo.model.UserInfoselect * from userinfo where id${id}//or select * from userinfo where id#{id}
/select其中id${id}相当于id传入的id变量的值比如id1则${id}会被替换为1使用该方法存在 SQL 注入的问题并且传入字符串等其他非数值类型可能会出现问题而id#{id}相当于id?相当于替换成一个占位符然后会将传入的id通过占位符的形式插入到 sql 语句中可以防止 SQL 注入问题并且适用于所有类型的变量关于这两者更多的介绍会在下一篇多表查询中介绍。
经过以上步骤我们的 sql 就写好了由于我们的id是唯一的所以查询到的结果也是唯一的我们以id1进行查询演示目前数据库的数据如下 然后我们再写单元测试代码进行验证
Test
void getUserById() {UserInfo userinfo userMapper.getUserById(1);System.out.println(userinfo.toString());
}结果如下 2. 修改
我们在 userinfo 表中再插入一条记录此时表中数据如下 现在我们演示如何使用 MyBatis 根据id修改对应用户名username其实和查询操作也差不多默认返回受影响的行数是基础类型此时我们是不用设置resultType的。
1️⃣第一步声明方法
// 根据 id 修改用户名
Integer updateName(Param(value id) Integer id, Param(value username) String username);2️⃣第二步在 xml 中写 sql修改操作使用update标签。
update idupdateName update userinfo set username#{username} where id#{id}
/update我们将id2的用户名修改为张三生成单元测试
Test
void updateName() {int result userMapper.updateName(2, 张三);System.out.println(受影响行数: result);
}结果如下
再来验证一下数据库中的数据是否完成了修改 结果是符合我们的预期的实际上单元测试是不应该去影响数据库中的数据的我们可以在单元测试方法上使用Transactional注解这样就可以防止污染数据库实现原理是利用了数据库事务的回滚比如 执行单元测试 此时数据库是没有发生修改的原因是Transactional注解进行了事务的回滚但是自增主键不会进行回滚比如你进行了id为3用户插入操作事务回滚了下一次插入自增主键id的值为4 这也是使用单元测试不会污染数据库的原因所在。
3. 删除
删除其实和查询修改也是一样的我们来演示将id为2的数据删除。 1️⃣第一步声明方法
// 根据id删除用户
public Integer delById(Param(value id) Integer id);2️⃣第二步在 xml 文件编写 sql删除操作使用delete标签
delete iddelByIddelete from userinfo where id#{id}
/delete3️⃣第三步编写单元测试验证
Testvoid delById() {int result userMapper.delById(2);System.out.println(受影响行数: result);}4️⃣第四步查询单元测试结果验证数据库
4. 新增
该操作相比于之前的查询修改和删除操作要复杂一点但其实也差不多为了提高代码的通用性我们声明方法中的形参传入一个UserInfo对象。
首先我们来演示插入一条数据返回一个受影响的行数。
1️⃣第一步声明方法
// 添加用户返回影响行数
Integer add(UserInfo userInfo);2️⃣第二步编写 sql 语句插入操作使用insert标签。
insert idaddinsert into userinfo(username, password, photo) values (#{username}, #{password},#{photo});
/insert3️⃣第三步编写并执行单元测试验证数据库。
Test
void add() {UserInfo userInfo new UserInfo();userInfo.setUsername(老六);userInfo.setPassword(666);int result userMapper.add(userInfo);System.out.println(受影响行数: result);
}单元测试结果 数据库查询结果 其实Mybatis 也可以返回多个参数比如返回受影响的行数和自增id的值这个时候我们就需要对xml的insert标签进行配置。
前面声明方法还是需要的
Integer addGetId(UserInfo userInfo);xml 的insert标签中还需要设置useGeneratedKeystrue表示为是否自增主键keyPropertyid表示自增主键是哪一个字段。
insert idaddGetId useGeneratedKeystrue keyPropertyid keyColumnidinsert into userinfo(username, password, photo) values (#{username}, #{password},#{photo});
/insert单元测试方法
Test
void addGetId() {UserInfo userInfo new UserInfo();userInfo.setUsername(老八);userInfo.setPassword(888);userInfo.setPhoto(default.png);System.out.println(插入之前的id userInfo.getId());int result userMapper.addGetId(userInfo);System.out.println(插入之后的id userInfo.getId());System.out.println(受影响行数: result);
}单元测试结果
数据库查询结果
五. 基于注解完成SQL
这个其实很简单使用配置文件我们需要在指定路径创建配置文件实现具体接口的执行 sql而使用注解实现 sql直接在对应接口上面加上对应操作的注解括号里面的属性填好 sql 属性即可。
对应操作注解也就对应 SQL 的增删查改分别为
Select查询Update更新/修改Delete删除Insert插入/新增
我们来简单针对数据表演示一个查询操作
1️⃣第一步声明一个方法getAllUser()
// 基于注解查询全部用户
ListUserInfo getAllUser();2️⃣第二步使用Select实现具体的 sql 操作。 单元测试代码
Test
void updateName() {int result userMapper.updateName(2, 张三);System.out.println(受影响行数: result);
}结果如下 其他注解使用起来也是一样的就不在这里赘述了。