02【MyBatis框架的CRUD】

news2025/7/9 13:50:06

二、MyBatis框架的CRUD

重新搭建一个新的MyBatis环境,进行MyBatis的CRUD测试;

参考:01【MyBatis-快速入门】

2.1 新增

2.1.1 dao接口

package com.dfbz.dao;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
import com.dfbz.entity.Emp;

public interface EmpDao {
    void save(Emp emp);
}

2.1.2 接口映射

<?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="com.dfbz.dao.EmpDao">

    <!--
        id: 标识唯一一条SQL语句,和接口方法名保持一致
        parameterType:SQL语句的入参类型,也就是方法参数
        #{}:取值符号
        #{name}:对应的是Emp对象的属性
    -->
    <insert id="save" parameterType="com.dfbz.entity.Emp">
        insert into emp values(null,#{name},#{age},#{addr},#{salary})
    </insert>
</mapper>

2.1.3 代码测试

package com.dfbz.test;

import com.dfbz.dao.EmpDao;
import com.dfbz.entity.Emp;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

public class Demo01 {
    @Test
    public void test1() throws IOException {
        //获取主配置文件流
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");

        //获取工厂构造器对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

        //获取session工厂
        SqlSessionFactory factory = builder.build(is);

        //获取session会话对象,与数据交互会话
       	/*
            true: 自动提交
            false: 手动提交(默认值)
         */
        SqlSession session = factory.openSession(true);			// 是否开启自动提交,默认值:false

        EmpDao empDao = session.getMapper(EmpDao.class);

        // 封装数据
        Emp emp = new Emp(null,"小兰",20,"湖北襄阳",5000.0);

        // 执行保持
        empDao.save(emp);

        //释放资源
        session.close();

        is.close();
    }
}

2.1.4 保持返回ID值

Emp emp = new Emp(null, "小红", 18, "江西抚州", 7000.0);
System.out.println("保存之前: " + emp);

empDao.save(emp);

System.out.println("保存之后前: " + emp);

执行结果:

在这里插入图片描述

1)方法一

数据库查询自增长主键的值

在dao接口中扩展一个方法:

void save2(Emp emp);

在这里插入图片描述

dao接口映射:

<!--
    selectKey:相当于执行MySQL LAST_INSERT_ID()函数
        keyColumn:列名称
        keyProperty:实体属性名称
        resultType:类型
        order:
            after:在数据插入之后获取值(适用于列自增)
            before:在数据插入之前获取值(适用于oracle的序列增长)
-->
<insert id="save2" parameterType="com.dfbz.entity.Emp">

    <selectKey keyColumn="id" keyProperty="id" resultType="Integer" order="AFTER">
        select LAST_INSERT_ID()
    </selectKey>
    insert into emp values(null,#{name},#{age},#{addr},#{salary})
</insert>

测试:

在这里插入图片描述

2)方法二

适合支持主键自增长的数据库

  • 1)在dao接口中扩展一个新的方法:
void save3(Emp emp);
  • 2)在EmpDao.xml配置文件中编写:
<!--
    只支持主键自增长的数据库。在oracle中不能使用,因为需要查询序列值
    useGeneratedKeys="true" 获取主键值
-->
<insert id="save3" parameterType="com.dfbz.entity.Emp" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
    insert into emp values(null,#{name},#{age},#{addr},#{salary})
</insert>

2.2 修改

2.2.1 dao接口

void update(Emp emp);

2.2.2 接口映射

<!--修改-->
<update id="update" parameterType="com.dfbz.entity.Emp">
    update emp set name=#{name},age=#{age},addr=#{addr},salary=#{salary} where id=#{id}
</update>

2.2.3 测试

  • 1)抽取创建Session的公共方法:
private SqlSession session = null;
private EmpDao empDao = null;

@Before
public void before() throws Exception {
    // 1. 创建Session工厂的构建对象
    SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();

    // 2. 通过工厂构建对象来创建一个Session工厂
    SqlSessionFactory sessionFactory = factoryBuilder.build(Resources.getResourceAsStream("MyBatisConfig.xml"));

    // 3. 通过session工厂来创建session
    session = sessionFactory.openSession();
    
    // 4. 通过session获取Mapper接口
    empDao = session.getMapper(EmpDao.class);
}

@After
public void after() throws Exception {
    session.close();
}
  • 2)测试代码:
@Test
public void test2() throws IOException {
    // 封装数据
    Emp emp = new Emp(1, "小灰", 22, "江西南昌", 5000.0);

    // 执行修改
    empDao.update(emp);
}

2.3 删除

2.3.1 dao接口

void delete(Integer id);

