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

mybatis创建和删除表 mybatis 创建表和删除表一份 很实用的文档,希望大家下载浏览 立即下载

使用MyBatis完成CRUD

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

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

​​点这里!​

  • ●准备工作

○创建module(Maven的普通Java模块):mybatis-002-crud

○pom.xml

■打包方式jar

■依赖:

●mybatis依赖

●mysql驱动依赖

●junit依赖

●logback依赖

○mybatis-config.xml放在类的根路径下

○CarMapper.xml放在类的根路径下

○logback.xml放在类的根路径下

○提供com.powernode.mybatis.utils.SqlSessionUtil工具类

○创建测试用例:com.powernode.mybatis.CarMapperTest

1. insert(Create)

分析以下SQL映射文件中SQL语句存在的问题

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

<!--namespace先随便写-->
<mapper namespace="car">
    <insert id="insertCar">
        insert into t_car(car_num,brand,guide_price,produce_time,car_type) values('103', '奔驰E300L', 50.3, '2022-01-01', '燃油车')
    </insert>
</mapper>

存在的问题是:SQL语句中的值不应该写死,值应该是用户提供的。之前的JDBC代码是这样写的:

// JDBC中使用 ? 作为占位符。那么MyBatis中会使用什么作为占位符呢?
String sql = "insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(?,?,?,?,?)";
// ......
// 给 ? 传值。那么MyBatis中应该怎么传值呢?
ps.setString(1,"103");
ps.setString(2,"奔驰E300L");
ps.setDouble(3,50.3);
ps.setString(4,"2022-01-01");
ps.setString(5,"燃油车");

在MyBatis中可以这样做:

在Java程序中,将数据放到Map集合中

在sql语句中使用 #{map集合的key} 来完成传值,#{} 等同于JDBC中的 ? ,#{}就是占位符

Java程序这样写:


package com.powernode.mybatis;

import com.powernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

/**
 * 测试MyBatis的CRUD
 * @author 老杜
 * @version 1.0
 * @since 1.0
 */
public class CarMapperTest {
    @Test
    public void testInsertCar(){
        // 准备数据
        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语句(使用map集合给sql语句传递数据)
        int count = sqlSession.insert("insertCar", map);
        System.out.println("插入了几条记录:" + count);
    }
}

SQL语句这样写:

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

<!--namespace先随便写-->
<mapper namespace="car">
    <insert id="insertCar">
        insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{k1},#{k2},#{k3},#{k4},#{k5})
    </insert>
</mapper>

#{} 的里面必须填写map集合的key,不能随便写。运行测试程序,查看数据库:

如果#{}里写的是map集合中不存在的key会有什么问题?

<?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="car">
    <insert id="insertCar">
        insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{kk},#{k2},#{k3},#{k4},#{k5})
    </insert>
</mapper>

运行程序:

通过测试,看到程序并没有报错。正常执行。不过 #{kk} 的写法导致无法获取到map集合中的数据,最终导致数据库表car_num插入了NULL。

在以上sql语句中,可以看到#{k1} #{k2} #{k3} #{k4} #{k5}的可读性太差,为了增强可读性,我们可以将Java程序做如下修改:

Map<String, Object> map = new HashMap<>();
// 让key的可读性增强
map.put("carNum", "103");
map.put("brand", "奔驰E300L");
map.put("guidePrice", 50.3);
map.put("produceTime", "2020-10-01");
map.put("carType", "燃油车");

SQL语句做如下修改,这样可以增强程序的可读性:

<?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="car">
    <insert id="insertCar">
        insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
    </insert>
</mapper>

运行程序,查看数据库表:

使用Map集合可以传参,那使用pojo(简单普通的java对象)可以完成传参吗?测试一下:

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


package com.powernode.mybatis.pojo;

/**
 * POJOs,简单普通的Java对象。封装数据用的。
 * @author 老杜
 * @version 1.0
 * @since 1.0
 */
public class Car {
    private Long id;
    private String carNum;
    private String brand;
    private Double guidePrice;
    private String produceTime;
    private String carType;

    @Override
    public 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;
    }
}

●第二步:Java程序

