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

目录

一、配置连接字符串和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=falseusername: rootpassword: 1234driver-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 {@Autowiredprivate USerInfoXmlMapper uSerInfoXmlMapper;@Testvoid 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 {@Autowiredprivate USerInfoXmlMapper uSerInfoXmlMapper;@Testvoid 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 {@Autowiredprivate USerInfoXmlMapper uSerInfoXmlMapper;@Testvoid 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 {@Autowiredprivate USerInfoXmlMapper uSerInfoXmlMapper;@Testvoid 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 {@Autowiredprivate USerInfoXmlMapper uSerInfoXmlMapper;@Testvoid 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 {@Autowiredprivate USerInfoXmlMapper uSerInfoXmlMapper;@Testvoid 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 {@Testvoid select4() {System.out.println(uSerInfoXmlMapper.select4());}
}

        运行结果如下:

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

(3)开启驼峰命名

        yml文件内容如下:

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

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

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


五、常见问题

        yml配置路径错了:

        方法名称不一致:

        xml配置文件路径不正确:

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

解决方案:

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

2确认方法名称是佛一致

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

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

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

相关文章

软考--试题六--中介者模式(Mediator)

中介者模式(Meditor) 意图 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互 结构 适用性 1、一组对象以定义良好但是复杂的方式进行通信&#xff0c;产生的相互依赖关…

民国漫画杂志《时代漫画》第17期.PDF

时代漫画17.PDF: https://url03.ctfile.com/f/1779803-1248612629-85326d?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;

力扣HOT100 - 1143. 最长公共子序列

解题思路&#xff1a; 动态规划 class Solution {public int longestCommonSubsequence(String text1, String text2) {int m text1.length(), n text2.length();int[][] dp new int[m 1][n 1];for (int i 1; i < m; i) {char c1 text1.charAt(i - 1);for (int j 1…

深度学习之基于YoloV5的动物识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与目标 在生态研究、动物保护、以及畜牧业等多个领域&#xff0c;对动物进行准确、高效的识别都具有重…

形态学操作:腐蚀、膨胀、开闭运算、顶帽底帽变换、形态学梯度区别与联系

一、总述相关概念 二、相关问题 1.形态学操作中的腐蚀和膨胀对图像有哪些影响&#xff1f; 形态学操作中的腐蚀和膨胀是两种常见的图像处理技术&#xff0c;它们通过对图像进行局部区域的像素值替换来实现对图像形状的修改。 腐蚀操作通常用于去除图像中的噪声和细小的细节&a…

单链表oj

练习 1. 删除val节点 oj链接 这道题最先想出来的方法肯定是在遍历链表的同时删除等于val的节点&#xff0c;我们用第二中思路:不等于val的节点尾插&#xff0c;让后返回新节点。代码如下&#xff1a; struct ListNode* removeElements(struct ListNode* head, int val) {str…

软考高级-信息系统项目管理师案例题选择题做题总结

1.不应该只会建立变更和配置管理的规则&#xff0c;应该建立变更控制流程 2.变更的影响不应该只由工程师评估 3.没有对变更和修改进行记录 4.变更完成后&#xff0c;客户没有对变更进行验证 5.变更没有通知相关人员 6.变更没有和配置管理关联 7.项目变更管理的工作流程&#xf…

SOLIDWORKS科研版的介绍

SOLIDWORKS科研版的介绍 针对研究项目充分利用软件功能&#xff0c;无任何限制访问有关工程和科学的最新技术&#xff0c;并与世界各地的其他用户进行交流。 SOLIDWORKS科研版可为研究人员提供有关 SOLIDWORKS 设计和科学工程技术的最新知识&#xff0c;并使他们与世界范围内的…

08.CNN

文章目录 Observation 1Pooling - Max PoolingFlattenApplication&#xff1a;Playing Go使用验证集选择模型食物分类 Observation 1 Pooling - Max Pooling Pooling主要为了降低运算量&#xff0c;现在一般不用了&#xff0c;全convolution Flatten Application&#xff1a;P…

Linux|如何在 awk 中使用流控制语句

引言 当您从 Awk 系列一开始回顾我们迄今为止介绍的所有 Awk 示例时&#xff0c;您会注意到各个示例中的所有命令都是按顺序执行的&#xff0c;即一个接一个。但在某些情况下&#xff0c;我们可能希望根据某些条件运行一些文本过滤操作&#xff0c;这就是流程控制语句的方法。 …

鲸尾识别获奖方案总结

文章目录 1st solution(classification)2nd place code, end to end whale Identification model3rd place solution with code: ArcFace4th Place Solution: SIFT Siamese5th solution blog post code -Siamese7th place Pure Magic thanks Radek solution: classification9…

QGIS DEM数据快速获取

背景 Dem 是非常重要的数据&#xff0c;30 m 的精度也是最容易获取的&#xff0c;目前有很多种方式可以获取&#xff0c;比如地理空间数据云&#xff0c;今天介绍用 QGIS插件获取。 这种方式的最大优势是方便快捷。 插件下载与安装 插件-管理并安装插件-搜索下载 OpenTopogr…

linux:信号深入理解

文章目录 1.信号的概念1.1基本概念1.2信号的处理基本概念1.3信号的发送与保存基本概念 2.信号的产生2.1信号产生的五种方式2.2信号遗留问题(core,temp等) 3.信号的保存3.1 信号阻塞3.2 信号特有类型 sigset_t3.3 信号集操作函数3.4 信号集操作函数的使用 4.信号的处理4.1 信号的…

Python实现天气数据采集

Python实现天气数据采集 一、需求介绍二、完整代码一、需求介绍 本次天气数据采集的需求是获取每日的最高温、最低温、风力、风向、天气状况、AQI指数,如图所示,完整代码附后: 本次采集的目标网址是2345天气网: 上图的URL中,beijing是城市名称的缩写,54511即为城市代码…

科技引领未来:高速公路可视化

高速公路可视化监控系统利用实时视频、传感器数据和大数据分析&#xff0c;通过图扑 HT 可视化展示交通流量、车速、事故和路况信息。交通管理人员可以实时监控、快速响应突发事件&#xff0c;并优化交通信号和指挥方案。这一系统不仅提高了道路安全性和车辆通行效率&#xff0…

vue3结合element-plus之如何优雅的使用表格

背景 表格组件的使用在后台管理系统中是非常常见的,但是如果每次使用表格我们都去一次一次地从 element-plus 官网去 复制、粘贴和修改成自己想要的表格。 这样一来也说得过去,但是如果我们静下来细想不难发现,表格的使用都是大同小异的,每次都去复制粘贴,对于有很多表格…

vue3封装ElementUI plus Dialog弹窗

因为ElementuiPlus的dialog弹框的初始样式不太好看,而公司要求又要好看,本来是已经实现了,但是后来想想了发现封装完dialog的其他功能也要,所以特此记录一下 方案一 思路:封装一个组件,将所有新增的参数引入el-dialog 参数中,实现参数共用 新建一个组件,将官网暴露的属性全部引…

C++开源库glog使用封装--自定义日志输出格式,设置日志保留时间

glog下载和编译 glog开源地址 https://github.com/google/glog glog静态库编译 cd /home/wangz/3rdParty/hldglog/glogmkdir out mkdir build && cd buildcmake .. -DCMAKE_INSTALL_PREFIX../out -DCMAKE_BUILD_TYPERelease -DBUILD_SHARED_LIBSOFF本文选择的glo…

网关路由SpringCloudGateway、nacos配置管理(热更新、动态路由)

文章目录 前言一、网关路由二、SpringCloudGateway1. 路由过滤2. 网关登录校验2.1 鉴权2.2 网关过滤器2.3 登录校验2.3.1 JWT2.3.2 登录校验过滤器 3. 微服务从网关获取用户4. 微服务之间用户信息传递 三、nacos配置管理问题引入3.1 配置共享3.1.1 在Nacos中添加共享配置3.1.2 …

Vue 3入门指南

title: Vue 3入门指南 date: 2024/5/23 19:37:34 updated: 2024/5/23 19:37:34 categories: 前端开发 tags: 框架对比环境搭建基础语法组件开发响应式系统状态管理路由配置 第1章&#xff1a;Vue 3简介 1.1 Vue.js的历史与发展 Vue.js由前谷歌工程师尤雨溪&#xff08;Eva…