跟老杜从零入门MyBatis到架构思维(四)使用MyBatis完成CRUD- 下

MyBatis框架从入门到精通(三)使用MyBatis完成CRUD mybatis做为目前国内最为流行的开源orm框架,我们平时在使用时会感受到其带来的诸多便利,但是很少去深入分析,mybatis源码代码量不多,功能丰富,是一个很好的学习样例,本系列文章就和大家一起来学习mybatis框架学习地址:https://www.bilibili.com/video/BV1JP4y1Z73S/ 阅读详情

使用MyBatis完成CRUD

配合视频教程观看,更易学习理解,课程讲解从Mybatis的一些核心要点与实战中的运用,一直过渡到MyBaits源码,由表及里的代入架构思维。一步一案例,一码一实操。从简单到深入,从实战到源码,MyBatis重点、难点、考点一网打尽。

相关的学习资料给大家备好了

​​点这里!​

delete(Delete)

需求:根据car_num进行删除。

SQL语句这样写:

<delete id="deleteByCarNum">
  delete from t_car where car_num = #{SuiBianXie}
</delete>

Java程序这样写:

@Test
public void testDeleteByCarNum(){
    // 获取SqlSession对象
    SqlSession sqlSession = SqlSessionUtil.openSession();
    // 执行SQL语句
    int count = sqlSession.delete("deleteByCarNum", "102");
    System.out.println("删除了几条记录:" + count);
}

运行结果:

注意:当占位符只有一个的时候,${} 里面的内容可以随便写。

3.3 update(Update)

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

修改前:

SQL语句如下:

<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>

Java代码如下:

    @Test
    public void testUpdateCarByPOJO(){
        // 准备数据
        Car car = new Car();
        car.setId(34L);
        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("updateCarByPOJO", car);
        System.out.println("更新了几条记录:" + count);
    }

运行结果:

当然了,如果使用map传数据也是可以的。

3.4 select(Retrieve)

select语句和其它语句不同的是:查询会有一个结果集。来看mybatis是怎么处理结果集的!!!

查询一条数据

需求:查询id为1的Car信息

SQL语句如下:

<select id="selectCarById">
  select * from t_car where id = #{id}
</select>

Java程序如下:

@Test
public void testSelectCarById(){
    // 获取SqlSession对象
    SqlSession sqlSession = SqlSessionUtil.openSession();
    // 执行SQL语句
    Object car = sqlSession.selectOne("selectCarById", 1);
    System.out.println(car);
}

运行结果如下:

### Error querying database.  Cause: org.apache.ibatis.executor.ExecutorException: 
    A query was run and no Result Maps were found for the Mapped Statement 'car.selectCarById'.  【翻译】:对于一个查询语句来说,没有找到查询的结果映射。
    It's likely that neither a Result Type nor a Result Map was specified.						 【翻译】:很可能既没有指定结果类型,也没有指定结果映射。

以上的异常大致的意思是:对于一个查询语句来说,你需要指定它的“结果类型”或者“结果映射”。

所以说,你想让mybatis查询之后返回一个Java对象的话,至少你要告诉mybatis返回一个什么类型的Java对象,可以在<select>标签中添加resultType属性,用来指定查询要转换的类型:

<select id="selectCarById" resultType="com.powernode.mybatis.pojo.Car">
  select * from t_car where id = #{id}
</select>

运行结果:

运行后之前的异常不再出现了,这说明添加了resultType属性之后,解决了之前的异常,可以看出resultType是不能省略的。

仔细观察控制台的日志信息,不难看出,结果查询出了一条。并且每个字段都查询到值了:Row: 1, 100, 宝马520Li, 41.00, 2022-09-01, 燃油车

但是奇怪的是返回的Car对象,只有id和brand两个属性有值,其它属性的值都是null,这是为什么呢?我们来观察一下查询结果列名和Car类的属性名是否能一一对应:

查询结果集的列名:id, car_num, brand, guide_price, produce_time, car_type

