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

Mybatis_CRUD使用

目录

  • 1 Mybatis简介
      • 环境说明:
      • 预备知识:
    • 1.1 定义
    • 1.2 持久化
      • 为什么需要持久化服务呢?
    • 1.3 持久层
    • 1.4 为什么需要Mybatis
  • 2 依赖配置
  • 3 CRUD
    • namespace
    • select (查询用户数据)
    • ※传值方式:
      • 于方法中传值
      • 使用Map传值
    • insert (插入用户信息)
    • update (更新用户数据)
    • delect(删除用户数据)
    • 总结
    • 拓展

1 Mybatis简介

环境说明:

  • jdk 8 +
  • MySQL 5.7.19
  • maven-3.6.0
  • IDEA

预备知识:

  • JDBC
  • MySQL
  • Java 基础
  • Maven
  • Junit

1.1 定义

  • MyBatis 是一款优秀的持久层框架
  • MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程
  • MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类 【POJO(Plain Old Java Objects),普通的 Java对象】映射成数据库中的记录。
  • MyBatis 本是apache的一个开源项目ibatis, 2010年这个项目由apache 迁移到了google code,并且改名为MyBatis 。
  • 2013年11月迁移到Github .
  • Mybatis官方文档 : http://www.mybatis.org/mybatis-3/zh/index.html
  • GitHub : https://github.com/mybatis/mybatis-3

1.2 持久化

持久化是将程序数据在持久状态和瞬时状态间转换的机制。把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。
JDBC就是一种持久化机制。文件IO也是一种持久化机制。

为什么需要持久化服务呢?

内存断电后数据会丢失,但有一些对象是无论如何都不能丢失的,所以会出现持久化机制。

1.3 持久层

完成持久化工作的代码块称之为 “持久层”(dao (Data Access Object) 数据访问对象)。
数据持久化往往也就意味着将内存中的数据保存到磁盘上加以固化,而持久化的实现过程则大多通过各种关系数据库来完成。
所谓的“层”。对于应用系统而言,数据持久层大多是必不可少的组成部分。
在我们的系统架构中,会一个相对独立的逻辑层面,专著于数据持久化逻辑的实现。
而对于系统其他方面而言,这个层面会有着一个较为清晰和严格的数据逻辑边界,用来操作数据的存在。
※与数据库进行交互。

1.4 为什么需要Mybatis

  • Mybatis就是帮助程序猿将数据存入数据库中 , 和从数据库中取数据.
  • 传统的jdbc,会出现许多重复代码:数据取出的封装,数据库的建立连接,使用框架可以减少此类相关重复代码的出现。
  • Mybatis 是一个半自动化的ORM(Object Rekationship Mapping)框架。(对象映射关系)。
  • 使用Mybatis机制,可以将许多雍余的代码简单化。

2 依赖配置

搭建实验数据库

