MyBatis——使用MyBatis完成CRUD

CRUD:Create Retrieve Update Delete

1、insert

<insert id="insertCar">
    insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
    values(null,'1003','五菱宏光',30.0,'2020-09-18','燃油车');
</insert>

这样写显然是写死的,在实际开发中是不存在的,一定是前端 form 表单提交过来数据,再将值赋值给 SQL 语句

在 JDBC 中可以使用 “?” 当占位符,而 mybatis 中需要使用 “#{}”,当作占位符,不能使用 “?”

 

Java 程序中使用 Map 给 SQL 语句的占位符传值:

一般 map 集合的 key 命名要见名知意

<insert id="insertCar">
    insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
    values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType});
</insert>
@Test
public void testInsertCar(){
    SqlSession sqlSession = SqlSessionUtil.openSession();

    /**
     * 执行 SQL 语句
     *
     * insert 方法参数:
     * 1> sqlId
     * 2> 封装数据的对象
     *
     * 使用 Map 集合封装数据
     */
    Map<String, Object> map = new HashMap<>();
    map.put("k1","1004");
    map.put("k2","比亚迪");
    map.put("k3",10.0);
    map.put("k4","2020-12-01");
    map.put("k5","新能源");
    int count = sqlSession.insert("insertCar",map);
    System.out.println(count);

    sqlSession.commit();
    sqlSession.close();
}

Java 程序中使用 POJO 给 SQL 语句的占位符传值:  

Car car = new Car(null,"1005","红旗H9",35.0,"2020-09-09","燃油车");

<insert id="insertCar">
    insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
    values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType});
</insert>

#{} 里面对应的是该类的 getter 方法  

@Test
public void testInsertCarPOJO(){
    SqlSession sqlSession = SqlSessionUtil.openSession();

    // 封装数据
    Car car = new Car(null,"1005","红旗H9",35.0,"2020-09-09","燃油车");
    int count = sqlSession.insert("insertCar", car);
    System.out.println(count);

    sqlSession.commit();
    sqlSession.close();
}

 

2、delete 

<delete id="deleteById">
    delete from t_car where id = #{id}
</delete>

如果占位符只有一个,#{} 里的内容可以随便写,最好还是见名知意

@Test
public void testDeleteById(){
    SqlSession sqlSession = SqlSessionUtil.openSession();

    int count = sqlSession.delete("deleteById", 5);
    System.out.println(count);

    sqlSession.commit();
    sqlSession.close();
}

 

3、update 

<update id="updateById">
    update t_car set
    car_num = #{carNum},
    brand = #{brand},
    guide_price = #{guidePrice},
    produce_time = #{produceTime},
    car_type = #{carType}
    where
    id = #{id}
</update>
@Test
public void testUpdateById(){
    SqlSession sqlSession = SqlSessionUtil.openSession();

    Car car = new Car(4L,"1004","五菱宏光Mini",20.0,"2020-11-11","燃油车");
    int count = sqlSession.update("updateById", car);
    System.out.println(count);

    sqlSession.commit();
    sqlSession.close();
}

 

4、select

  • 查一个
<!--resultType:指定结果集要封装的Java对象类型,全限定类型-->
<select id="selectById" resultType="com.qiuxuan.pojo.Car">
    select * from t_car where id = #{id}
</select>
Object o = sqlSession.selectOne("selectById", 4);

存在问题:结果存在 null 值

Car{id=4, carNum='null', brand='五菱宏光Mini', guidePrice=null, produceTime=null, carType='null'}

原因: 

select * from t_car where id = 1 执行结果:  

部分字段与 Car 类的属性名并没有对应上,所以在查询完后并未赋值

解决方法:给 SQL 语句的表字段起别名,使其与 Car 类的属性一致

<select id="selectById" resultType="com.qiuxuan.pojo.Car">
    select
    id,
    car_num as carNum,
    brand,
    guide_price as guidePrice,
    produce_time as produceTime,
    car_type as carType
    from t_car
    where id = #{id}
