MyBatis入门——MyBatis XML配置文件(3)

news2024/11/20 12:25:56

目录

一、配置连接字符串和MyBatis

二、写持久层代码

1、添加 mapper 接口

2、添加 USerInfoXmlMapper.xml

3、测试类代码

三、增删改查操作

1、增(Insert)

返回自增 id

2、删(Delete)

3、改(update)

4、查(select)

(1)起别名

(2)结果映射

(3)开启驼峰命名


        MyBatis的开发有两种方式:1、注解  2、XML。使用MyBatis的注解方式,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,也就是将SQL语句写在XML配置文件中。

        MyBatis XML开发的方式需要以下两步:1、配置数据库连接字符串和MyBatis。2、写持久层代码

        准备代码:实体类:

@Data
public class UserInfo {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private Integer gender;
    private String phone;
    private Integer deleteFlag;
    private Date createTime;
    private Date updateTime;
}

一、配置连接字符串和MyBatis

        此步骤需要进行两项设置,数据库连接字符串设置和MyBatis的XML文件配置。如果是application.yml,配置内容如下:

#数据库配置
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
    username: root
    password: 1234
    driver-class-name: com.mysql.cj.jdbc.Driver
# 设置 Mybatis 的 xml 保存路径
mybatis:
  # 配置 mybatis xml 的⽂件路径,在 resources/mybatis 创建所有表的 xml ⽂件
  mapper-locations: classpath:mybatis/*Mapper.xml

        如果是application.properties文件,配置内容如下:

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_test?
characterEncoding=utf8&useSSL=false
#连接数据库的⽤⼾名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=root
# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mybatis.mapper-locations=classpath:mapper/**Mapper.xml

二、写持久层代码

      持久层代码分两部分:1、方法定义 Interface  2、方法实现:XXX.xml

1、添加 mapper 接口

        创建一个mapper包,再这个包下创建USerInfoXmlMapper接口,如图:

        USerInfoXmlMapper接口代码如下:

import com.example.mybatisxmldemo2.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface USerInfoXmlMapper {
    Integer insert(UserInfo userInfo);
}

2、添加 USerInfoXmlMapper.xml

        在result包下创建mybatis包,在mybatis包下创建 USerInfoXmlMapper.xml 文件,如图:

        其中,创建 USerInfoXmlMapper.xml 的路径参考 yml中的配置,如图:

        USerInfoXmlMapper.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.mybatisxmldemo2.mapper.USerInfoXmlMapper">
    <select id="select" resultType="com.example.mybatisxmldemo2.model.UserInfo">
        select * from userinfo
    </select>
</mapper>

        以下是对上面标签的说明:

<mapper>标签需要指定 namespace 属性,表示命名空间,值为 mapper 接口的全限定名,包括全包名.类名

<select>查询标签是用来执行数据库的查询操作的

        id是和 Interface (接口) 中定义的方法名称一样的,表示对接口的具体实现方法

        resultType是返回的数据类型(使用全限定名),也就是开头我们定义的实体类

        各标签的对应关系,如图:

3、测试类代码

@SpringBootTest
class USerInfoXmlMapperTest {
    @Autowired
    private USerInfoXmlMapper uSerInfoXmlMapper;

    @Test
    void select() {
        System.out.println(uSerInfoXmlMapper.select());
    }
}

        userinfo表如图:

        运行结果如下:

        能对应得上


三、增删改查操作

1、增(Insert)

        UserInfoXmlMapper接口代码:

@Mapper
public interface USerInfoXmlMapper {
    Integer insert(UserInfo userInfo);
}

        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.mybatisxmldemo2.mapper.USerInfoXmlMapper">
    <insert id="insert">
        insert into userinfo (username, password, age, gender)values (#{username}, #{password}, #{age}, #{gender})
    </insert>
</mapper>

        测试类代码:

@SpringBootTest
class USerInfoXmlMapperTest {
    @Autowired
    private USerInfoXmlMapper uSerInfoXmlMapper;
    @Test
    void insert() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("zhaoliu");
        userInfo.setPassword("zhaoliu");
        userInfo.setAge(20);
        userInfo.setGender(1);
        System.out.println(uSerInfoXmlMapper.insert(userInfo));
    }
}

        测试类运行结果如下:

        也可以使用@Param注释设置接口参数名称,使用方法和注解类似,UserInfoXmlMapper代码如下:

@Mapper
public interface USerInfoXmlMapper {
    Integer insert2(@Param("userInfo") UserInfo userInfo);
}

        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.mybatisxmldemo2.mapper.USerInfoXmlMapper">
    <insert id="insert2">
        insert into userinfo (username, password, age, gender)values (#{userInfo.username}, #{userInfo.password}, #{userInfo.age}, #{userInfo.gender})
    </insert>
</mapper>

返回自增 id

        接口代码如下:

@Mapper
public interface USerInfoXmlMapper {
    Integer insert(UserInfo userInfo);
}

        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.mybatisxmldemo2.mapper.USerInfoXmlMapper">
    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
        insert into userinfo (username, password, age, gender)values (#{username}, #{password}, #{age}, #{gender})
    </insert>
</mapper>

2、删(Delete)

        接口代码如下:

@Mapper
public interface USerInfoXmlMapper {
    Integer delete(Integer id);
}

        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.mybatisxmldemo2.mapper.USerInfoXmlMapper">
    <delete id="delete">
        delete from userinfo where id = #{id}
    </delete>
</mapper>

        测试类代码如下:

@SpringBootTest
class USerInfoXmlMapperTest {
    @Autowired
    private USerInfoXmlMapper uSerInfoXmlMapper;
    @Test
    void delete() {
        System.out.println(uSerInfoXmlMapper.delete(13));
    }
}

        运行测试类前表的内容:

        运行测试类后,结果如下:

3、改(update)

        接口类代码如下:

@Mapper
public interface USerInfoXmlMapper {
    Integer update(UserInfo userInfo);
}

        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.mybatisxmldemo2.mapper.USerInfoXmlMapper">
    <update id="update">
        update userinfo set username = #{username} where id = {#id}
    </update>
</mapper>

        测试类代码如下:

@SpringBootTest
class USerInfoXmlMapperTest {
    @Autowired
    private USerInfoXmlMapper uSerInfoXmlMapper;
    @Test
    void update() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("xxxxx");
        userInfo.setId(4);
        uSerInfoXmlMapper.update(userInfo);
    }
}

        运行测试类前表的内容如下:

        运行测试类后,结果如下:

4、查(select)

        使用XML的方式进行查询,也会存在数据封装的问题(前面的没有是因为我在xml文件配置了开启驼峰命名),现在进行SQL查询

        接口代码如下:

@Mapper
public interface USerInfoXmlMapper {
    List<UserInfo> select2();
}

        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.mybatisxmldemo2.mapper.USerInfoXmlMapper">
    <select id="select2" resultType="com.example.mybatisxmldemo2.model.UserInfo">
        select * from userinfo
    </select>
</mapper>

        测试类代码如下:

@SpringBootTest
class USerInfoXmlMapperTest {
    @Autowired
    private USerInfoXmlMapper uSerInfoXmlMapper;
    @Test
    void select2() {
        System.out.println(uSerInfoXmlMapper.select2());
    }
}

        运行结果如下:

        这三个属性内容还是null,解决办法和注解类似(1、3和注解一样,2不一样),有三种:1、起别名  2、结果映射  3、开启驼峰命名

(1)起别名

        接口类:

@Mapper
public interface USerInfoXmlMapper {
    List<UserInfo> select3();
}

        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.mybatisxmldemo2.mapper.USerInfoXmlMapper">
    <select id="select3" resultType="com.example.mybatisxmldemo2.model.UserInfo">
        select id, username, password, age, gender, phone, delete_flag as deleteFlag, create_time as createTime, update_time as updateTime from userinfo
    </select>
</mapper>

        测试类代码:

@SpringBootTest
class USerInfoXmlMapperTest {
    @Autowired
    private USerInfoXmlMapper uSerInfoXmlMapper;
    @Test
    void select3() {
        System.out.println(uSerInfoXmlMapper.select3());
    }
}

        运行结果如下:

        上面三个属性不为null了。

(2)结果映射

        接口类代码:

@Mapper
public interface USerInfoXmlMapper {
    List<UserInfo> select4();
}

        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.mybatisxmldemo2.mapper.USerInfoXmlMapper">
    <resultMap id="BaseMap" type="com.example.mybatisxmldemo2.model.UserInfo">
        <id column="id" property="id"></id> <!--主键-->
        <result column="username" property="username"></result>
        <result column="age" property="age"></result>
        <result column="gender" property="gender"></result>
        <result column="phone" property="phone"></result>
        <result column="delete_flag" property="deleteFlag"></result>
        <result column="create_time" property="createTime"></result>
        <result column="update_time" property="updateTime"></result>
    </resultMap>

    <select id="select4" resultMap="BaseMap">
        select * from userinfo
    </select>
</mapper>

        测试类代码如下:

@SpringBootTest
class USerInfoXmlMapperTest {
    @Test
    void select4() {
        System.out.println(uSerInfoXmlMapper.select4());
    }
}

        运行结果如下:

        其中那三个属性不为null了。

(3)开启驼峰命名

        yml文件内容如下:

mybatis:
  # 配置 mybatis xml 的⽂件路径,在 resources/mybatis 创建所有表的 xml ⽂件
  mapper-locations: classpath:mybatis/*Mapper.xml
  configuration: # 配置打印 MyBatis日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true #配置驼峰自动转换

        之后就会自动进行驼峰转换,不用额外起别名或者结果映射了。

        开发中使用注解还是XML的方式?关于开发中使用哪种模式,没有明确答案。仁者见仁,智者见智,没有统一的标准,更多是取决于你的团队或者项目经理、项目负责人。


五、常见问题

        yml配置路径错了:

        方法名称不一致:

        xml配置文件路径不正确:

        上面这些错误,都会造成以下报错内容:(绑定失败)

解决方案:

1确认yml配置的路径是否正确

2确认方法名称是佛一致

3确认xml配置的文件路径是否正确

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1683044.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】-Tomcat安装部署[12]

目录 简介 安装 安装部署JDK环境 解压并安装Tomcat 简介 Tomcat是由Apache开发的一个Servlet容器&#xff0c;实现了对Servlet和JSP的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 简单来说&#…

嵌入式学习——3——IO分类模型

1、阻塞IO和非阻塞IO 1.1 阻塞IO - 在阻塞IO模型中&#xff0c;当一个IO操作&#xff08;如读取或写入&#xff09;开始时&#xff0c;如果数据没有准备好&#xff0c;程序会被挂起&#xff08;即阻塞&#xff09;&#xff0c;直到数据准备好并且IO操作完成。 - 在数据准备阶段…

sql server【 特定分隔符隔开的字符串转表】和【 列转逗号隔开的字符串】

文章目录 引言I 特定分隔符隔开的字符串转表II Sql Server 列转逗号隔开的字符串2.1 多列转行,逗号分隔(字段拼接/字段分割)2.1 案例引言 Sql Server 列转逗号隔开的字符串 和 逆转,常用于数据导出和数据查询。 I 特定分隔符隔开的字符串转表 CREATE FUNCTION [dbo].[GetIDLi…

LitCTF

[LitCTF 2023]enbase64 base 64 里面有一个换表的函数 写代码 #include<stdio.h> #include<string.h> #include<stdlib.h> int main() {char *result; char Destination[65]; int v3[65];int j;int i; char Source[]"ABCDEFGHIJKLMNOPQRSTUVWXYZabcde…

【配置】雷池WAF社区版安装

官方文档点击跳转 什么是雷池 雷池&#xff08;SafeLine&#xff09;是长亭科技耗时近 10 年倾情打造的 WAF&#xff0c;核心检测能力由智能语义分析算法驱动。 什么是 WAF WAF 是 Web Application Firewall 的缩写&#xff0c;也被称为 Web 应用防火墙。 区别于传统防火墙…

MySql--SQL语言

目录 SQl---DDL 结构定义 创建、删除 数据库 代码 运行 设计表 数据类型 整数 浮点数 主键 约束 主键自增长 默认值 字段注释 创建、删除 表 代码 运行 代码 代码 运行 SQL---DML 数据操纵 插入数据 代码 运行 代码 运行 代码 运行 代码 …

sqlserver查看索引碎片,并整理

DBCC SHOWCONTIG WITH ALL_INDEXES --查看所有表的索引碎片情况 DBCC SHOWCONTIG(fq_viewvform) --指定表索引碎片情况 dbcc dbreindex(fq_viewvform) --重建表索引 DBCC SHOWCONTIG(fq_viewvform) --检查重建后表索引碎片情况 查看全库索引碎片情况&#xff1a; 查看单表索引…

H800基础能力测试

H800基础能力测试 参考链接A100、A800、H100、H800差异H100详细规格H100 TensorCore FP16 理论算力计算公式锁频安装依赖pytorch FP16算力测试cublas FP16算力测试运行cuda-samples 本文记录了H800基础测试步骤及测试结果 参考链接 NVIDIA H100 Tensor Core GPU Architecture…

中国医学健康管理数字化发展风向标——专家共话未来趋势

随着科技的飞速发展&#xff0c;数字化已经成为中国医学健康管理领域的重要发展方向。 2024年5月20日由中国管理科学研究院智联网研究所、中国民族医药协会医养教育委员会、国家卫健委基层健康服务站、中国老龄事业发展基金会、中国智联网健康管理系统平台、中国医学健康管理数…

Postman进阶功能-集合分支管理与编写接口文档

大家好&#xff0c;在接口测试的领域中&#xff0c;我们不断追求更高效、更便捷、更强大的方法与工具。而 Postman 作为一款备受青睐的接口测试工具&#xff0c;其进阶功能更是为我们打开了新的天地。在这其中&#xff0c;集合分支管理与编写接口文档的功能显得尤为重要。 当面…

向上调整建堆与向下调整建堆的时间复杂度 AND TopK问题

目录 前言建堆的时间复杂度TOPK问题总结 前言 本篇旨在介绍使用向上调整建堆与向下调整建堆的时间复杂度. 以及topk问题 博客主页: 酷酷学!!! 感谢关注~ 建堆的时间复杂度 堆排序是一种优于冒泡排序的算法, 那么在进行堆排序之前, 我们需要先创建堆, 为什么说堆排序的是优于…

网络模型-VLAN聚合

VLAN聚合 VLAN聚合(VLAN Aggregation,也称SuperVLAN)指在一个物理网络内&#xff0c;用多个VLAN(称为Sub-VLAN)隔离广播域并将这些Sub-VLAN聚合成一个逻辑的VLAN(称为SuperVLAN)&#xff0c;这些Sub-VLAN使用同一个IP子网和缺省网关&#xff0c;&#xff0c;进而达到节约IP地址…

leetcode_2024年5月19日10:51:26

238.除自身以外各元素的乘积 给你一个整数数组nums&#xff0c;返回数组answer&#xff0c;其中answer[i]等于nums中除nums[i]之外其余各元素的乘积。 题目数据保证数组nums之中任意元素的全部前缀元素和后缀的乘积都在32位整数范围内。 请不要使用除法&#xff0c;且在o&am…

Go 切片常用操作与使用技巧

1.什么是切片 在 Go 语言中的切片&#xff08;slice&#xff09;是一种灵活的动态数组&#xff0c;它可以自动扩展和收缩&#xff0c;是 Go 语言中非常重要的数据结构之一。切片是基于数组实现的&#xff0c;它的底层是数组&#xff0c;可以理解为对底层数组的抽象。它会生成一…

智能车竞赛指南:从零到一,驶向自动驾驶的未来

智能车竞赛指南&#xff1a;从零到一&#xff0c;驶向自动驾驶的未来 一、智能车竞赛概览1.1 竞赛介绍1.2 竞赛分类 二、智能车开发技术基础2.1 硬件平台2.2 软件开发 三、实战案例&#xff1a;循线小车开发3.1 系统架构3.2 代码示例 四、技术项目&#xff1a;基于ROS的视觉导航…

一款功能强大的安卓虚拟机应用——VMOS Pro使用分享

前段时间我刚刚分享一个WeChat平板模块能够允许用户自由修改系统设置&#xff0c;让你的Android备用手机焕发新生&#xff0c;实现手机PAD化&#xff0c;实现两台设备同时登录微信号。今天我分享的这个相比WeChat更为简单&#xff0c;因为它可以通过虚拟机的方式进行多种androi…

【Numpy】深入解析numpy.diag()函数

numpy.diag()&#xff1a;深入探索NumPy库中的对角矩阵操作 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f3…

MGRE实验——路由配置

对134环回 ping一下发现都可以通 配置3&#xff0c;4同3 再注册 然后内网要互通&#xff0c;起rip 宣告1的左边和右边 对3 对4 当3&#xff0c;4之间要互通时&#xff0c;首先在1上 关闭之后&#xff0c;3就能学到4上的用户网段&#xff0c;4也能学到3 局域网要访问广域网一定…

Web 3D 框架简介

前言 3D游戏引擎的历史可以追溯到20世纪80年代末和90年代初。当时,计算机技术迅速发展,人们开始对图形和游戏感兴趣。以下是3D游戏引擎的历史故事: 早期引擎的诞生(1980-1990年代) 在这个时期,一些早期的3D游戏引擎开始出现。其中一个著名的例子是id Software开发的Do…

单细胞分析(Signac): PBMC scATAC-seq 聚类

引言 在本教学指南中&#xff0c;我们将探讨由10x Genomics公司提供的人类外周血单核细胞&#xff08;PBMCs&#xff09;的单细胞ATAC-seq数据集。 加载包 首先加载 Signac、Seurat 和我们将用于分析人类数据的其他一些包。 if (!requireNamespace("EnsDb.Hsapiens.v75&qu…