2.3.2 接口映射

<!--删除,入参是Integer类型-->
<delete id="delete" parameterType="java.lang.Integer">
    delete from emp where id=#{id}
</delete>

2.4 查询

2.4.1 dao接口

Emp findById(Integer id);

List<Emp> findAll();

2.4.2 接口映射

<!--
    parameterType:入参类型(方法形参)
    resultType:出参类型(方法返回值)
-->
<select id="findById" parameterType="java.lang.Integer" resultType="com.dfbz.entity.Emp">
    select * from emp where id=#{id}
</select>

<!--
    parameterType:入参类型(方法形参)
    resultType:出参类型(方法返回值)
-->
<select id="findByNameLike" parameterType="java.lang.String" resultType="com.dfbz.entity.Emp">
    select * from emp where name like #{name}
</select>

3.5.3 测试

  • 测试代码:
@Test
public void test3() throws IOException {
    // 根据id查询
    Emp emp = empDao.findById(1);
    System.out.println(emp);
}

@Test
public void test4() throws IOException {

    List<Emp> empList = empDao.findAll();
    for (Emp emp : empList) {
        System.out.println(emp);
    }
}

2.5 统计

2.5.1 dao接口

Long count();

2.5.2 接口映射

<!--统计-->
<select id="count" resultType="java.lang.Long">
    select count(1) from emp
</select>

2.5.3 测试

@Test
public void test5() throws IOException {
    Long count = empDao.count();
    System.out.println("查询到: " + count + "条记录");
}

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

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

相关文章

秒杀系统设计(微服分布式)

流程图(分布式) 例子 现场要卖1000件下面这个婴儿纸尿裤&#xff0c;根据以往这样秒杀活动的数据经验来看&#xff0c;目测来抢这100件纸尿裤的人足足有10万人 问题 高并发 秒杀的特点就是这样时间极短、 瞬间用户量大。 正常的店铺营销都是用极低的价格配合上短信、APP的…

自制操作系统日记(6):静态桌面初步

代码仓库地址&#xff1a;https://github.com/freedom-xiao007/operating-system 简介 在上篇中我们成功的加载跳转执行了C语言的代码&#xff0c;本篇中将跟随书籍&#xff0c;初步展示了一个系统页面的初步界面&#xff0c;看到桌面那刻还是有点意思的 最终结果展示 不多…

贵的键盘就一定好吗?程序员该怎样选择一款适合自己的键盘呢,来这里参考下吧

&#x1f3ac; 博客主页&#xff1a;https://xiaoy.blog.csdn.net &#x1f3a5; 本文由 呆呆敲代码的小Y 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;Unity系统学习专栏 &#x1f332; 游戏制作专栏推荐&#xff1a;游戏制作 &…

唯亚威VIAVIFiberChek Sidewinder光纤手持式检测仪

唯亚威FiberChek Sidewinder 是业界“全功能”手持式检测和分析解决方案&#xff0c;适用于诸如 MPO 等多光纤连接器。唯亚威VIAVI 屡获殊荣的 FiberChek 系列中的这款最新产品提供了一个完全自动化的解决方案&#xff0c;可对 MPO 或其他多光纤连接器中的每条光纤进行检测和分…

C. Peaceful Rooks(并查集找环)

Problem - 1411C - Codeforces 题意: 你会得到一个nn的棋盘。棋盘的行和列从1到n编号。单元格(x,y)位于列号x和行号y的交点上。 车是一个棋子&#xff0c;它可以在一个回合内垂直或水平地移动任何数量的单元。棋盘上有m个车(m<n)&#xff0c;其放置方式是没有一对车互相攻…

空间金字塔池化Spatial Pyramid Pooling

1. 概述 通常在卷积神经网络CNN中主要是由卷积层&#xff08;包括Convolution和Pooling两部分组成&#xff09;和全连接层组成&#xff0c;对于任意一张大小的图片&#xff0c;通常需要通过裁剪或者拉伸变形的方式将其转换成固定大小的图片&#xff0c;这样会影响到对图片的识…

从源码角度分析Mybatis级联映射的实现原理

Mybatis是一个半自动化ORM框架&#xff0c;可以将数据库中的记录转换为java实体对象&#xff0c;但是java实体属性通常采用驼峰命名法&#xff0c;而数据库字段习惯采用下划线分隔命名法&#xff0c;因此需要用户指定java实体属性与数据库表字段之间的映射关系。 mybatis的Mapp…

智慧网格解决方案-最新全套文件