</select>
@Test
public void testSelectById(){
    SqlSession sqlSession = SqlSessionUtil.openSession();

    Object o = sqlSession.selectOne("selectById", 4);
    System.out.println(o);

    sqlSession.close();
}

 

  • 查全部 
<!--selectAll-->
<select id="selectAll" resultType="com.qiuxuan.pojo.Car">
    select id,
    car_num as carNum,
    brand,
    guide_price as guidePrice,
    produce_time as produceTime,
    car_type as carType
    from t_car
</select>
@Test
public void testSelectAll(){
    SqlSession sqlSession = SqlSessionUtil.openSession();

    List<Car> list = sqlSession.selectList("selectAll");
    for (Object o : list) {
        System.out.println(o);
    }

    sqlSession.close();
}

 

SQLMapper 映射文件的 namespace 作用

在 SQLMapper 配置文件中 <mapper> 标签的 namespace 属性可以翻译为命名空间,这个命名空间主要是为了防止 sqlId 冲突的

当两个 SQLMapper 文件中有各有一个 SQL 语句的 id 一样,就需要在使用时加上命名空间加以区分,否则会报如下异常:

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.IllegalArgumentException: 
  selectCarAll is ambiguous in Mapped Statements collection (try using the full name including the namespace, or rename one of the entries)
【翻译】selectCarAll 在 Mapped Statements 集合中不明确
(请尝试使用包含名称空间的全名,或重命名其中一个条目)
大致意思是 selectCarAll 重名了,需要在 selectCarAll 前添加一个名称空间,或者改个其它名字

一  叶  知  秋,奥  妙  玄  心

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI办公自动化:用kimi批量新建Word文档

Excel文件中有43行内容&#xff0c;希望根据这些内容批量新建43个word文档。 在kimichat中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写批量新建Word文档Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 打开F盘的表格文件&#xff1a;工…

node.js学习笔记

读取命令行参数 安转minimist&#xff08;轻量级的命令行参数解析引擎&#xff09; npm install --save minimist js文件 const minimist require("minimist");const args minimist(process.argv.slice(2));console.log(args["id"]) package.json {…

2024年汉字小达人活动还有4个多月开赛:来做18道历年选择题备考吧

不出特殊情况的话&#xff0c;距离2024年第11届汉字小达人比赛还有4个多月的时间&#xff0c;如何利用这段时间有条不紊地备考呢&#xff1f;我的建议是两手准备&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0c;重点是字、词、成语、古诗。②把历年真题刷刷熟…

1689 ssm社区老人危机干预系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java ssm社区老人危机干预系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主…

Reactor Netty UDP 客户器端-响应式编程-017

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace The Nex…

玩游戏专用远程控制软件

玩游戏专用远程控制软件&#xff1a;实现远程游戏的新体验 随着网络技术的不断发展和创新&#xff0c;远程控制软件已经逐渐渗透到我们生活的方方面面&#xff0c;尤其是在游戏领域。玩游戏专用远程控制软件&#xff0c;作为这一趋势下的产物&#xff0c;为玩家提供了全新的游…

CentOS 7安装配置docker

CentOS 7、8安装、配置docker 这里宿主机的型号选择是centos7.9.2009的版本 1.宿主机关闭防火墙和selinux&#xff0c;配置ipv4 #设置SELinuxdisabled vim /etc/selinux/config SELinuxdisabled 查看防火墙状态&#xff1a;firewall-cmd --state 关闭防火墙&#xff1a;syst…

