当前位置: 首页 > news >正文

Mybatis方式完成CRUD操作

Mybatis方式完成CRUD操作

文章目录

  • Mybatis方式完成CRUD操作
    • 1、java以Mybatis方式操作DB
      • 1.1、配置数据源-创建 resources/mybatis-config.xml
      • 1.2、创建java bean-Monster
      • 1.3、配置Mapper接口声明方法
      • 1.4、配置xxMapper,完成SQL配置,实现CRUD操作
      • 1.5、Test测试
    • 2、需要的Utils工具类
    • 3、pom基础依赖
    • 4、数据库建表操作

Java开发在以前做数据库连接的时候通过JDBC来完成,非常麻烦。

现在引入了MyBatis这个框架,Mybatis是简化数据库操作的持久层框架。

使用Mybatis的好处:

  • mybatis 可以将对数据表的操作(sql,方法)等等直接剥离,写到 xml 配置文件,实现和 java 代码的解耦
  • MyBatis 在 java 和 sql 之间提供更灵活的映射

1、java以Mybatis方式操作DB

在这里插入图片描述

1.1、配置数据源-创建 resources/mybatis-config.xml

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--    配置mybatis自带的日志输出--><settings><setting name="logImpl" value="STDOUT_LOGGING"/></settings><!--    配置类型别名--><typeAliases><typeAlias type="com.linghu.entity.Monster" alias="Monster"/></typeAliases><environments default="development"><environment id="development"><!--            配置事务管理器--><transactionManager type="JDBC"/><!--            配置数据源--><dataSource type="POOLED"><!--                配置驱动--><property name="driver" value="com.mysql.jdbc.Driver"/><!--                配置数据库的链接--><property name="url"value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/><!--               数据库的用户名和密码--><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!--    这里设置我们需要管理的mapper.xml文件--><!--    可以通过快捷键copy这个地址--><mappers><mapper resource="com/linghu/mapper/MonsterMapper.xml"/></mappers></configuration>

1.2、创建java bean-Monster

创建bean的时候要对照自己设计的数据库表字段进行设计,要一一对应!

package com.linghu.entity;import java.util.Date;/*** @author 令狐荣豪* @version 1.0* Monster类和monster表有对应关系,字段要对应* 体现oop*/
public class Monster {private Integer id;private Integer age;private String name;private String email;private Date birthday;private double salary;private Integer gender;public Monster() {}public Monster(Integer id, Integer age, String name, String email, Date birthday, double salary, Integer gender) {this.id = id;this.age = age;this.name = name;this.email = email;this.birthday = birthday;this.salary = salary;this.gender = gender;}@Overridepublic String toString() {return "Monster{" +"id=" + id +", age=" + age +", name='" + name + '\'' +", email='" + email + '\'' +", birthday=" + birthday +", salary=" + salary +", gender=" + gender +'}';}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}public Integer getGender() {return gender;}public void setGender(Integer gender) {this.gender = gender;}
}

1.3、配置Mapper接口声明方法

package com.linghu.mapper;import com.linghu.entity.Monster;import java.util.List;/*** @author 令狐荣豪* @version 1.0* 定义增删改查的接口方法*/
public interface MonsterMapper {
//    添加monsterpublic void addMonster(Monster monster);//根据id删除一个Monsterpublic void delMonster(Integer id);//修改 Monsterpublic void updateMonster(Monster monster);//查询-根据 idpublic Monster getMonsterById(Integer id);//查询所有的 Monsterpublic List<Monster> findAllMonster();
}

1.4、配置xxMapper,完成SQL配置,实现CRUD操作

Monstermapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.linghu.mapper.MonsterMapper"><!--    <select id="selectBlog" resultType="Blog">-->
<!--        select * from Blog where id = #{id}-->
<!--    </select>-->
<!--    private Integer id;private Integer age;private String name;private String email;private Date birthday;private double salary;private Integer gender;--><insert id="addMonster" parameterType="com.linghu.entity.Monster">insert into `monster`(`age`,`birthday`,`email`,`gender`,`name`,`salary`)
<!--            values(10,null,'linghu@qq.com',1,'kate',1000),修改成活数据-->
<!--            下面的名称对应的Monster对象的属性名-->values(#{age},#{birthday},#{email},#{gender},#{name},#{salary})</insert><delete id="delMonster" parameterType="Integer">delete from `monster` where id=#{id};</delete><!--    这里的入参类型最好不要简写!-->
<!--    配置类型别名后这里可以简写Monster-->
<!--    <update id="updateMonster" parameterType="com.linghu.entity.Monster">--><update id="updateMonster" parameterType="Monster">update `monster` set `age`=#{age},`birthday`=#{birthday},`email`=#{email},`gender`=#{gender},`name`=#{name},`salary`=#{salary}where id=#{id}</update><!--     resultType是个别名--><select id="getMonsterById" parameterType="Integer" resultType="Monster">select * from `monster` where id=#{id};</select><!--    查询全部结果--><select id="findAllMonster" resultType="Monster">select * from `monster`;</select></mapper>

1.5、Test测试

package com.linghu.mapper;import com.linghu.entity.Monster;
import com.linghu.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;import java.util.Date;
import java.util.List;/*** @author 令狐荣豪* @version 1.0*/
public class MonsterMapperTest {private SqlSession sqlSession;private MonsterMapper monsterMapper;@Beforepublic void init(){//通过SqlSessionFactory获取一个SqlSession会话sqlSession= MyBatisUtils.getSqlSession();//获取MonsterMapper接口对象,该对象实现了MonsterMappermonsterMapper=sqlSession.getMapper(MonsterMapper.class);System.out.println(monsterMapper.getClass());}//    @Test
//    public void t1(){
//        System.out.println("t1()。。。");
//    }@Testpublic void addMonster(){for (int i=0;i<3;i++){Monster monster = new Monster();monster.setAge(10+i);monster.setBirthday(new Date());monster.setEmail("lignhu@qq.com");monster.setGender(1);monster.setName("松鼠精"+i);monster.setSalary(1000+i*10);
//            id不用设置monsterMapper.addMonster(monster);System.out.println("添加对象-"+monster);}//如果是增删改,需要提交事务if (sqlSession!=null){sqlSession.commit();sqlSession.close();}System.out.println("保存成功···");}@Testpublic void delMonster(){monsterMapper.delMonster(2);//如果是增删改,需要提交事务if (sqlSession!=null){sqlSession.commit();sqlSession.close();}System.out.println("删除成功···");}@Testpublic void updateMonster(){Monster monster = new Monster();monster.setAge(200);monster.setBirthday(new Date());monster.setEmail("hspedu@sohu.com");monster.setGender(2);monster.setName("狐狸精");monster.setSalary(9234.89);monster.setId(4);monsterMapper.updateMonster(monster);if (sqlSession != null) {sqlSession.commit();sqlSession.close();}System.out.println("修改 ok");}@Testpublic void getMonsterById(){
//        Monster monster = new Monster();Monster monster=monsterMapper.getMonsterById(6);System.out.println("monster="+monster);if (sqlSession != null) {sqlSession.commit();sqlSession.close();}System.out.println("查询 ok");}@Testpublic void findAllMonster(){ //查询全部结果List<Monster> allMonster = monsterMapper.findAllMonster();for (Monster monster :allMonster) {System.out.println(monster);}if (sqlSession != null) {sqlSession.close();}System.out.println("查询 ok");}
}

2、需要的Utils工具类

工具类MyBatisUtils.java

package com.linghu.util;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 javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;/*** @author 令狐荣豪* @version 1.0* 这是一个工具类,可以得到Sqlsession会话,这个会话提供了执行SQL命令的方法CRUD*/
public class MyBatisUtils {private static SqlSessionFactory sqlSessionFactory;static {//静态代码块-初始化sqlSessionFactory对象try {/*** 指定资源文件*/String resource="mybatis-config.xml";//指定资源文件流InputStream inputStream = Resources.getResourceAsStream(resource);//获取SqlSession实例sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}/*** 返回一个SQLSession会话,这个会话提供了执行SQL命令的方法CRUD* @return*/public static SqlSession getSqlSession(){return sqlSessionFactory.openSession();}
}

3、pom基础依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.linghu</groupId><artifactId>Linghu_Mybatis</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules>
<!--        这里可以看到父项目下有哪些子项目--><module>mybatisqucikstart</module></modules><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!-- 导入依赖 --><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies><!--    配置resources-->
<!--    配置目的:将src/main/java目录和子目录和src/main/resources目录和子目录的
资源文件xml和properties在build项目时,导出到对应的target目录下
--><build><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory><includes><include>**/*.xml</include><include>**/*.properties</include></includes></resource></resources></build></project>

4、数据库建表操作

CREATE DATABASE `mybatis`
CREATE TABLE `monster` (`id` INT NOT NULL AUTO_INCREMENT, `age` INT NOT NULL, `birthday` DATE DEFAULT NULL, `email` VARCHAR(255) NOT NULL , `gender` TINYINT NOT NULL, `name` VARCHAR(255) NOT NULL, `salary` DOUBLE NOT NULL,PRIMARY KEY (`id`)
) CHARSET=utf8

在这里插入图片描述
在这里插入图片描述

相关文章:

Mybatis方式完成CRUD操作

Mybatis方式完成CRUD操作 文章目录 Mybatis方式完成CRUD操作1、java以Mybatis方式操作DB1.1、配置数据源-创建 resources/mybatis-config.xml1.2、创建java bean-Monster1.3、配置Mapper接口声明方法1.4、配置xxMapper&#xff0c;完成SQL配置,实现CRUD操作1.5、Test测试 2、需…...

css背景 background的属性作用和值

当我们在 HTML 中设置背景时&#xff0c;可以使用 background 属性。这个属性有多个值&#xff0c;可以使用不同的值来设置背景图片、背景颜色、背景位置、背景重复等等。以下是用表格列出的常见的 background 属性的值及其作用&#xff1a; 属性值描述background-color设置背…...

六大行文化特色知识(上)

中国六大银行都是综合性大型商业银行&#xff0c;业务涵盖面广泛且多元&#xff0c;代表着中国金融界最雄厚的资本和实力&#xff0c;这也是为什么很多毕业生想进国有行的原因&#xff0c;今天小编就带大家来了解一下关于六大行的特色知识&#xff0c;从如信银行考试中心平台了…...

匿名对象的特性和使用场景你知道吗?

目录 一、匿名对象的概念 二、单参数和多参数构造场景的匿名对象 ①只有一个参数的构造函数 ②多个参数的构造函数 三、使用匿名对象作为函数的参数的缺省值 四、只为调用类中的一个函数时 五、匿名对象的特性 1、匿名对象的生命周期只有一行 2、匿名对象具有常性 3、当匿…...

企业应该如何做到数字化转型成功?

01 成长型企业数字化转型的意义 成长型企业想要实现数字化转型&#xff0c;那么我们需要先弄明白&#xff0c;对于成长型企业而言&#xff0c;数字化转型到底具有什么意义&#xff1f;希望实现哪些目标&#xff1f; 可以归结为以下四点&#xff1a; 提升企业的生产力和效率&…...

PBDB Data Service:Bibliographic references for fossil collections(采集记录参考书目)

Bibliographic references for fossil collections&#xff08;采集记录参考书目&#xff09; 描述用法参数以下参数可用于检索与通过各种条件选择的集合关联的引用您可以使用以下参数根据书目参考文献的属性筛选结果集以下参数也可用于筛选选择以下参数可用于根据所选匹配项的…...

浅析图形验证码安全

0x01 前言 验证码的定义&#xff1a; 验证码&#xff08;CAPTCHA&#xff09;是“Completely Automated Public Turing test to tell Computers and Humans Apart”&#xff08;全自动区分计算机和人类的图灵测试&#xff09;的缩写&#xff0c;是一种区分用户是计算机还是人的…...

论文笔记:基于手机位置信息的地图匹配算法

2015计算机应用 整体思路和论文笔记&#xff1a;Hidden Markov Map MatchingThrough Noise and Sparseness_UQI-LIUWJ的博客-CSDN博客 很像&#xff0c;也是应用HMM进行地图匹配 HMMM本文 状态转移矩阵 观测概率矩阵 正态分布均值都是0&#xff0c;唯一不同的是S…...

因果推断系列16-面板数据与固定效应

因果推断系列16-面板数据与固定效应 1.平行趋势2.未观测变量的控制3.固定效应4.固定效应可视化5.时间效应小结加载第三方包 import warnings warnings.filterwarnings(ignore)import pandas as pd import numpy as np from matplotlib import style from matplotlib import...

第三十三章 弹性池塘2(弹城少年歌词)

熟悉的K26&#xff0c;熟悉的漉菽香味&#xff0c;熟悉的絮絮叨叨。 为什么坎迪总有那么多话想说&#xff0c;就算恢复正常&#xff0c;自己应该也找不出如滔滔江水连绵不断的语词洪流吧。 不&#xff0c;不是词汇量的问题。 当你习惯于将金玉良言与废屁空套话区分开来时&#…...

PMP之预测部分

引论 什么是项目 项目是为创造独特的产品、服务或成果而进行的临时性工作。 项目管理是把事办成的方法论&#xff0c;万物皆可项目。 项目的基本要素 项目&#xff08;独特性、临时性&#xff09;、驱动变更、启动背景、创造商业价值。 组织级项目管理&#xff08;OPM&am…...

Node.js 异步流控制

目录 1、简介 2、状态管理 3、控制流 3.1、串联 3.2、完全并行 3.3、有限并行 1、简介 在其核心&#xff0c;JavaScript被设计为在“主”线程上是非阻塞的&#xff0c;这是呈现视图的位置。你可以想象这在浏览器中的重要性。例如&#xff0c;当主线程被阻塞时&#xff0…...

掌握这些思维技巧,解救996的打工人!

你身边有没有这样的人&#xff1a;面对堆积如山的工作、随时弹出的任务&#xff0c;接二连三的群也能游刃有余地处理。回看自己&#xff0c;旧的任务还在做&#xff0c;新的任务已经从天而降&#xff0c;日程表上满是任务却无从下手…… 明明忙个不停却成果甚微&#xff0c;这…...

【嵌入式Linux】MBR分区表 和 GPT分区表

文章目录 GUID以及分区表MBR分区方案GPT 分区方案GPT分区表结构 GPT分区表LBALBA0&#xff08;MBR兼容部分&#xff09;LBA1LBA 2-33python生成GPT分区表gpt分区表实例 gpt分区表查看查看百问网T113-s3固件查看友善之臂nanopi-m1-plus官方固件查看荣品RV1126固件查看f1c200s固件…...

【华为OD机试真题】MVP争夺战(python)100%通过率 超详细代码注释 代码解读

【华为OD机试真题 2022&2023】真题目录 @点这里@ 【华为OD机试真题】信号发射和接收 &试读& @点这里@ 【华为OD机试真题】租车骑绿道 &试读& @点这里@ MVP争夺战 知识点DFS搜索 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 在星球争霸篮球赛对…...

实战打靶集锦-019-BTRSys2.1

提示&#xff1a;本文记录了博主的一次普通的打靶经历 目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 FTP服务探查4.2 Apache服务探查4.2.1 wpscan扫描4.2.2 Metasploit神器4.2.3 手工探查页面4.2.3.1 Appearance Editor4.2.3.2 Plugins Editor 5. 提权5.1 系统信息枚…...

2023中国(苏州)国际电源工业展览会暨高端论坛

时间&#xff1a;2023年11月9&#xff5e;11日 地点&#xff1a;苏州国际博览中心 30000㎡展出面积 500参展商 50000名专业观众 中国电源行业风向标----相约苏州&#xff0c;共襄盛举&#xff01; ◆展会背景Exhibition background&#xff1a; …...

基于SpringBoot+Vue的校园疫情防控系统(附源码和数据库)

文章目录 第一章2.主要技术第三章第四章 系统设计4.1功能结构4.2 数据库设计4.2.1 数据库E/R图4.2.2 数据库表 第五章 系统功能实现5.1系统功能模块5.2后台功能模块5.2.1管理员功能 源码咨询 第一章 springboot校园疫情防控系统演示录像2022 一个好的系统能将校园疫情防控的管理…...

Docker启动安装nacos

当需要在本地或云环境中部署和管理微服务时&#xff0c;Nacos是一个非常流行的选择。Nacos是一个用于动态服务发现、配置管理和服务管理的开源平台。在本文中&#xff0c;我们将详细介绍如何使用Docker来启动和安装Nacos。 步骤1&#xff1a;安装Docker 首先&#xff0c;确保…...

FastDFS总结

目录 概述 什么是分布式文件系统 核心概念 目录结构 上传机制 下载机制 Linux中搭建FastDFS 常用指令 SpringBoot整合FastDFS FastDFS集成Nginx 概述 FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件&#xff…...

永磁同步电机矢量控制进阶:电流环前馈补偿的5个关键点与避坑指南

永磁同步电机矢量控制进阶&#xff1a;电流环前馈补偿的5个关键点与避坑指南 在工业伺服系统与新能源驱动领域&#xff0c;永磁同步电机&#xff08;PMSM&#xff09;凭借其高功率密度和动态响应特性占据主导地位。而电流环作为矢量控制的内环&#xff0c;其性能直接影响整个系…...

KART-RERANK大模型实战:Python爬虫数据智能排序与相关性分析

KART-RERANK大模型实战&#xff1a;Python爬虫数据智能排序与相关性分析 你是不是也遇到过这种情况&#xff1f;用Python爬虫吭哧吭哧抓了一大堆数据&#xff0c;结果发现里面什么都有&#xff1a;有用的、没用的、相关的、跑题的、高质量的、纯广告的……看着满屏的文本&…...

Anaconda环境下Lumerical lumapi模块导入失败的3种修复方法(实测有效)

Anaconda环境下Lumerical lumapi模块导入失败的深度解决方案 当你满怀期待地在Anaconda环境中安装完Lumerical相关组件&#xff0c;准备大展拳脚时&#xff0c;突然遭遇ModuleNotFoundError: No module named lumapi这样的错误提示&#xff0c;确实令人沮丧。这种情况在重装系…...

Z-Image-Turbo-rinaiqiao-huiyewunv开发者教程:gc.collect()+empty_cache显存防泄漏实践

Z-Image-Turbo-rinaiqiao-huiyewunv开发者教程&#xff1a;gc.collect()empty_cache显存防泄漏实践 1. 项目概述 Z-Image Turbo (辉夜大小姐-日奈娇)是基于Tongyi-MAI Z-Image底座模型开发的专属二次元人物绘图工具。该工具通过注入辉夜大小姐(日奈娇)微调safetensors权重&am…...

PROJECT MOGFACE技术解析:深入理解LSTM在序列建模中的替代与增强

PROJECT MOGFACE技术解析&#xff1a;深入理解LSTM在序列建模中的替代与增强 1. 引言 如果你在几年前接触过自然语言处理或者语音识别&#xff0c;那么“LSTM”这个词对你来说一定不陌生。它曾经是处理序列数据的黄金标准&#xff0c;从机器翻译到语音合成&#xff0c;几乎无…...

知识蒸馏(Knowledge Distillation, KD)详细介绍

知识蒸馏&#xff08;Knowledge Distillation, KD&#xff09;详细介绍 目录 概述基本概念知识蒸馏的核心思想蒸馏过程知识类型损失函数架构设计应用场景优化策略挑战与局限最新进展总结 概述 知识蒸馏&#xff08;Knowledge Distillation, KD&#xff09;是一种模型压缩和…...

实战电商用户行为分析:基于Dinky+Flink SQL构建实时数仓(Kafka→HBase→Doris全链路)

电商用户行为实时分析实战&#xff1a;基于Dinky与Flink SQL的全链路实现 电商平台每天产生海量用户行为数据&#xff0c;如何实时处理这些数据并快速生成业务洞察&#xff0c;成为提升用户体验和商业价值的关键。本文将手把手带你构建一个完整的实时分析系统&#xff0c;从Kaf…...

智能媒体捕获:猫抓cat-catch的资源拦截与解析技术方案

智能媒体捕获&#xff1a;猫抓cat-catch的资源拦截与解析技术方案 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓cat-catch作为一款开源浏览器扩展&#xff0c;通过深度网络请求分析与流媒体协议…...

从零开始:用CJQT构建跨平台数据可视化应用的入门教程

从零开始&#xff1a;用CJQT构建跨平台数据可视化应用的入门教程 【免费下载链接】CJQT 仓颉语言对qt封装库 项目地址: https://gitcode.com/Cangjie-TPC/CJQT 你是否在寻找一个能让数据可视化开发变得简单的开源框架&#xff1f;是否因复杂的跨平台适配问题而束手无策&…...

手把手教你用Vivado 2021配置Zynq UltraScale+ GTH回环测试(附工程源码)

Zynq UltraScale GTH回环测试实战指南&#xff1a;从原理到源码解析 在FPGA开发领域&#xff0c;高速串行接口的验证一直是工程师面临的关键挑战。Xilinx UltraScale架构中的GTH收发器以其高达16.3Gbps的线速率&#xff0c;成为医疗成像、雷达信号处理等高性能应用的理想选择。…...