MyBatis——使用MyBatis完成CRUD

news2024/11/25 0:25:14

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 前添加一个名称空间,或者改个其它名字

一  叶  知  秋,奥  妙  玄  心

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

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

相关文章

大模型微调方法汇总

微调方法 Freeze方法P-tuning方法 prefix-tuningPrompt TuningP-tuning v1P-tuning v2Lora方法 重要相关参数LoRA 的优势Qlora方法 相关参数微调经验 模型选择模型大小选择数据处理微调方案英文模型需要做词表扩充吗&#xff1f;如何避免灾难遗忘大模型的幻觉问题微调后的输出…

2024第八季完美童模 【星光】品牌赛区 【直通】赛 完美收官

2024年5月1日&#xff0c;春风徐徐的【星光品牌赛区】热闹非凡&#xff0c;备受瞩目的第八季完美童模【星光品牌赛区】赛区【直通赛】在这一天正式拉开了帷幕。比赛现场&#xff0c;童模们身着华服&#xff0c;在舞台上演绎了“亚特兰蒂斯”的时尚主题赛。 参赛选手们身着带有海…

新店2个月盈利6万,就是因为做对了这六个步骤,教你正确起店步骤

大家好&#xff0c;我是电商花花。 2024年依然能做抖音小店&#xff0c;因为就按照我们这边团队的实操经验来看。 抖音小店不仅可以做&#xff0c;而且即便是新手小白也可以做&#xff0c;只要掌握抖音小店背后的运营方法和起店步骤&#xff0c;就能很快出单并做起来。 今天…

【Linux】Linux安装JDK

一、卸载Linux自带的JDK #查询已有的JDK rpm -qa | grep jdk ①将查询到的JDK全部卸载掉 #直接复制一整行的JDK名称 yum -y remove java-1.7.0-openjdk-headless-1.7.0.261-2.6.22.2.el7_8.x86_64 ②卸载完第一个后再次查询 ③继续卸载&#xff0c;卸载完成后再次查询 ④查询…

如何将draw.io的图导入word

解决办法&#xff08;有点点复杂&#xff09; 先在http://draw.io导出格式为svg矢量图格式&#xff0c;然后用visio打开svg&#xff0c;调整完界面等等之后再保存&#xff0c;然后在word里面插入visio

simulink-仿真以及PID参数整定/PID tuner 的使用流程

控制器搭建与参数整定 搭建一个前馈PID控制器控制系统PID tuner使用 一个懂点控制但不多的小白&#xff0c;因为需要利用simulink仿真&#xff0c;所以不得不学习一些仿真的知识&#xff0c;这篇文章适合和我一样的新手入门&#xff0c;有理解错误的地方希望大手们能够指出来共…

volatile详解、原理

文章目录 一、Volatile的定义和作用1.1 Volatile简介1.2 Volatile作用 二、并发编程中的三个问题&#xff1a;可见性、原子性、有序性二、Java内存模型&#xff08;JMM&#xff09;三、volatile变量的特性3.1 线程可见性3.2 禁止重排序禁止重排序原理禁止重排序举例 3.3 volati…

七、e2studio VS STM32CubeIDE之显示中文编码

目录 一、概述/目的 二、查看和修改文件编码 三、eclipse编码格式 3.1 优先级 3.1.1 全局workspace 3.1.2 工程 3.1.3 文件 3.1.4 全局文件的content type 二、STM32CubeIDE设置显示中文编码 二、e2studio设置显示中文编码 七、e2studio VS STM32CubeIDE之显示中文编…

【Linux】网络接口绑定和组合的操作实例

网络接口绑定和组合的操作实例 &#xff08;一&#xff09;网卡1. 增2. 查3. 激活——设置网络接口 &#xff08;二&#xff09;网络接口绑定1. 概述2. 实验操作3. 删除绑定 &#xff08;三&#xff09;网络接口组合1. 概述2. 实验操作 &#xff08;一&#xff09;网卡 1. 增 …

第十五篇:全面防护:构建不容侵犯的数据库安全策略与实战指南