【智能算法】正切搜索算法(TSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2022年&#xff0c;A Layeb受到正切函数启发&#xff0c;提出了正切搜索算法&#xff08;Tangent Search Algorithm, TSA&#xff09;。 2.算法原理 2.1算法思想 TSAT基于正切函数的数学…

【YashanDB知识库】ycm托管数据库时报错OM host ip:127.0.0.1 is not support join to YCM

问题现象 问题的风险及影响 导致数据库无法托管监控 问题影响的版本 问题发生原因 安装数据库时修改了OM的监听ip为127.0.0.1 解决方法及规避方式 后台修改OM的ip为本机的ip或者0.0.0.0 问题分析和处理过程 1、修改env文件中的om IP地址&#xff0c;修改为0.0.0.0或本机…

Windows:管理用户账户,密码策略和安全配置

在Windows操作系统中&#xff0c;管理用户账户和密码策略是确保系统安全的关键步骤。本文将探讨如何通过PowerShell和其他Windows工具管理用户账户&#xff0c;包括查看和设置密码策略、检查用户状态&#xff0c;以及导出和导入安全策略。这些管理任务对于系统管理员尤其重要&a…

如何通过PHP语言实现远程控制空调

如何通过PHP语言实现远程控制空调呢&#xff1f; 本文描述了使用PHP语言调用HTTP接口&#xff0c;实现控制空调&#xff0c;通过不同规格的通断器&#xff0c;来控制不同功率的空调的电源。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称…

docker安装nginx支持ssl 实现https访问(完整版)

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 本文简介 2. docker安装nginx支持ssl2.0 准备ssl证书(例: 阿里云)2.0.1 配置域名解析2.0.2 找到数字证书管理服务并签发ssl证书2.0.3 选择默认证书 填写域名 创建2.0.4 提交审核, 签发成功2.0.5 解压并上传到宿主机ssl路径下 …

【算法与数据结构】数组

文章目录 前言数组数组的定义数组的基本操作增加元素删除元素修改元素查找元素 C STL 中的数组arrayvector Python3 中的列表访问更改元素值遍历列表检查列表中是否存在某元素增加元素删除元素拷贝列表总结 Python3 列表的常用操作 参考资料写在最后 前言 本系列专注更新基本数…

Acrobat Pro DC 2023 for Mac:PDF处理的终极解决方案

Acrobat Pro DC 2023 for Mac为Mac用户提供了PDF处理的终极解决方案。它具备强大的文档处理能力&#xff0c;无论是查看、编辑还是创建PDF文件&#xff0c;都能轻松胜任。在编辑功能方面&#xff0c;Acrobat Pro DC 2023支持对文本、图像进行精准的修改和调整&#xff0c;还能添…

2024-05-10 Ubuntu上面使用libyuv,用于转换、缩放、旋转和其他操作YUV图像数据,测试实例使用I420ToRGB24

一、简介&#xff1a;libyuv 最初是由Google开发的&#xff0c;主要是为了支持WebRTC项目中的视频处理需求。用于处理YUV格式图像数据的开源库。它提供了一系列的函数&#xff0c;用于转换、缩放、旋转和其他操作YUV图像数据。 二、执行下面的命令下载和安装libyuv。 git clo…

杰发科技AC7801——ADC之Bandgap和内部温度计算

0. 参考 电流模架构Bandgap设计与仿真 bandgap的理解&#xff08;内部带隙电压基准&#xff09; ​ ​ 虽然看不懂这些公式&#xff0c;但是比较重要的一句应该是这个&#xff1a;因为传统带隙基准的输出值为1.2V ​ 1. 使用 参考示例代码。 40002000是falsh控制器寄…

LeetCode 112. 路径总和 || LeetCode 113. 路径总和ii

LeetCode 112. 路径总和 1、题目 题目链接&#xff1a;112. 路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true…

Qt三方库:QuaZIP介绍、编译和使用

前言 Qt使用一些压缩解压功能&#xff0c;探讨过libzip库&#xff0c;zlib库&#xff0c;libzip库比较原始&#xff0c;还有其他库&#xff0c;都比较基础&#xff0c;而在基础库之上&#xff0c;又有高级封装库&#xff0c;Qt中的QuaZIP是一个很好的选择。Quazip是一个用于压缩…

Win11安装Docker Desktop运行Oracle 11g 【详细版】

oracle docker版本安装教程 步骤拉取镜像运行镜像进入数据库配置连接数据库&#xff0c;修改密码Navicat连接数据库 步骤 拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g运行镜像 docker run -d -p 1521:1521 --name oracle11g registry.cn-ha…

MySQL的表级锁

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;面经 ⛺️稳中求进&#xff0c;晒太阳 表级锁 介绍 对于表锁&#xff0c;分为两类&#xff1a; 表共享读锁表独占写锁 语法 1. 加锁&#xff1a;lock tables 表名... read/write 2.…