目录
前置条件
xml与注解比较
1.1 xml定义
1.2 和SQL注解比较
建包准备
插入数据
编辑 更新数据
删除数据
查询数据
查看单字段查询
🏷💣前置条件
创建一个spring boot 初始化的项目
🏷💣xml与注解比较
1.1 xml定义
XML是一种可扩展性语言,用户可以自己定义标签,用来描述特定类型的数据;
XML的语法严格,每个标签都必须有一个结束标签,标签的嵌套关系也必须合法;
1.2 和SQL注解比较
-
xml配置SQL,可以将SQL语句和JAVA代码分离开
-
xml配置SQL,支持动态SQL语句
-
xml配置SQL,支持SQL语句的复用
xml是属于外部文件属性,所以需要在application.properties中添加配置
这边新建mappers的包用于装xml文件
这边需要引入一个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="指定的@Mapper映射的接口的具体路径">
</mapper>
💣建包准备
一个实体类包 这边是 pojo.entity包
数据库的字段名 | User实体类对应的属性 |
---|---|
id | private Long id |
username | private String username |
password | private String password |
nickname | private String nickname |
created | private Date created |
一个@Mapper映射接口的包 mapper包
一个VO类包(返回数据库查询字段值的属性) pojo.vo包
📢流程
定义接口方法 ->编写xml 文档->测试
我们先写一个UserMapper映射的接口
1.注意必须加@Mapper否则会找不到对应的bean对象
2.这时候不需要加相关的sql注解
package cn.tedu.demoforcsdn.mappers;
import cn.tedu.demoforcsdn.pojo.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper {
//插入数据
int insertUser(User user);
}
编写xml文档
复制完整路径 快捷键是 Ctrl+Alt+Shift+c
namespae 是@Mapper接口的具体路径
id 是接口方法的名称
sql 语句
语法格式 | 操作的意义 |
---|---|
<insert id="接口方法">INSERT INTO 表 字段名 Values 值</insert> | 插入数据 |
<update id="接口方法">UPDATE 表名 <set><if test="判断条件">设置语句</if></set> WHERE 字段名=值</update> | 更新数据 |
<delete id="接口方法"> DELETE FROM 表名 WHERE 字段名=值</delete> | 删除数据 |
<select id ="接口方法" resultType="返回的封装实体类VO">SELECT 字段名 FROM 表名 (看情况) WHERE 字段名=值</select> | 查询数据 |
✈🚀插入数据
<?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="cn.tedu.demoforcsdn.mappers.UserMapper">
<insert id="insertUser">
INSERT INTO user (username,password,nickname,created) VALUES (#{username},#{password},#{nickname},#{created})
</insert>
</mapper>
这边在去Test进行测试(上次将mybatis基础知识点讲过测试类测试 写文章-CSDN创作中心)
package cn.tedu.demoforcsdn;
import cn.tedu.demoforcsdn.mappers.UserMapper;
import cn.tedu.demoforcsdn.pojo.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Date;
@SpringBootTest
class DemoForCsdnApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
}
@Test
void insertUser(){
User user = new User();
user.setUsername("赵四");
user.setPassword("123456");
user.setNickname("老四");
user.setCreated(new Date());
System.out.println(userMapper.insertUser(user));
}
测试结果
数据库结果
✈🚀 更新数据
接口方法
int updateUserByUsername(UserUpdateVO userUpdateVO);
这边我只需要返回 nickname,username,password
这边我定义了一个vo类用于接受数据库的返回值
数据库的字段名 | userUpdateVo类的属性值 |
---|---|
username | private String username |
password | private String password |
nickname | private String nickname |
xml 编写
引入新的概念
<set> 标签
<set> 标签用于包裹 UPDATE 语句的 SET 部分,并自动处理字段间的逗号分隔。如果在动态生成的 SQL 语句中最后一个 <if> 条件不满足,那么 <set> 标签会自动移除最后一个多余的逗号,这可以避免 SQL 语法错误。
注意处理多字段必须以逗号分割,必须写WHERE
<if> 标签
<if> 标签用于条件判断。它根据 test 属性的值来决定是否包含其内部的 SQL 片段。如果 test 属性的值为 true,则包含该 SQL 片段;如果为 false,则忽略该片段。
<update id="updateUserByUsername">
UPDATE user
<set>
<if test="password!=null">password=#{password},</if>
<if test="nickname!=null">nickname=#{nickname}</if>
</set>
WHERE username =#{username};
</update>
测试
@Test
void updateUser(){
UserUpdateVO userUpdateVO = new UserUpdateVO();
userUpdateVO.setUsername("赵四");
userUpdateVO.setPassword("abcdf");
userUpdateVO.setNickname("扛把子");
System.out.println(userMapper.updateUserByUsername(userUpdateVO));
}
运行结果
数据库状态
✈🚀删除数据
接口方法
int deleteUserByUsername(String username);
xml
<delete id="deleteUserByUsername">
DELETE FROM user WHERE username=#{username}
</delete>
测试
@Test
void deleteUserByUsername(){
System.out.println(userMapper.deleteUserByUsername("赵四"));
}
运行结果
✈🚀查询数据
🚏查看单字段查询
接口方法
UserUpdateVO selectByUsername(String username);
xml
resultType
resultType 的主要作用是将 SQL 查询结果集中的每一行数据映射到指定的 Java 类型对象上。当 MyBatis 执行查询操作并获取到结果集后,它会根据 resultType 指定的类型,自动将结果集中的每一行数据转换(或映射)为相应的 Java 对象。
注意:写<select> sql语句会返回结果集,我们需要接受结果集 常用resultType接受
resultType填写的是结果集,我这边返回的是个封装的数据库返回的实体类,其包括 password,nickname,username
<select id="selectByUsername" resultType="cn.tedu.demoforcsdn.pojo.vo.UserUpdateVO">
SELECT password,nickname,username FROM user WHERE username=#{username}
</select>
测试
@Test
void selectUserByUsername(){
System.out.println(userMapper.selectByUsername("张三"));
}
运行结果
🚏多字段查询待补充