全面防护&#xff1a;构建不容侵犯的数据库安全策略与实战指南 1. 引言&#xff1a;数据库安全的现代战略 1.1 简介&#xff1a;数据库安全在当今的数字化时代中的重要性 在数字化的浪潮中&#xff0c;数据已成为企业乃至国家的核心资产&#xff0c;其价值不亚于实体世界的黄…

【JavaEE初阶系列】——博客系统(编写服务器/前后端交互代码)

目录 &#x1f6a9;部署页面需求 &#x1f6a9;准备工作 &#x1f6a9;获取博客列表页 &#x1f6a9;博客详情页 &#x1f6a9;实现登录页面 &#x1f388;强制要求登录 &#x1f388;显示用户信息 &#x1f6a9;退出登录 &#x1f6a9;发布博客 &#x1f6a9;部署页面…

5.nginx常用命令和日志定时切割

一. nginx常用的相关命令介绍 1.强制关闭nginx: ./nginx -s stop 2.优雅的关闭nginx: ./nginx -s quit 3.检查配置文件是否正确&#xff1a; ./nginx -t 4.查看nginx版本&#xff1a; ./nginx -v 5.查看nginx版本相关的配置环境信息&#xff1a;./nginx -V 6.nginx帮助信…

Lists.partition用法详解

文章目录 一、引入依赖二、用法三、输出 一、引入依赖 依赖于谷歌的guava 包 <!-- guava --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>28.1-jre</version></dependency&…

C++语法|volatile关键字!从CPU角度进行理解

个人认为C有着复杂、臃肿的语法系统&#xff0c;但是也正是因为这些特性&#xff0c;让我们在使用C时既能深入到操作系统级的控制&#xff0c;也能抽象出来完全专注于一些业务问题。 这里为大家推荐一本书和汇编代码阅读网站&#xff01; 《CPU眼里的C/C》 Compiler Explorer 我…

ssm+vue的公务用车管理智慧云服务监管平台查询统计(有报告)。Javaee项目,ssm vue前后端分离项目

演示视频&#xff1a; ssmvue的公务用车管理智慧云服务监管平台查询统计&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&…

GCP谷歌云有什么数据库类型,该怎么选择

GCP谷歌云提供的数据库类型主要包括&#xff1a; 关系型数据库&#xff1a;这类数据库适用于结构化数据&#xff0c;通常用于数据结构不经常发生变化的场合。在GCP中&#xff0c;关系型数据库选项包括Cloud SQL和Cloud Spanner。Cloud SQL提供托管的MySQL、PostgreSQL和SQL Se…

高效项目管理:如何利用zz-plan在线甘特图工具

作为项目管理人员&#xff0c;使用 zz-plan https://zz-plan.com/这样的在线甘特图协作软件可以极大地提高项目管理的效率和效果。以下是结合zz-plan特点的一些关键步骤&#xff1a; 1. 制定项目计划 在zz-plan上创建新的项目&#xff0c;定义项目目标、关键里程碑和最终期限。…

【数据可视化01】matplotlib实例介绍2

目录 一、引言二、实例介绍1.箱线图2.热力图3.线条形式 一、引言 接着上一文章【数据可视化01】matplotlib实例介绍1继续介绍matplotlib的实例。 二、实例介绍 在matplotlib中&#xff0c;常用的图形类型包括&#xff1a; 箱线图&#xff08;Box plot&#xff09;&#xff1…

d17(154-168)-勇敢开始Java,咖啡拯救人生

目录 方法递归 字符集 编码-解码 IO流 字节流 字节输入流 InputSream FileInputStream 字节输出流 OutputSream FileOutputSream 释放资源的方式 try-catch-finallly try-with-resource 字符流 字符输入流 Reader FileReader 文件字符输出流 Writer FileWriter …

(done) 什么是马尔可夫链?Markov Chain

参考视频&#xff1a;https://www.bilibili.com/video/BV1ko4y1P7Zv/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 如下图所示&#xff0c;马尔可夫链条实际上就是 “状态机”&#xff0c;只不过状态机里不同状态之间的边上是 “…