CREATE DATABASE `mybatis`;
USE `mybatis`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` int(20) NOT NULL,`name` varchar(30) DEFAULT NULL,`pwd` varchar(30) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert  into `user`(`id`,`name`,`pwd`) values (1,'狂神','123456'),(2,'张三','abcdef'),(3,'李四','987654');

导入MyBatis相关 jar 包

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.2</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version>
</dependency>

编写MyBatis核心配置文件:配置JDBC

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><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://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><mapper resource="com/sts/dao/userMapper.xml"/></mappers>
</configuration>

编写MyBatis工具类

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 java.io.IOException;
import java.io.InputStream;
public class MybatisUtils {private static SqlSessionFactory sqlSessionFactory;static {try {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}//获取SqlSession连接public static SqlSession getSession(){return sqlSessionFactory.openSession();}
}

创建实体类

public class User {private int id;  //idprivate String name;   //姓名private String pwd;   //密码//构造,有参,无参//set/get//toString()
}

编写Mapper接口类

import com.sts.pojo.User;
import java.util.List;
public interface UserMapper {List<User> selectUser();
}

编写Mapper.xml配置文件
※Mybatis核心处理功能地方,namespace非常重要

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sts.dao.UserMapper"><select id="selectUser" resultType="com.sts.pojo.User">select * from user</select>
</mapper>

测试类(Junit)

public class MyTest {@Testpublic void selectUser() {SqlSession session = MybatisUtils.getSession();//方法一://List<User> users = session.selectList("com.sts.mapper.UserMapper.selectUser");//方法二:UserMapper mapper = session.getMapper(UserMapper.class);List<User> users = mapper.selectUser();for (User user: users){System.out.println(user);}session.close();}
}

3 CRUD

namespace

namespace的名称对应的Mapper接口或是Dao,都是完整的包名,必须一致!
Dao层是进行与数据库关联的持久层。

select (查询用户数据)

select标签是mybatis中最常用的标签之一
select语句有很多属性 可以详细配置每一条的SQL语句

  • id
    • 命名空间中的唯一标识符;
    • 接口的方法名与映射文件中的SQL语句ID交相对应
  • parameterType
    • 传入SQL语句的参数类型 。【万能的Map,可以多尝试使用】
  • resultType
    • SQL语句返回值类型。【完整的类名或者别名】
      UserMapper.java
public interface UserMapper {//查询全部用户List<User> selectUser();//根据id查询用户User selectUserById(int id);
}

在UserMapper.xml中添加Select语句

<select id="selectUserById" resultType="com.sts.pojo.User">select * from user where id = #{id}
</select>

编辑测试类

@Test
public void tsetSelectUserById() {SqlSession session = MybatisUtils.getSession();  //获取SqlSession连接UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.selectUserById(1);System.out.println(user); // 打印SQL查询出来的数据session.close(); // 关闭session
}

※传值方式:

于方法中传值

在接口方法的参数前加 @Param属性
Sql语句编写的时候,直接取@Param中设置的值即可,不需要单独设置参数类型

//通过密码和名字查询用户
User selectUserByNP(@Param("username") String username,@Param("pwd") String pwd);
/* --查询语句的sql<select id="selectUserByNP" resultType="com.kuang.pojo.User">select * from user where name = #{username} and pwd = #{pwd}</select>
*/

使用Map传值

在接口方法中,参数直接传递Map;

User selectUserByNP2(Map<String,Object> map);

编写sql语句的时候,需要传递参数类型,parameterType参数类型为map

<select id="selectUserByNP2" parameterType="map" resultType="com.sts.pojo.User">select * from user where name = #{username} and pwd = #{pwd}
</select>

在使用方法的时候,Map的 key 为 sql中取的数值。

Map<String, Object> map = new HashMap<String, Object>();
map.put("username","小明"); //前往sql中进行赋值的username
map.put("pwd","123456"); //前往sql中进行赋值的pwd
User user = mapper.selectUserByNP2(map);

注意:如果在使用sql的时候,进行传值的参数过多,可以使用Map实现,如果参数较少,直接传递参数即可。

insert (插入用户信息)

使用insert标签的时候,我们一般进行插入操作,相关配置与select标签一致。
有点需要注意的是:insert、update、delect都是需要进行事务操作,进行commit操作

在UserMapper接口中添加对应的方法

//添加一个用户
int addUser(User user);

在UserMapper.xml中添加insert语句

<insert id="addUser" parameterType="com.sts.pojo.User">insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>

junit测试

@Test
public void testAddUser() {SqlSession session = MybatisUtils.getSession();UserMapper mapper = session.getMapper(UserMapper.class);User user = new User(5,"王五","zxcvbn");int i = mapper.addUser(user);System.out.println(i);session.commit(); //提交事务,重点!不写的话不会提交到数据库session.close();
}

update (更新用户数据)

//修改一个用户 User集合对象
int updateUser(User user);
<update id="updateUser" parameterType="com.sts.pojo.User">update user set name=#{name},pwd=#{pwd} where id = #{id}
</update>
@Test
public void testUpdateUser() {SqlSession session = MybatisUtils.getSession();UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.selectUserById(1);user.setPwd("asdfgh");int i = mapper.updateUser(user);System.out.println(i);session.commit(); //提交事务,重点!不写的话不会提交到数据库session.close();
}

delect(删除用户数据)

//删除一个用户 id 单一条件
int deleteUser(int id);
<delete id="deleteUser" parameterType="int">delete from user where id = #{id}
</delete>
@Test
public void testDeleteUser() {SqlSession session = MybatisUtils.getSession();UserMapper mapper = session.getMapper(UserMapper.class);int i = mapper.deleteUser(5);System.out.println(i);session.commit(); //提交事务,重点!不写的话不会提交到数据库session.close();
}

总结

  • 所有的数据有所更新数据库操作的场合都要 提交事务;
  • 接口所有的普通参数,尽量都写上@Parmam,尤其是传输多个参数的场合;
  • 有时因为业务需要,使用map进行传递参数;
  • 为相关规范,在SQL的配置中,我们应尽量将ParameterresultType这两个参数都写上。

拓展

like操作: 模糊查询的操作方式


在java中加入sql通配符

string wildcardname =%smi%;
list<name> names = mapper.selectlike(wildcardname);
<select id=”selectlike”>select * from foo where bar like #{value}
</select>

string wildcardname = “smi”;
list<name> names = mapper.selectlike(wildcardname);

在sql中拼接通配符

<select id=”selectlike”>select * from foo where bar like "%"#{value}"%"
</select>

相关文章:

Mybatis_CRUD使用

目录1 Mybatis简介环境说明:预备知识:1.1 定义1.2 持久化为什么需要持久化服务呢&#xff1f;1.3 持久层1.4 为什么需要Mybatis2 依赖配置3 CRUDnamespaceselect &#xff08;查询用户数据&#xff09;※传值方式&#xff1a;于方法中传值使用Map传值insert &#xff08;插入用…...

JVM的过程内分析和过程间分析有什么区别?

问&#xff1a; 目前所有常见的Java虚拟机对过程间分析的支持都相 当有限&#xff0c;要么借助大规模的方法内联来打通方法间的隔阂&#xff0c;以过程内分析&#xff08;Intra-Procedural Analysis&#xff0c; 只考虑过程内部语句&#xff0c;不考虑过程调用的分析&#xff…...

LearnDash测验报告如何帮助改进您的课程

某一个场景。Pennywell 大学有一门课程“Introduction to Linear Algebra”。上学期进行了两次测验。20% 的学生在第一次测验中不及格&#xff0c;而 80% 在第二次测验中不及格。在进一步评估中&#xff0c;观察到第一次测验不及格的学生在第二次测验中也不及格。在第二次测验中…...

如何通过Java将Word转换为PDF

Word是我们日常编辑文档内容时十分常用的一种文档格式。但相比之下&#xff0c;PDF文档的格式、布局更为固定&#xff0c;不易被更改。在保存或传输较为重要的文档内容时&#xff0c;PDF文档格式也时很多人的不二选择。很多时候我们都会遇到需要将Word转换为PDF的情况。下面我就…...

DOM型XSS

DOM型XSSDOM是什么DOM型XSSDOM型XSS实操DOM是什么 DOM就是Document。 文档是由节点构成的集合&#xff0c;在DOM里存在许多不同类型的节点&#xff0c;主要有&#xff1a;元素节点、文本节点&#xff0c;属性节点。 元素节点&#xff1a;好比< body >< p >< h …...

04-项目立项:项目方案、可行性分析、产品规划、立项评审

文章目录4.1 项目方案立项阶段4.2 可行性分析4.3 产品规划4.4 立项评审4.4.1 立项说明书的主要内容4.4.2 立项评审流程章节总结4.1 项目方案 学习目标&#xff1a; 能够输出产品项目方案 项目开发设计流程的主要阶段&#xff1a; 立项阶段 → 设计阶段 → 开发阶段 → 测试阶…...

数据分享|NPP VIIRS夜间灯光数据(2012-2020逐月)

2011年10月美国的“索米”国家极轨卫星伙伴卫星(Suomi National Polar-orbiting Partnership or Suomi NPP)发射,它搭载的VIIRS传感器上有一个称为DNB(Day Night Band)的波段能够在500米分辨率(比原来的OLS提高6倍)的尺度上对地表开展每天覆盖全球一次的高灵敏度(比OLS提…...

网络概论笔记

概论 网络研究的是节点和边 移动互联到物联网时代&#xff0c;只有有互联网&#xff0c;网络就不会落伍 协议&#xff1a;对等层面的实体固定的通信规则 协议包括&#xff1a;语法&#xff0c;语义&#xff0c;格式&#xff0c;次序&#xff0c;动作 网络是任意连接的 服务…...

软工2023个人作业二——软件案例分析

项目内容这个作业属于哪个课程2023年北航敏捷软件工程这个作业的要求在哪里个人作业-软件案例分析我在这个课程的目标是学习并掌握现代软件开发和项目管理技术&#xff0c;体验敏捷开发工作流程这个作业在哪个具体方面帮助我实现目标从软件工程角度分析比较我们所熟悉的软件&am…...

python数据分析表格文档Excel数据分析器统计源码

wx供重浩&#xff1a;创享软件 对话框发送&#xff1a;python表格 获取完整源码源文件说明文档可执行文件等 在PyCharm中运行《Excel数据分析师》即可进入如图1所示的系统主界面。在该界面中&#xff0c;通过顶部的工具栏可以选择所要进行的操作。 具体的操作步骤如下&#xff…...

Istio Sidecar启动顺序 - 导致的应用容器网络不通

目录一、问题二、Istio 1.7及其之后版本的解决方案2.1 方式1&#xff1a;安装Istio时全局设置2.2 方式2&#xff1a;在应用Deployment通过annotation设置2.3 holdApplicationUntilProxyStarts启用效果三、Istio 1.7之前的解决方案一、问题 线上应用集成了Spring Cloud K8S Con…...

3696. 构造有向无环图

Powered by:NEFU AB-IN Link 文章目录3696. 构造有向无环图题意思路代码3696. 构造有向无环图 题意 Codeforces Round 656 (Div. 3) E 给定一个由 n个点和 m条边构成的图。 不保证给定的图是连通的。 图中的一部分边的方向已经确定&#xff0c;你不能改变它们的方向。 剩下的边…...

RuoYi-Flowable-Plus(代码生成)

RuoYi-Flowable-Plus搭建 若依所有扩展项目的代码生成功能都是一样的&#xff0c;RuoYi-Flowable-Plus为例来演示。 模块创建 1.创建新模块ruoyi-student2.编辑RuoYi-Flowable-Plus\pom.xml <dependency><groupId>com.ruoyi</groupId><artifactId>ruoy…...

训练CV模型常用的方法与技巧

最近参加一个CV比赛&#xff0c;看到有参赛者分享了自己训练图像识别模型时常用到的小技巧&#xff0c;故对其进行记录、整理&#xff0c;方便未来继续学习。整理了很多&#xff0c;它们不一定每次有用&#xff0c;但请记在心中&#xff0c;说不定未来某个任务它们就发挥了作用…...

[Java·算法·中等]LeetCode22. 括号生成

每天一题&#xff0c;防止痴呆题目示例分析思路1题解1分析思路2题解2分析思路3题解3&#x1f449;️ 力扣原文 题目 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 输入&#xff1a;n 3 输出&…...

Git项目合并实践

Git项目合并实践 一、前言 环境 操作系统&#xff1a;Windows 10 专业版 代码托管平台&#xff1a;Gitee 场景 同一个项目&#xff0c;在某一个时间点&#xff0c;被另外一个团队拷贝和修改&#xff0c;并且代码不在同一个仓库&#xff0c;最后需要合并项目 不是同一个项…...

C++实战md5、base64算法实现(附源码)

C++常用功能源码系列 文章目录 C++常用功能源码系列前言一、常用加密算法1. md5是什么二、源码1. md52. base64、decode总结前言 本文是C/C++常用功能代码封装专栏的导航贴。部分来源于实战项目中的部分功能提炼,希望能够达到你在自己的项目中拿来就用的效果,这样更好的服务…...

P6专题:P6 EPPM和PPM基本概念

目录 引言 Oracles Primavera P6 Enterprise Project Portfolio Management&#xff08;P6 EPPM&#xff09; Oracles Primavera P6 Professional Project Management 引言 Oracle Primavera系列软件专注于项目密集型企业&#xff0c;其整个项目生命周期内所有项目的组合管…...

【为什么事务@Transactional会失效】

在Spring框架中&#xff0c;Transactional注解用于声明一个方法需要被包含在事务中&#xff0c;以确保数据库操作的一致性和完整性。Transactional注解通常用于Service层或DAO层的方法上。 Transactional注解失效可能是由以下原因引起的&#xff1a; 注解未被正确声明或配置&a…...

NLP中的对话机器人——模型的评估

引言 本文是七月在线《NLP中的对话机器人》的视频笔记&#xff0c;主要介绍FAQ问答型聊天机器人的实现。 模型的评估 我们如何评估模型的好坏&#xff1f;由于我们的数据集没有提供测试数据&#xff0c;所以我们很难评估模型的好 坏。如果我们要做非常严谨的评估&#xff0c…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...