@Test
public void testInsertCarByPOJO(){
    // 创建POJO,封装数据
    Car car = new Car();
    car.setCarNum("103");
    car.setBrand("奔驰C200");
    car.setGuidePrice(33.23);
    car.setProduceTime("2020-10-11");
    car.setCarType("燃油车");
    // 获取SqlSession对象
    SqlSession sqlSession = SqlSessionUtil.openSession();
    // 执行SQL,传数据
    int count = sqlSession.insert("insertCarByPOJO", car);
    System.out.println("插入了几条记录" + count);
}

●第三步:SQL语句

<insert id="insertCarByPOJO">
  <!--#{} 里写的是POJO的属性名-->
  insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
</insert>

●运行程序,查看数据库表:

#{} 里写的是POJO的属性名,如果写成其他的会有问题吗?

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

运行程序,出现了以下异常:

错误信息中描述:在Car类中没有找到a属性的getter方法。

修改POJO类Car的代码,只将getCarNum()方法名修改为getA(),其他代码不变,如下:

再运行程序,查看数据库表中数据:

经过测试得出结论:

如果采用map集合传参,#{} 里写的是map集合的key,如果key不存在不会报错,数据库表中会插入NULL。

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

注意:其实传参数的时候有一个属性parameterType,这个属性用来指定传参的数据类型,不过这个属性是可以省略的

<insert id="insertCar" parameterType="java.util.Map">
  insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
</insert>

<insert id="insertCarByPOJO" parameterType="com.powernode.mybatis.pojo.Car">
  insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
</insert>

mybatis创建两张表的sql INSERT INTO `user` VALUES ('1', '王五', null, '2', null); INSERT INTO `user` VALUES ('10', '张三', '2014-07-10', '1', '北京市'); 立即下载

相关推荐

Mybatis自动创建表和更新表结构

主要介绍了Mybatis自动创建表和更新表结构的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

Mybatis

一.简介 1.1.什么是 MyBatis? MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 1.2.基本信息 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。 1

Create_zy的博客 1512

腾讯地图自定义瓦片地图开发实战:从坐标定位到图层融合

本文详细介绍了腾讯地图自定义瓦片地图开发的全流程,从坐标定位到图层融合的实战技巧。通过具体代码示例和常见问题解决方案,帮助开发者快速掌握腾讯地图API的自定义瓦片功能,实现室内外地图的无缝衔接和特殊图层的叠加展示。

weixin_42526015的博客 170

Mybatis创建

Mybatis 是一款优秀的持久层框架。 如何获取Mybatis maven仓库 <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6<

qq_39379958的博客 344

ICESat-2数据下载及处理分析随笔

ICESat-2全称是Ice,Cloud and land Elevation Satellite -2。看名字我们能知道它的任务是测ice,cloud和land elevation,而且这是一个Satellite,是一颗卫星。那么这里我们就要分清ICESat-2和ATLAS的关系,ICESat-2是星载平台,是一个space observatory,ATLAS是这个星载平台上搭载的单光子激光雷达系统。

u011322358的博客 1万+

comsol 多物理场仿真流程-以开关柜为例

1、主要方法 在SolidWorks中对于开关柜的内部与外部结构进行建模,生成能够导入软件计算的3D模型。将SolidWorks中的模型导入comsol软件中,设置参数进行多物理场耦合仿真。 1、具体步骤 删除高压开关柜中对其内部电磁环境无较大影响的结构,如低压测量柜、断路器内部结构等。 导入模型:将厂家提供的3D模型转化为solidworks结构模型。 修复模型:修复已转化模型中转化错误的部分、修复已转化模型中非实体部分、修复已转化模型中重叠实体部分 化简模型:去除过于...

健忘16的博客 7020

关于Mybatis的简单增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)

关于Mybatis的详细配置,以及简单的增删改查

CSH__的博客 752

基于 parallels ubuntu 20.04 LTS (focal) 的ros+px4+gazebo 安装

基于 parallels ubuntu 20.04 LTS (focal) 的ros+px4+gazebo 安装。

weixin_40132006的博客 2240

mybatis语句