智慧网格解决方案-最新全套文件一、建设背景二、思路架构三、建设方案1、民生管理2、网格化管理3、智慧党建4、网上政务5、综治管理四、获取 - 智慧网格全套最新解决方案合集一、建设背景 在我国现代化转型中&#xff0c;社会环境的复杂性和不确定性增强&#xff0c;传统的基层…

智能合约开发 基于Hardhat(实操)

Hardhat是一个编译、部署、测试和调试以太坊应用的开发环境。 ​ Hardhat内置了Hardhat网络&#xff0c;这是一个专为开发设计的本地以太坊网络。主要功能有Solidity调试&#xff0c;跟踪调用堆栈、 console.log() 和交易失败时的明确错误信息提示等 ​安装 # 创建项目目录 …

TSRFormer:复杂场景的表格结构识别新利器

编者按&#xff1a;近年来&#xff0c;各大企业和组织机构都在经历数字化转型。将文档转换成计算机所能识别的样态&#xff0c;是数字化转型的关键步骤&#xff0c;如何识别出图片中表格具体的结构与内容&#xff0c;并直接提取其中的数据和信息是学术界和工业界共同瞩目的焦点…

C语言操作符大全(建议收藏)

前言 &#x1f496;作者&#xff1a;龟龟不断向前 ✨简介&#xff1a;宁愿做一只不停跑的慢乌龟&#xff0c;也不想当一只三分钟热度的兔子。 &#x1f47b;专栏&#xff1a;C初阶知识点 &#x1f47b;工具分享&#xff1a; 刷题&#xff1a; 牛客网 leetcode笔记软件&#xff…

操作系统4小时速成:进程管理占考试40%,进程状态,组织,通信,线程拥有调度,进程拥有资源,进程和线程的区别

操作系统4小时速成&#xff1a;进程管理占考试40%&#xff0c;进程状态&#xff0c;组织&#xff0c;通信&#xff0c;线程拥有调度&#xff0c;进程拥有资源&#xff0c;进程和线程的区别 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招…

生活中的5 个自动化Python 项目——从初学者到高级(附零基础学习教程)

前言 如果你正在学习 Python&#xff0c;你应该尝试自动化你的日常任务。&#xff08;文末送读者福利&#xff09; 您不仅可以通过实现您已经知道的知识来学习更多 Python&#xff0c;而且最终&#xff0c;您可以看到所有的辛勤工作是如何得到回报的。 最近&#xff0c;由于…

拉格朗日粒子扩散FLEXPART模式

当前&#xff0c;大气污染是我国重要的环境问题之一。为了高效、精准地治理区域大气污染&#xff0c;需要弄清污染物的来源。拉格朗日粒子扩散模式FLEXPART通过计算点、线、面或体积源释放的大量粒子的轨迹&#xff0c;来描述示踪物在大气中长距离、中尺度的传输、扩散、干湿沉…

第五节.常用Linux命令—远程管理

第五节.常用Linux命令—远程管理 1.关机/重启&#xff1a;(shutdown) 1).命令格式: 命令作用shutdown 选项 时间关机/重新启动 2).常用命令: 命令含义shutdown -r now重新启动操作系统&#xff0c;其中now表示现在shutdown now立刻关机&#xff0c;其中now表示现在shutdown …

热门Java开发工具IDEA入门指南——从Eclipse迁移到IntelliJ IDEA(一)

IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能是非常强大的。 本文…

css水平居中的几种方法

实现方法实现方法&#xff1a;定位 position 偏移值 left margin-left 回退定位 position 偏移值 left CSS-2d transform文字居中&#xff1a;text-align:center; 行内块元素弹性布局: display:flex; [推荐]实现方法&#xff1a; 1、添加 margin 值 auto 2、定位 positio…

[附源码]计算机毕业设计JAVA电影影评网

[附源码]计算机毕业设计JAVA电影影评网 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Mav…

企业 SDLC 安全生命周期管理

最近看了很多SDLC的东西&#xff0c;把其中比较重要关键的记录一下&#xff0c;用简洁的语言说清楚 0x01 SDL 介绍 SDL是微软提出的一种软件开发安全生命周期管理的一种最佳安全实践&#xff0c;全称为Security Development Lifecycle 0x02 为什么要SDL 目的是为了从安全漏…

硕士论文阅读——基于机器视觉和深度学习的工人安全帽检测与身份识别方法

文章目录零、摘要一、绪论1、背景与研究意义2、国内外研究现状&#xff08;1&#xff09;安全帽佩戴检测研究现状与不足&#xff08;2&#xff09;身份识别研究现状与不足&#xff08;3&#xff09;基于深度学习的目标检测二、深度学习目标检测理论1、卷积神经网络&#xff08;…