03MyBatis完成CRUD

准备工作
○ 创建module(Maven的普通Java模块):mybatis-002-crud
○ pom.xml
■ 打包方式jar
■ 依赖:
● mybatis依赖
● mysql驱动依赖
● junit依赖
● logback依赖
○ mybatis-config.xml放在类的根路径下
○ CarMapper.xml放在类的根路径下(一张表对应一个Mapper)
○ logback.xml放在类的根路径下
○ 提供com.sunsplanter.mybatis.utils.SqlSessionUtil工具类
○ 创建测试用例:com.sunsplanter.mybatis.CarMapperTest


1.insert(Create)

1.1使用map传参完成insert

在第一个mybatis程序中的CarMapper.xml文件中,Sql语句是写死的:

  <insert id="insertCar">//插入的东西全部写死了,但实际使用中,我们不可能预知用户需要insert的数据//一定是通过某种方法留空,然后前端的form表单传来数据,再将数据与sql语句结合提交insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)values(null,'1003','toyota',30.00,'2000-10-11','燃油车')</insert>

在JDBC中,我们是这样留空的:

// JDBC中使用 ? 作为占位符。
String sql = "insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(?,?,?,?,?)";

在MyBatis中,我们这样做:
在Java程序中,将数据放到Map集合中
在sql语句中使用 #{map集合的key} 来完成传值,#{} 等同于JDBC中的 ? ,#{}就是占位符

