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&useUnicode=true&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
- SQL语句返回值类型。【完整的类名或者别名】
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的配置中,我们应尽量将
Parameter
和resultType
这两个参数都写上。
拓展
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 持久化为什么需要持久化服务呢?1.3 持久层1.4 为什么需要Mybatis2 依赖配置3 CRUDnamespaceselect (查询用户数据)※传值方式:于方法中传值使用Map传值insert (插入用…...
JVM的过程内分析和过程间分析有什么区别?
问: 目前所有常见的Java虚拟机对过程间分析的支持都相 当有限,要么借助大规模的方法内联来打通方法间的隔阂,以过程内分析(Intra-Procedural Analysis, 只考虑过程内部语句,不考虑过程调用的分析ÿ…...

LearnDash测验报告如何帮助改进您的课程
某一个场景。Pennywell 大学有一门课程“Introduction to Linear Algebra”。上学期进行了两次测验。20% 的学生在第一次测验中不及格,而 80% 在第二次测验中不及格。在进一步评估中,观察到第一次测验不及格的学生在第二次测验中也不及格。在第二次测验中…...

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

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

04-项目立项:项目方案、可行性分析、产品规划、立项评审
文章目录4.1 项目方案立项阶段4.2 可行性分析4.3 产品规划4.4 立项评审4.4.1 立项说明书的主要内容4.4.2 立项评审流程章节总结4.1 项目方案 学习目标: 能够输出产品项目方案 项目开发设计流程的主要阶段: 立项阶段 → 设计阶段 → 开发阶段 → 测试阶…...
数据分享|NPP VIIRS夜间灯光数据(2012-2020逐月)
2011年10月美国的“索米”国家极轨卫星伙伴卫星(Suomi National Polar-orbiting Partnership or Suomi NPP)发射,它搭载的VIIRS传感器上有一个称为DNB(Day Night Band)的波段能够在500米分辨率(比原来的OLS提高6倍)的尺度上对地表开展每天覆盖全球一次的高灵敏度(比OLS提…...
网络概论笔记
概论 网络研究的是节点和边 移动互联到物联网时代,只有有互联网,网络就不会落伍 协议:对等层面的实体固定的通信规则 协议包括:语法,语义,格式,次序,动作 网络是任意连接的 服务…...

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

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

Istio Sidecar启动顺序 - 导致的应用容器网络不通
目录一、问题二、Istio 1.7及其之后版本的解决方案2.1 方式1:安装Istio时全局设置2.2 方式2:在应用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条边构成的图。 不保证给定的图是连通的。 图中的一部分边的方向已经确定,你不能改变它们的方向。 剩下的边…...

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

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

[Java·算法·中等]LeetCode22. 括号生成
每天一题,防止痴呆题目示例分析思路1题解1分析思路2题解2分析思路3题解3👉️ 力扣原文 题目 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 输入:n 3 输出&…...
Git项目合并实践
Git项目合并实践 一、前言 环境 操作系统:Windows 10 专业版 代码托管平台:Gitee 场景 同一个项目,在某一个时间点,被另外一个团队拷贝和修改,并且代码不在同一个仓库,最后需要合并项目 不是同一个项…...

C++实战md5、base64算法实现(附源码)
C++常用功能源码系列 文章目录 C++常用功能源码系列前言一、常用加密算法1. md5是什么二、源码1. md52. base64、decode总结前言 本文是C/C++常用功能代码封装专栏的导航贴。部分来源于实战项目中的部分功能提炼,希望能够达到你在自己的项目中拿来就用的效果,这样更好的服务…...
P6专题:P6 EPPM和PPM基本概念
目录 引言 Oracles Primavera P6 Enterprise Project Portfolio Management(P6 EPPM) Oracles Primavera P6 Professional Project Management 引言 Oracle Primavera系列软件专注于项目密集型企业,其整个项目生命周期内所有项目的组合管…...
【为什么事务@Transactional会失效】
在Spring框架中,Transactional注解用于声明一个方法需要被包含在事务中,以确保数据库操作的一致性和完整性。Transactional注解通常用于Service层或DAO层的方法上。 Transactional注解失效可能是由以下原因引起的: 注解未被正确声明或配置&a…...
NLP中的对话机器人——模型的评估
引言 本文是七月在线《NLP中的对话机器人》的视频笔记,主要介绍FAQ问答型聊天机器人的实现。 模型的评估 我们如何评估模型的好坏?由于我们的数据集没有提供测试数据,所以我们很难评估模型的好 坏。如果我们要做非常严谨的评估,…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...