Car类的属性名:id, carNum, brand, guidePrice, produceTime, carType

通过观察发现:只有id和brand是一致的,其他字段名和属性名对应不上,这是不是导致null的原因呢?我们尝试在sql语句中使用as关键字来给查询结果列名起别名试试:

<select id="selectCarById" resultType="com.powernode.mybatis.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>

运行结果如下:

通过测试得知,如果当查询结果的字段名和java类的属性名对应不上的话,可以采用as关键字起别名,当然还有其它解决方案,我们后面再看。

查询多条数据

需求:查询所有的Car信息。

SQL语句如下:

<!--虽然结果是List集合,但是resultType属性需要指定的是List集合中元素的类型。-->
<select id="selectCarAll" resultType="com.powernode.mybatis.pojo.Car">
  <!--记得使用as起别名,让查询结果的字段名和java类的属性名对应上。-->
  select
    id, car_num as carNum, brand, guide_price as guidePrice, produce_time as produceTime, car_type as carType
  from
    t_car
</select>

Java代码如下:

@Test
public void testSelectCarAll(){
    // 获取SqlSession对象
    SqlSession sqlSession = SqlSessionUtil.openSession();
    // 执行SQL语句
    List<Object> cars = sqlSession.selectList("selectCarAll");
    // 输出结果
    cars.forEach(car -> System.out.println(car));
}

运行结果如下:

3.5 关于SQL Mapper的namespace

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

创建CarMapper2.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="car2">
    <select id="selectCarAll" resultType="com.powernode.mybatis.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>
</mapper>

不难看出,CarMapper.xml和CarMapper2.xml文件中都有 id="selectCarAll"

将CarMapper2.xml配置到mybatis-config.xml文件中。

<mappers>
  <mapper resource="CarMapper.xml"/>
  <mapper resource="CarMapper2.xml"/>
</mappers>

编写Java代码如下:

@Test
public void testNamespace(){
    // 获取SqlSession对象
    SqlSession sqlSession = SqlSessionUtil.openSession();
    // 执行SQL语句
    List<Object> cars = sqlSession.selectList("selectCarAll");
    // 输出结果
    cars.forEach(car -> System.out.println(car));
}

运行结果如下:

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前添加一个名称空间,要有你改个其它名字。

Java代码修改如下:

@Test
public void testNamespace(){
    // 获取SqlSession对象
    SqlSession sqlSession = SqlSessionUtil.openSession();
    // 执行SQL语句
    //List<Object> cars = sqlSession.selectList("car.selectCarAll");
    List<Object> cars = sqlSession.selectList("car2.selectCarAll");
    // 输出结果
    cars.forEach(car -> System.out.println(car));
}

运行结果如下:

动力节点|老杜2023版MyBatis学习教程资料 本书最大的特点是能够让你从零开始,以层层递进的方式,深入框架底层源代码。小白可以从第一章开始按部就班的学习,老手程序员,可以直接从手写MyBatis框架开始学习。课程秉承动力节点一贯的教学风格,列文虎克式讲解,全程高能式教学,每个知识点的递进都伴随着N个案例予以解释,“杜”式教学风格,保证你学得会听得懂。049-手写godbatis框架第十五步selectOne方法的实现。043-手写godbatis框架第九步获取存储SQL的Map集合。046-手写godbatis框架第十二步insert方法的实现。 阅读详情

相关推荐

golang 线上事故

golang 线上事故 最近公司要做大促的一些活动。并且单量,qps持续上涨。之前使用的是django python 语言做的一个服务端。目前已经部署的国家里面最多的国家会有300+个实例。大促期间还可能会增加一个实例数。这么多的实例部署,回滚的时间都会特变长,除了问题也不好定位。并且如此多的一个机器,连接数* 实例数也会导致DB等其他服务扛不住这么大的并发。所以决定上go服务解决性能问题。 ...

lcf枫的博客 1537

Java中使用mybaties对数据游标处理

