MyBatis——增删查改(XML 方式)

1. 查询

1.1. 简单查询

使用注解的方式主要是完成一些简单的增删查改功能,如果要实现复杂的 SQL 功能,还是建议使用 XML 来配置映射语句,将 SQL 语句写在 XML 配置文件中

如果要操作数据库,需要做以下的配置,与注解方式不同的是,还需要配置一下 XML 文件的路径,这样才能获取其中的配置信息

spring:
  application:
   name: mybatis-demo
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  # 配置 mybatis xml 的文件路径,在 resources/mapper 创建所有表的 xml 文件
  mapper-locations: classpath:mapper/**Mapper.xml
  configuration: # 配置打印 MyBatis日志
  log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

**Mapper.xml 表示以 Mapper.xml 结尾的文件

然后就是写持久层代码:

java 复制代码
@Mapper
public interface UserInfoXmlMapper {
    List<UserInfo> selectAll();
}

XML 配置的方式就不需要把 SQL 语句写在这里了,接下来看怎么配置 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="com.example.mybatisdemo.mapper.UserInfoXmlMapper">

  <select id="selectAll" resultType="com.example.mybatisdemo.model.UserInfo">
    //查询语句
    select * from user_info
  </select>
</mapper>

1.2. 驼峰转化问题

接下来看一下 XML 中是怎么解决的

第一种还是在 SQL 语句中设置别名的方式

XML 复制代码
<select id="selectAll" resultType="com.example.mybatisdemo.model.UserInfo">
  select id,username,password,age,gender,phone,
  delete_flag as deleteFlag,
  create_time as createTime,
  update_time as updateTime
  from user_info
</select>

来看第二种方式:

XML 复制代码
<resultMap id="BashMap" type="com.example.mybatisdemo.model.UserInfo">
  <id property="id" column="id"></id>
  <result property="deleteFlag" column="delete_flag"></result>
  <result property="createTime" column="create_time"></result>
  <result property="updateTime" column="update_time"></result>
</resultMap>

<select id="selectAll" resultMap="BashMap">
  select id,username,password,age,gender,phone,
  delete_flag,
  create_time,
  update_time
  from user_info
</select>

id属性指定了这个resultMap的唯一标识符为 BashMap,type 后面表示这个结果映射到对应的 java 对象的类型

<id property="id" column="id"></id>:这一行定义了如何将数据库表中的 "id" 列的值映射到UserInfo对象的 "id" 属性上,虽然说写不写都可以,但是建议还是写上,同时,其他 java 对象的属性名和 MySQL 中的字段对应的也建议写上

第三种方式还是通过配置来实现驼峰自动转换,和注解那里是一样的

XML 复制代码
mybatis:
  configuration:
    map-underscore-to-camel-case: true #配置驼峰自动转换

1.3. 多表查询

由于是多表查询,所以也要创建第二个表的对象

java 复制代码
@Data
public class ArticleInfo {
    private Integer id;
    private String title;
    private String content;
    private Integer uid;
    private Integer deleteFlag;
    private Date createTime;
    private Date updateTime;
}

再来看持久层代码

java 复制代码
@Mapper
public interface ArticleInfoMapper {
    @Select("select ta.id,ta.title, ta.content, ta.uid, tb.username, tb.password from article_info ta " +
            "left join user_info tb on ta.uid = tb.id " +
            "where ta.id = #{id} ")
    ArticleInfo selectArticleInfoAndUserInfo(Integer id);
}

但是上面由于获取了两个表的信息,但是返回值是ArticleInfo的对象,所以涉及到UserInfo的信息是没有被赋值的:

Mybatis 是把 SQL 查询到的信息根据参数的映射来赋值的,只需要把ArticleInfo的属性加上这些就可以赋值了

2. 增加

和注解方式的代码类似

先来看持久层代码:

定义好接口,通过传入对象的方式来传参

java 复制代码
@Mapper
public interface UserInfoXmlMapper {
    Integer insertUser(UserInfo userInfo);
}

和上面的查询不同的是,这里不用再配置返回值类型,要写的 SQL 语句和注解方式一样,这里也是通过#{}来传参的

XML 复制代码
<insert id="insertUser">
  insert into user_info(username, password, age, gender)
  values (#{username}, #{password}, #{age}, #{gender})
</insert>

再来看传入的参数是对象时的重命名:

Integer insertUser2(@Param("userInfo") UserInfo userInfo);

这时 XML 中的 SQL 语句中的参数也是和注解方式一样,通过对象名. 的方式来表示参数

XML 复制代码
<insert id="insertUser2">
  insert into user_info(username, password, age, gender)
  values (#{userInfo.username}, #{userInfo.password}, #{userInfo.age}, #{userInfo.gender})
</insert>

不用对象名. 的方式就会出现绑定异常

关于使用传递对象方式参数重命名要通过对象名. 的方式表示参数的原因:

  1. 当方法有且仅有一个参数(比如 UserInfo 对象)时,可以不用 @Param 注解直接传入对象。这种情况下,在 XML 中可以直接通过 #{属性名} 的方式引用对象的属性,因为 MyBatis 能直接识别这个参数是一个对象。
  2. 当为这个唯一参数加上 @Param 注解(比如 @Param("userInfo")),MyBatis 就会用 userInfo 作为这个参数的别名 。MyBatis 会将传入的 UserInfo 对象视为一个名为 userInfo 的封装对象。这样,XML 中的引用就需要带上这个别名前缀(userInfo.),从而确保引用的是这个封装对象下的属性

这一点和注解方式是一样的

3. 修改

先来看持久层代码:

java 复制代码
@Mapper
public interface UserInfoXmlMapper {
    Integer updateUser(Integer id,String password);
}

XML 中还是一样的,也是不用配置返回值,然后直接写 SQL 语句

XML 复制代码
<update id="updateUser">
  update user_info set password = #{password} where id = #{id}
</update>

4. 删除

删除和修改也是类似的

持久层代码:

java 复制代码
@Mapper
public interface UserInfoXmlMapper {
    Integer deleteUserById(Integer id);
}

XML配置:

XML 复制代码
<delete id="deleteUserById">
  delete from user_info where id = #{id};
</delete>

我的主页

相关推荐
liuxin3344556636 分钟前
高效编程训练:Spring Boot系统设计与实践
数据库·spring boot·php
地图之家家长2 小时前
19.(开发工具篇mysql库)mysql锁表问题解决
数据库·mysql
秋意钟4 小时前
Java注解
数据库
看山还是山,看水还是。5 小时前
Oracle的字符串函数
运维·数据库·安全·oracle
东方巴黎~Sunsiny5 小时前
⚙️ 如何调整重试策略以适应不同的业务需求?
java·数据库·kafka
daopuyun5 小时前
全面介绍软件安全测试分类,安全测试方法、安全防护技术、安全测试流程
网络·数据库·安全·安全测试
綦枫Maple6 小时前
Jmeter基础篇(23)TPS和QPS的异同
数据库·jmeter·oracle
川石课堂软件测试6 小时前
性能测试|JMeter接口与性能测试项目
javascript·数据库·python·jmeter·单元测试
oneslide6 小时前
达梦数据库迁移j脚本
数据库