package com.sunsplanter.mybatis;import com.sunsplanter.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;public class CarMapperTest {@Testpublic void testInsertCar() {//前端传来数据了,用map将这些数据封装起来Map<String, Object> map = new HashMap<>();map.put("k1", "103");map.put("k2", "奔驰E300L");map.put("k3", 50.3);map.put("k4", "2020-10-01");map.put("k5", "燃油车");//调用封装好的方法获取SqlSession对象SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句,第一个参数是sql段的id,第二参数是要传入的对象(使用map集合给sql语句传递数据)int count = sqlSession.insert("insertCar", map);System.out.println("插入了几条记录:" + count);}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--namespace先随便写-->
<mapper namespace="TBD
"><insert id="insertCar">
<!--t_car后接的参数指明要插入表中的哪个单元,而#{} 的里面必须填写map集合的key,以正确获取map的value-->insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})</insert>
</mapper>

1.2使用POJO传参完成insert

如果采用POJO传参,#{} 里写的是get方法的方法名去掉get之后将剩下的单词首字母变小写(例如:getAge对应的是#{age},getUserName对应的是#{userName}),如果这样的get方法不存在会报错。

● 第一步:新建一个pojo包,包下定义一个pojo类Car,提供相关属性。

package com.sunsplanter.mybatis.pojo;public class Car {
//long还是Long?若使用包装类,其提供了更多的方法可供调用,并且支持值为null的情况。private Long id;private String carNum;private String brand;private Double guidePrice;private String produceTime;private String carType;@Overridepublic String toString() {return "Car{" +"id=" + id +", carNum='" + carNum + '\'' +", brand='" + brand + '\'' +", guidePrice=" + guidePrice +", produceTime='" + produceTime + '\'' +", carType='" + carType + '\'' +'}';}public Car() {}public Car(Long id, String carNum, String brand, Double guidePrice, String produceTime, String carType) {this.id = id;this.carNum = carNum;this.brand = brand;this.guidePrice = guidePrice;this.produceTime = produceTime;this.carType = carType;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getCarNum() {return carNum;}public void setCarNum(String carNum) {this.carNum = carNum;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public Double getGuidePrice() {return guidePrice;}public void setGuidePrice(Double guidePrice) {this.guidePrice = guidePrice;}public String getProduceTime() {return produceTime;}public void setProduceTime(String produceTime) {this.produceTime = produceTime;}public String getCarType() {return carType;}public void setCarType(String carType) {this.carType = carType;}
}
@Test
public void testInsertCarByPOJO(){// 创建POJO,封装数据Car car = new Car();//前端传来数据了,用set方法将这些数据传入POJO属性car.setCarNum("103");car.setBrand("奔驰C200");car.setGuidePrice(33.23);car.setProduceTime("2020-10-11");car.setCarType("燃油车");//调用封装好的方法获取SqlSession对象SqlSession sqlSession = SqlSessionUtil.openSession();// 执行SQL语句。第一个参数是sql段的id,第二参数是要传入的对象(使用POJO对象给sql语句传递数据)int count = sqlSession.insert("insertCarByPOJO", car);System.out.println("插入了几条记录" + count);
}
<insert id="insertCarByPOJO"><!--#{} 里写的是POJO的属性名-->insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
</insert>

2.Delete

需求:根据car_num进行删除。

@Test
public void testDeleteByCarNum(){//调用封装好的方法获取SqlSession对象SqlSession sqlSession = SqlSessionUtil.openSession();// 执行SQL语句。第一个参数是sql段的id,第二个参数是要删除的“car_num”int count = sqlSession.delete("deleteByCarNum", "102");System.out.println("删除了几条记录:" + count);
}
<delete id="deleteByCarNum">
<!--当占位符只有一个的时候,${} 里面的内容可以随便写。-->delete from t_car where car_num = #{SuiBianXie}
</delete>

2.1用POJO传参Update

需求:修改id=34的Car信息,car_num为102,brand为比亚迪汉,guide_price为30.23,produce_time为2018-09-10,car_type为电车

<update id="updateCarByPOJO">update t_car set car_num = #{carNum}, brand = #{brand}, guide_price = #{guidePrice}, produce_time = #{produceTime}, car_type = #{carType} where id = #{id}
</update>
  @Testpublic void testUpdateCarById_POJO(){// 准备数据Car car = new Car();car.setId(5L);car.setCarNum("102");car.setBrand("比亚迪汉");car.setGuidePrice(30.23);car.setProduceTime("2018-09-10");car.setCarType("电车");// 获取SqlSession对象SqlSession sqlSession = SqlSessionUtil.openSession();// 执行SQL语句int count = sqlSession.update("updateCarById_Map", car);System.out.println("更新了几条记录:" + count);}

2.2用Map传参Update

需求一致,XML代码也一致,仅仅是java代码改为用Map传参

    @Testpublic void testUpdateCarById_Map(){//前端传来数据了,用map将这些数据封装起来Map<String, Object> map = new HashMap<>();map.put("id", 5L);map.put("carNum", "104");map.put("brand", "XiaomiSU7");map.put("guidePrice", 18.9);map.put("produceTime", "2024-04-01");map.put("carType", "电动车");//调用封装好的方法获取SqlSession对象SqlSession sqlSession = SqlSessionUtil.openSession();// 执行SQL语句int count = sqlSession.update("updateCarById_Map",map);System.out.println("更新了几条记录:" + count);}

3.1select(Retrieve)一条

select语句和其它语句不同的是:查询会返回一个结果集ResultSet。,然而,语句是:

Object car = sqlSession.selectOne("selectCarById", 1);

因此,必须将ResultSet转化成成一个Java对象。mybatis查询之后返回一个Java对象的话,至少你要告诉mybatis返回一个什么类型的Java对象,可以在标签中添加resultType属性,用来指定查询要转换的类型:


<select id="selectCarById" resultType="com.powernode.mybatis.pojo.Car">select * from t_car where id = #{id}
</select>
    @Testpublic void testSelectCarById(){// 获取SqlSession对象SqlSession sqlSession = SqlSessionUtil.openSession();//查一条记录用selectOne方法Car car = sqlSession.selectOne("selectCarById", 1);System.out.println(car);}

然而,这样输出的结果是:
在这里插入图片描述

原因是:例如对于汽车编号这个字段,在POJO类和mapper文件中为carNum,但在数据库表中为car_num,这样当然查不到。
改为:

<!--虽然结果是List集合,但是resultType属性需要指定的是List集合中元素的类型。-->
<select id="selectCarById" resultType="com.sunsplanter.mybatis.pojo.Car">select <!--记得使用as起别名,让查询结果的字段名和java类的属性名对应上。方法是:数据库中字段名 as Java中属性名-->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>

3.1select(Retrieve)多条

  • 取一条时,用selectOne方法返回ResultSet,转化成一个指定对象,这个指定对象只要定义个Car car接受即可。
    取多条时,用selectList方法返回多个ResultSet转换成多个指定对象,这多个对象定义一个List来接受,否则要定义Car car1 car2…
<!--虽然结果是List集合,但是resultType属性需要指定的是List集合中元素的类型。-->
<select id="selectCarAll" resultType="com.sunsplanter.mybatis.pojo.Car"><!--记得使用as起别名,让查询结果的字段名和java类的属性名对应上。-->selectid, car_num as carNum, brand, guide_price as guidePrice, produce_time as produceTime, car_type as carTypefromt_car
</select>
@Test
public void testSelectCarAll(){// 获取SqlSession对象SqlSession sqlSession = SqlSessionUtil.openSession();// 执行SQL语句List<Object> cars = sqlSession.selectList("selectCarAll");// 输出结果cars.forEach(car -> System.out.println(car));
}

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

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

相关文章

Elasticsearch:Serarch tutorial - 使用 Python 进行搜索 (二)

这个是继上一篇文章 “Elasticsearch&#xff1a;Serarch tutorial - 使用 Python 进行搜索 &#xff08;一&#xff09;” 的续篇。在今天的文章中&#xff0c;我们接着来完成如何进行分页及过滤。 分页 - pagination 应用程序处理大量结果通常是不切实际的。 因此&#xff0…

sqlserver 查日志及死锁记录

方 Exec xp_readerrorlog 0 Go 1.2. 2&#xff09;查询存档编号为n(n Between 0 And 99)的SQL Server日志信息 Exec xp_readerrorlog n 1. 3&#xff09;根据时间范围查询SQL Server日志信息 Exec xp_readerrorlog 1,1,Null,Null,20091126 20:10,20091126 20:40,Asc 1. 4&am…

【ros笔记】urdf文件

urdf文件属于xml文件&#xff0c;他的标签有&#xff1a; <robot name"robot_name"><!-- 看的见摸的着刚体用link --><link name"base_link"><!-- 可视化部分 --><visual><!-- 几何形状 --><geometry><!-- b…

vue-springboot 音乐推荐系统 带歌词的音乐播放器系统设计与实现 7902c

少数民族音乐网站在流畅性&#xff0c;续航能力&#xff0c;等方方面面都有着很大的优势。这就意味着少数民族音乐网站的设计可以比其他系统更为出色的能力&#xff0c;可以更高效的完成最新的音乐信息、音乐资讯、在线交流等功能。 此系统设计主要采用的是JAVA语言来进行开发&…

基于SpringBoot的教学辅助系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

实战Flink Java api消费kafka实时数据落盘HDFS

文章目录 1 需求分析2 实验过程2.1 启动服务程序2.2 启动kafka生产 3 Java API 开发3.1 依赖3.2 代码部分 4 实验验证STEP1STEP2STEP3 5 时间窗口 1 需求分析 在Java api中&#xff0c;使用flink本地模式&#xff0c;消费kafka主题&#xff0c;并直接将数据存入hdfs中。 flin…

java火车查询管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web火车查询管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

深度学习工具-Jupyter Notebook使用

在本地编辑和运行代码 运行命令jupyter notebook。如果浏览器未自动打开&#xff0c;请打开http://localhost:8888 你可以通过单击网页上显示的文件夹来访问notebook文件。它们通常有后缀“.ipynb”。为了简洁起见&#xff0c;我们创建了一个临时的“test.ipynb”文件。单击后…

用python写个根据水库大坝安全监测excel数据自动生成word水库大坝安全监测报告

要实现这个功能&#xff0c;你需要使用Python中的一些库&#xff0c;如pandas用于处理Excel数据&#xff0c;python-docx用于生成Word文档。 以下是一个简单的示例&#xff0c;展示如何从Excel数据中读取数据&#xff0c;并使用python-docx生成Word报告。 首先&#xff0c;确保…

MySQL第五战:常见面试题(下)

前言&#xff1a; 在当今的IT世界&#xff0c;数据库是任何应用程序的核心。而MySQL&#xff0c;作为最流行的开源关系数据库管理系统&#xff0c;已经成为许多开发者和企业的首选。无论是初创公司还是大型企业&#xff0c;都依赖于MySQL来存储、管理和检索数据。 随着技术的…

Kubernetes 学习总结(44)—— Kubernetes 1.29 中的删除、弃用和主要更改

Kubernetes API 删除和弃用流程 Kubernetes 项目对功能有详细记录的弃用政策。此策略规定&#xff0c;只有当同一 API 的更新、稳定版本可用时&#xff0c;才可以弃用稳定的 API&#xff0c;并且每个稳定性级别的 API 都有最短生命周期。已弃用的 API 是已标记为在未来 Kuber…

计算机网络(超级详细笔记)

使用教材计算机网络&#xff08;第8版&#xff09;&#xff08;谢希仁&#xff09; 第一章&#xff1a;概述 第二章&#xff1a;物理层 第三章&#xff1a;数据链路层 第四章&#xff1a;网络层 第五章&#xff1a;运输层 第六章&#xff1a;应用层 目…

Linux学习第50天:Linux块设备驱动实验(二):Linux三大驱动之一

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 三、使用请求队列实验 1.实验程序编写 使用开发板上的一段RAM来模拟一段块设备&#xff0c;也就是ramdisk. 机械硬盘 34 #define RAMDISK_SIZE (2 * 1024 * 10…

使用即时设计绘制原型设计方便吗?和Axure RP相比怎么样?

对于原型设计&#xff0c;APP 和 Web 都是一样的&#xff0c;因为产品原型是用来确定需求的工具。我们使用这种工具的目的是为了快速迭代&#xff0c;从而深入挖掘和筛选产品的需求。 绘制原型&#xff0c;最重要的原则是&#xff1a;快速、清晰&#xff01; Axure 工具的优缺…

智能合约安全之Solidity重入攻击漏洞的深入理解

漏洞原理 以太坊智能合约的特点之一是能够调用和使用其他外部合约的代码。这些合约通常会操作以太币,经常将以太发送到各种外部用户地址。这种调用外部合约或向外部地址发送以太币的操作,需要合约提交外部调用。这些外部调用可能被攻击者劫持,比如,通过一个回退函数,强迫…

2023APMCM亚太数学建模C题 - 中国新能源汽车的发展趋势(3)

六、问题三的模型建立和求解 6.1问题分析 问题3.收集数据&#xff0c;建立数学模型分析新能源电动汽车对全球传统能源汽车行业的影响。 本题要求建立模型分析新能源电动汽车对全球传统能源汽车行业的影响。由于数据集可能略大&#xff0c;而在处理复杂问题、大量特征和大规模…

Python YAML数据驱动:实现自动化测试的利器

引言&#xff1a; 在软件开发过程中&#xff0c;自动化测试是保证软件质量的重要环节。而数据驱动测试作为一种常见的测试方法&#xff0c;通过使用不同的测试数据来验证软件的功能和性能。本文将介绍如何使用Python中的YAML库来实现数据驱动测试&#xff0c;以及如何利用YAML数…

spatialRF

官网&#xff1a;Easy Spatial Modeling with Random Forest • spatialRF (blasbenito.github.io) spatialRF是一种在考虑空间自相关的前提下&#xff0c;利用随机森林对空间数据进行回归并解释的R包。 数据要求 参数命名 data&#xff1a;训练集&#xff0c;data frame。 …

基于SpringBoot的房屋租赁管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

WorkPlus Meet打造高质量的视频会议体验,助力实时远程协作

在全球化的商业环境中&#xff0c;远程协作和在线会议成为了企业高效工作的关键。作为一款高质量的视频会议软件&#xff0c;WorkPlus Meet以其卓越的性能和创新的功能&#xff0c;成为企业实时远程协作的首选。 WorkPlus Meet打造了高质量的视频会议体验&#xff0c;为企业提供…