数据库支持:需确认数据库驱动支持游标(如MySQL需JDBC参数useCursorFetch=true)事务管理:游标处理期间需保持数据库连接,建议手动控制事务边界,避免长事务。分批次处理:每处理一定数量(如1000条)后执行批量操作或提交事务。优势:无需手动配置useCursorFetch,自动适配分页游标。大数据量导出:如导出百万级数据到Excel/CSV,避免OOM。原理:通过自定义结果处理器逐行处理数据,结合流式查询。原理:通过数据库游标逐条获取数据,减少内存占用。

weixin_45530192的博客 1515

从零开始做题:big_zip

内容为:You_know_the_bed_feels_warmer_Sleeping_here_alone_You_know_I_dream_in_color_And_do_the_things_I_want_You_think_you_got_the_best_of_me_Think_you_had_the_last_laugh_Bet_you_think_that_everything_good_is_gone。查看压缩包内容,发现有五字节长度的文件,用crc碰撞攻击破解明文。

weixin_44626085的博客 1241

解决Error querying database. Cause: org.apache.ibatis.executor.ExecutorException: No constructor found

原因是我在 javabean中写了自定义的有参构造函数,这样就会导致覆盖默认的无参的构造函数。而mybatis查询之后将结果对应在javabean时会调用默认的构造函数,这时候就会找不到了。解决办法就是在定义了自定义的构造函数后需将默认的无参构造函数显性的写出来即可。这样就能正常运行web项目了。

蒾酒的博客 1145

柔性OLED屏幕绿线故障的激光修复技术解析

OLED显示技术作为新一代显示方案,其主动矩阵驱动原理通过TFT背板控制每个像素的发光。在柔性屏幕应用中,微米级数据线路的物理损伤会导致显示异常,表现为贯穿屏幕的绿线故障。激光微焊技术凭借其微米级加工精度,成为修复这类精密电路损伤的理想方案。该技术通过纳秒级脉冲激光实现金属线路的精准重熔,在手机维修、显示面板制造等领域具有重要应用价值。特别是在折叠屏、曲面屏等柔性显示设备维修中,激光修复技术能有效解决因反复弯折导致的数据线断裂问题,配合光学定位系统和参数优化,修复成功率可达85%以上。

weixin_29168153的博客 324

AVM环视算法实战:从3D碗型投影到多场景模式切换的实现与优化

本文深入探讨了AVM环视算法在3D碗型投影和多场景模式切换中的实现与优化。通过分析3D碗型投影的核心原理和动态视角调节技术,展示了如何实现从超广角模式到转向模式的无缝切换。文章还分享了性能优化实战经验,包括实时性提升和图像拼接质量优化,为开发者提供了宝贵的AVM系统开发指南。

weixin_42573113的博客 168

Mybatis报错:ExecutorException: Executor was closed

解决问题:Cause: org.apache.ibatis.executor.ExecutorException: Executor was closed 问题意思:执行人被关闭。 在业务层接口实现类只创建了一个sqlsession全局对象,在业务层每个操作方法中都调用了这个对象,在第一次调用后容易更改sqlSession对象,导致对象被关闭,随后在其他方法继续调用这个对象sqlSession已经被关闭了,不会创建新的sqlSession,只会在类加载时创建唯一一次,所以才会报执行人已经被关闭的错误。 这

li377650260的博客 6807

【FPGA】Robei EDA的使用(10)————如何更新EDA的使用license

#海卑而下,能聚众水;学问笃实,以生光辉。 有的时候,有些问题自己通过查找资料解决,宁愿磨难一下,走点弯路,但收获更深刻的认知;不过,有些问题,问一下别人,可能会避免自己耗费过多时间做无用工,这些问题问会的人是极好的。但是怎样把握这个问题的类型,大约只能靠经验了~ (问我为何出此感言,谁叫我纠结了两天的问题,被人家一句话解决,我这个恨啊) ————————————————————正文开始的分割线———————————————— Robei EDA在使用上会有一个注册码,这个license在获取之后,每一次的

Ninquelote的博客 1002