1. 查询时,需要查询结果中的列名与返回值类型中的属性名保持一致 假设在t_user表中添加了新的名为is_delete的字段: alter table t_user add column is_delete int; 则对应的User类中也应该添加新的属性,以与对应: public class User { private Integer id; private String u...

zhyue28的博客 632

思科9117AP从零配置EWC模式实战:Wi-Fi6网络搭建避坑指南

本文详细介绍了思科9117AP在Wi-Fi6网络环境下配置EWC模式的实战指南,涵盖镜像准备、网络环境配置、模式转换步骤及高级运维技巧。通过EWC模式,企业可实现控制器与AP的一体化部署,显著降低成本和简化运维,特别适合中小企业Wi-Fi6网络搭建。

weixin_28318011的博客 332

玩转 InternVL3.5 轻量级实战:从部署到优化的全记录

玩转 InternVL3.5 轻量级实战:从部署到优化的全记录

jacke121的专栏 626

使用 MyBatis 实现基本的 CRUD 操作

MyBatis 是一个优秀的持久层框架,它通过 XML 或注解将 SQL 查询、存储过程以及 Java 对象关联起来,简化了数据持久层的开发。本文将详细介绍如何使用 MyBatis 实现基本的 CRUD(Create、Read、Update、Delete)操作。

FireFox1997 1395

【实战圣经】YOLOv8-pose姿态估计模型从训练到RK3588部署:让边缘端骨骼识别速度突破60FPS

本教程从“模型训练-转换-边缘部署”全链路拆解了YOLOv8-pose姿态估计方案在RK3588上的落地过程,每一步都经过实战验证。无论是智能健身的动作实时纠正,还是工业设备的关键部件姿态检测,这套流程都能让你以最低成本实现高精度、高实时性的姿态估计应用。如果你在实践中遇到模型转换报错、部署性能不达标等问题,可聚焦某一环节深入优化——毕竟,让AI在边缘端“精准捕捉每一个关键点”,才是技术驱动场景创新的核心。

m0_71589036的博客 251

Java学习路线:从零基础到项目实战的完整指南

Java作为企业级开发的核心语言,其学习路径涉及从基础语法到分布式架构的完整技术栈。理解面向对象编程原理是掌握Java的基础,而Spring Boot等框架则简化了企业应用的开发流程。在实际工程中,合理运用设计模式和中间件技术能够显著提升系统性能和可维护性。本文基于Java学习路线和项目实战等热词,为初学者提供一条清晰的学习路径,涵盖从环境搭建到微服务架构的全流程实践指导,帮助开发者高效构建可落地的技术能力体系。

weixin_30675247的博客 382

大模型长对话中上下文无法承载全部历史,如何压缩或提取重点

如果说截断和滑动窗口是“硬性”压缩,那摘要生成技术就显得“软”多了,也更接近于智能化的解决方案。它的思路是:不直接丢弃历史,而是通过自然语言处理(NLP)技术,把冗长的对话记录浓缩成一段简短的摘要,保留核心信息。这样既能大幅减少token数量,又不至于丢失关键内容。这种方法通常会借助预训练模型,比如BART或T5,它们擅长从长文本中提取重点内容。

大模型大数据攻城狮的专栏 1585

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring Boot 中使用 MyBatis 创建数据库表

在 SpringBoot 的 application.yml。创建一个用于和 Mapper 接口关联的 xml 文件。类中提供的创建表接口 /createTable。在 Maven 的 pom.xml。库中已经成功创建了 user。方法调用之前示例项目。中创建一个 user。

分享技术热点,看天下大事 1817

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

详解mybatis的create,retrieve,delete,update返回值。

首先是select User user = new User(); user.setName("l2"); user.setPassword("444"); int i = userMapper.addUser(user); System.out.println(i); &lt;select id="...

马一文 2万+

蓝牙模块HM-10手册

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

MyBatis项目的创建和增删查改操作详解

MyBatis是基于JDBC实现的,但是比JDBC的操作更加方便,可以通过接口和XML来操作数据库。如果try块中的代码抛出了一个与catch块中指定的类型相匹配的异常,那么该catch块就会被执行。异常处理是编程中的一个重要概念,它允许程序在运行时遇到错误或异常情况时,能够优雅地处理这些错误,而不是直接崩溃或终止。因此,在编写代码时需要做好异常非常抱歉,关于异常处理的主题,我接下来会继续展开。当try块中的代码抛出异常时,程序会立即跳转到相应的catch块(如果有的话)。

陈辰学长的博客 888

mybatis——注解方式执行DDL语句(create,drop,alter)

如果想执行DDL,则需要使用@Update注解。 例子: @Update("ALTER SYSTEM SWITCH LOGFILE") public void GenerateArchiveLog();  

qq_23418043的博客 1万+

mybatis快速搭建

一、简介 它是一款半自动的ORM持久层框架,具有较高的SQL灵活性,支持高级映射(一对一,一对多),动态SQL,延迟加载和缓存等特性,但它的数据库无关性较低。 二、数据库搭建 比如我当前只有id,username,userpwd三个字段 create database mybatis; use mybatis; create table user( id int NOT NULL primary key AUTO_INCREMENT , username varchar(20) not null,

周彰健的博客 1199

MyBatis CRUD标签:核心操作解析

在当今的软件开发领域,MyBatis 作为一款优秀的持久层框架,被广泛应用于各种项目中。尤其是在处理数据库操作时,CRUD(Create、Read、Update、Delete)操作是任何应用程序都不可或缺的部分。想象一下,一个电商网站在处理用户订单时,需要不断地创建新订单、读取订单信息、更新订单状态以及删除无效订单。如果没有高效的CRUD操作,那么整个网站的数据管理将变得异常复杂和低效。在这样的背景下,MyBatis的CRUD标签就成为了简化数据库操作、提高开发效率的关键。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 672

手撸Mybatis(五)——连接数据库进行insert,update和delete

可以看出,这里因为我们使用的是parameterType是int而不是java.lang.Integer,所以会报错,但是一般情况下,像int,float,long等小写,一般我们也会使用的,而且用的频率比java.lang.Integer的频率更大,那么,我们其实可以添加一个假名,将int这些小写的方式和对应的包装类关联起来。首先,我们在IUserMapper接口上,添加一个updateUserById方法。再次运行测试方法,这次没有报错了,然后我们查看数据库,结果如下,说明删除成功了。

weixin_55850954的博客 962

MyBatis执行DDL:create table,drop table等等

【前言】   对MyBatis一直停留在仅仅会用的阶段,常用的场景就是通过MyBatis对表数据进行DML(insert, delete, update等)操作,从来没有想过通过MyBatis对数据库 进行DDL(create, alter, drop)操作,最近的项目需要利用MyBatis对数据库进行DDL操作,自己就尝试了一把,对MyBatis又多了点儿了解。 【具体代码】 1、map...

brazier820104的专栏 9834

mybatis插件统一处理createTime,createBy,updateBy

前两天了解了一下mybatis插件这个东西,为了加深一下印象,突然想给当前代码做一个简化操作,通过插件的形式统一处理createTime,createBy,updateBy。 首先定义一个BaseEntity,里面放入这些参数 import java.io.Serializable; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; @Data public clas

lovely960823的博客 8436

mybatis 的 insert

mybatis 插入 mybatis新增数据 <insert id="insert"> insert into sys_user(id,user_name,user_password,user_email,user_info,head_img,create_time) values(#{id},#{userName},#{userPassword},#{userEmail}...

yinlell的博客 5万+

mybatis动态创建表

转自:https://www.cnblogs.com/Joanna-Yan/p/9187538.html 项目中业务需求的不同,有时候我们需要动态操作数据表(如:动态建表、操作表字段等)。常见的我们会把日志、设备实时位置信息等存入数据表,并且以一定时间段生成一个表来存储,log_201806、log_201807等。在这里我们用MyBatis实现,会用到动态SQL。 动态SQL是Mybatis的...

贾慧玉的博客 1万+
上一篇: 跟老杜从零入门MyBatis到架构思维(二)MyBatis入门程序
下一篇: 跟老杜从零入门MyBatis到架构思维(四)使用MyBatis完成CRUD- 下
Java摸鱼学习者
博客等级 码龄4年 2粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值