解决org.apache.ibatis.executor.ExecutorException: No constructor found in xxxBean问题

在使用mybatis时遇到该问题,解决方法很简单,在实体类bean中加一个无参的构造方法即可,具体原因如下: 相关源码如下: private Object createByConstructorSignature(ResultSetWrapper rsw, Class&lt;?&gt; resultType, List&lt;Class&lt;?&gt;&gt; constructorArgT...

长风破浪会有时,直挂云帆济沧海! 1万+

从芯片选型到光学集成:手持激光测距仪硬件设计全解析

本文全面解析手持激光测距仪的硬件设计,从芯片选型到光学集成,详细介绍了相位法测距技术的核心原理与方案选择。通过模块化设计、信号链路优化及PCB布局技巧,实现毫米级精度。文章还分享了量产化关键控制点,帮助工程师规避常见设计陷阱,提升产品可靠性。

weixin_30425949的博客 445

Fiori Elements 从入门到精通开发教程的文章目录

Fiori Elements 开发技术相对 SAP 其他历史悠久,发展成熟的开发技术来说,是一个新事物。正因如此,迄今为止国内深入讲解 Fiori Elements 应用的中文材料几乎没有。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4718

Result对象

【代码】Result对象。

weixin_51296701的博客 230

OpenClaw实战系列07:定时任务与自动化工作流实战——让AI从“被动响应”到“主动执行”

通过本文的学习,你已经将 OpenClaw 从“被动应答”升级为“主动执行”的自动化引擎。定时简报:每天8点自动生成行业简报推送飞书/钉钉GitHub事件触发:PR合并自动触发Code ReviewAgent间协作:数据采集→分析→报告全自动流水线系统监控:定时检查服务器状态,异常自动告警核心收获掌握 OpenClaw 内置 Cron 系统的三种调度模式学会 Webhook 配置和事件触发机制理解 Agent 间通信的两种方式(sessions_spawn / sessions_send)

PeterPan的博客 691

SSM框架专题-MyBatis框架从零入门老杜版笔记(上)

MyBatis自用笔记,记录学习全过程

u011005040的博客 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

跟老杜从零学MyBatis框架【三】使用MyBatis完成CRUD

课程讲解从Mybatis的一些核心要点与实战中的运用,一直过渡到MyBaits源码,由表及里的代入架构思维。一步一案例,一码一实操,学,嘴对嘴指导。从简单到深入,从实战到源码,MyBatis重点、难点、考点一网打尽。学习地址:https://www.bilibili.com/video/BV1JP4y1Z73S/

2301_76637874的博客 195

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

跟着老杜学MyBatis+第3天+使用MyBatis完成CRUD

需求:修改id=34的Car信息,car_num为102,brand为比亚迪汉,guide_price为30.23,produce_time为2018-09-10,car_type为电车。运行后之前的异常不再出现了,这说明添加了resultType属性之后,解决了之前的异常,可以看出resultType是不能省略的。注意:其实传参数的时候有一个属性parameterType,这个属性用来指定传参的数据类型,不过这个属性是可以省略的。存在的问题是:SQL语句中的值不应该写死,值应该是用户提供的。

少年一贯快马扬帆,道阻且长不转弯; 要盛大,要绚烂,要哗然; 要用理想的泰坦尼克,去撞现实的冰川; 要当烧赤壁的风,而非借鉴草船; 要为了一片海,就肯翻万山。 1095

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

跟老杜从零入门MyBatis到架构思维(三)使用MyBatis完成CRUD- insert(Create)

配合视频教程观看,更易学习理解,课程讲解从Mybatis的一些核心要点与实战中的运用,一直过渡到MyBaits源码,由表及里的代入架构思维。一步一案例,一码一实操。从简单到深入,从实战到源码,MyBatis重点、难点、考点一网打尽。相关的学习资料给大家备好了​。

java_yydsyyds的博客 196

跟老杜从零入门MyBatis到架构思维(一)MyBatis概述

课程讲解从Mybatis的一些核心要点与实战中的运用,一直过渡到MyBaits源码,由表及里的代入架构思维。一步一案例,一码一实操。从简单到深入,从实战到源码,MyBatis重点、难点、考点一网打尽。配合视频教程观看,更易学习理解,2. ORM:对象关系映射。

java_yydsyyds的博客 464

老杜MyBatis笔记

Mybatis是持久层框架是对JDBC功能进行一些封装。同时JDBC写java里面不符合开闭原则,JDBC操作繁琐O(object):jvm中的java对象R(Relational):关系型数据库M(Mapper):映射上面是ROM?:pojo与数据表记录的互相映射。

m0_74321406的博客 1269

mybatis笔记(老杜版本)

mybatis笔记

OriginalSword的博客 3415

[记录学习]自学动力节点老杜MyBatis笔记_01

自学B站动力结点老杜MyBatis笔记

sls1223074612的博客 2269

动力节点2023版MyBatis实战教程(3)使用MyBatis完成CRUD

整理了MyBatis的学习笔记,来自b站动力节点老杜的mybatis教程。

2301_76637696的博客 260

[Java]Mybatis学习笔记(动力节点老杜)

🥽 Mybatis下载 🥽 了解Mybatis 🌊 ORM思想 🌊 Mybatis与ORM 🌊 MyBatis框架特点 🥽 Mybatis入门程序 🌊 数据库表的准备 🌊 创建Project 🌊 创建Module 🌊 设置打包⽅式 🌊 引⼊依赖 🌊 编写mybatis核心配置文件:mybatis-config.xml 🌊 mybatis中有两个主要的配置文件: 🌊 编写XxxxMapper.xml文件 🌊 在mybatis-config.xml文件中指定XxxxMapper.x

emmmm..... 4184

老杜带你从零入门MyBatis,学MyBatis看这篇就够了!

从零基础小白学习的角度出发,以层层递进的方式,一直深入到框架底层源代码的实现原理。不管你是小白还是正在实战开发的软件工程师,渗透全面一套拿捏~ 课程秉承动力节点一贯的教学风格,列文虎克式讲解,全程高能式教学,每个知识点的递进都伴随着N个案例予以解释,“杜”式教学风格,保证你学得会听得懂。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。课程讲解从Mybatis的一些核心要点与实战中的运用,一直过渡到MyBaits源码,由表及里的代入架构思维。

hujidedf的博客 430

动力节点|MyBatis入门实战到深入源码

本书最大的特点是能够让你从零开始,以层层递进的方式,深入框架底层源代码。小白可以从第一章开始按部就班的学习,老手程序员,可以直接从手写MyBatis框架开始学习。课程秉承动力节点一贯的教学风格,列文虎克式讲解,全程高能式教学,每个知识点的递进都伴随着N个案例予以解释,“杜”式教学风格,保证你学得会听得懂。课程讲解从Mybatis的一些核心要点与实战中的运用,一直过渡到MyBaits源码,由表及里的代入架构思维。MyBatis是一种简单易用、灵活性高且高性能的持久化框架,也是Java开发中不可或缺的一部分。

DDDYSz的博客 634

跟老杜从零学MyBatis框架【一】MyBatis概述

在文献中看到的framework被翻译为框架Java常用框架:SSM三大框架:Spring + SpringMVC + MyBatisSpringBoot等。。框架其实就是对通用代码的封装,提前写好了一堆接口和类,我们可以在做项目的时候直接引入这些接口和类(引入框架),基于这些现有的接口和类进行开发,可以大大提高开发效率。框架一般都以jar包的形式存在。(jar包中有class文件以及各种配置文件等。

2301_76637874的博客 139
上一篇: 跟老杜从零入门MyBatis到架构思维(三)使用MyBatis完成CRUD- insert(Create)
下一篇: 跟老杜从零入门MyBatis到架构思维(五)MyBatis核心配置文件-environment
Java摸鱼学习者
博客等级 码龄4年 2粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值