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

Mybatis从入门到入土

一、什么是Mybatis

1)MyBatis 是一款优秀的持久层(DAO层)框架

2)MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程

3)MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类 【Plain Old Java Objects,普通的 Java对象】映射成数据库中的记录

二、Mybatis基础程序

1、pom.xml文件
在maven中引入mybatis和mysql的依赖

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

2、创建一个数据库表lsz_user

CREATE TABLE `lsz_user` (`id` int,`name` varchar(20),`pwd` varchar(20)
);
insert  into `lsz_user` values (1,'凯影','123'),(2,'螳螂','456');

3、mybatis-config.xml
mybatis的核心配置文件,在springboot项目中整合mybatis后,这个文件会被省略不写

<?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中内容顺序必须为(properties,settings,typeAliases,plugins,environments,,mappers)-->
<configuration><!--动态配置数据库属性--><properties resource="db.properties"/><!--这里可以设置一些配置,如日志,懒加载,缓存等--><settings><!--开启日志--><setting name="logImpl" value="STDOUT_LOGGING"/></settings><!--起别名--><typeAliases><typeAlias type="com.demo.pojo.User" alias="user"/></typeAliases><!--指定使用哪个数据库--><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><!--每个xml文件都要到这里注册--><mappers><mapper resource="com/demo/dao/UserMapper.xml"/></mappers></configuration>

3、外部文件配置数据库db.properties
这里mydatabse是自己的数据库名字

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydatabase?useSSL=false&useUnicode=true&characterEncoding=utf8
username=root
password=123456

4、编写MyBatisUtils工具类

package com.demo.utils;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;//工具类,为了获得sqlSession对象
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 getSqlSession(){//参数为true是自动提交事务SqlSession sqlSession=sqlSessionFactory.openSession(true);return sqlSession;}
}

在springboot项目中也会因为整合而省略

5、编写实体类User

package com.demo.pojo;public class User {private int id;  //idprivate String name;   //姓名private String pwd;   //密码public User(int id, String name, String pwd) {this.id = id;this.name = name;this.pwd = pwd;}public User() {}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", pwd='" + pwd + '\'' +'}';}
}

6、编写接口UserMapper

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

7、编写对应的xml配置文件UserMapper.xml

<?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.demo.dao.UserMapper"><select id="selectUser" resultType="com.demo.pojo.User">select * from lsz_user</select>
</mapper>

8、编写测试

import com.demo.dao.UserMapper;
import com.demo.pojo.User;
import org.apache.ibatis.session.SqlSession;
import com.demo.utils.MybatisUtils;import java.util.List;public class test {public static void main(String[] args) {SqlSession session = MybatisUtils.getSqlSession();UserMapper mapper = session.getMapper(UserMapper.class);List<User> users = mapper.selectUser();for (User user: users){System.out.println(user);}session.close();}
}

注:Maven静态资源过滤问题
以后所有项目下的pom.xml都加上以下代码,不然会报错,如找不到"com/demo/dao/UserMapper.xml“,即使我们在mapper中配置了

<build><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources>
</build>

目录结构如下
在这里插入图片描述

三、常用CRUD操作

1、根据id查询用户(一个参数)
在UserMapper中添加对应方法

User selectUserById(int id);

在UserMapper.xml添加select语句

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

2、根据密码和名字查询用户(多个参数)
方法一:增加 @Param属性
Sql语句编写时不需要设置参数类型parameterType
在UserMapper中添加对应方法

   User selectUserByNP(@Param("username") String username, @Param("pwd") String pwd);

在UserMapper.xml添加select语句

    <select id="selectUserByNP" resultType="com.demo.pojo.User">select * from lsz_user where name = #{username} and pwd = #{pwd}</select>

方法二:使用万能的Map
编写sql语句时需要传递参数类型,参数类型为map
在UserMapper中添加对应方法

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

在UserMapper.xml添加select语句

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

在测试的时候需要传递一个map,如下

        Map<String, Object> map = new HashMap<String, Object>();map.put("username","张三");map.put("pwd","123");User user = mapper.selectUserByNP2(map);

总结:参数过多使用Map实现,参数比较少,直接传递参数

3、添加一个用户
在UserMapper中添加对应方法

    int addUser(User user);

在UserMapper.xml添加insert语句

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

4、修改用户的信息

在UserMapper中添加对应方法

    int updateUser(User user);

在UserMapper.xml添加update语句

    <update id="updateUser" parameterType="com.demo.pojo.User">update lsz_user set name=#{name},pwd=#{pwd} where id = #{id}</update>

5、根据id删除一个用户

在UserMapper中添加对应方法

int deleteUser(int id);

在UserMapper.xml添加delete语句

   <delete id="deleteUser" parameterType="int">delete from lsz_user where id = #{id}</delete>

6、模糊查询
在UserMapper中添加对应方法

    List<User> selectlike(String value);

在UserMapper.xml添加select语句

    <select id="selectlike" resultType="com.demo.pojo.User">select * from lsz_user where name like #{value}</select>

测试

 mapper.selectlike("%张%");

小结:

  • 所有的增删改操作都需要提交事务,即session.commit();(但是我们在编写MybatisUtils工具类时设置了自动提交事务,就不用再写commit了)

  • 接口所有的普通参数,尽量都写上@Param参数,尤其是多个参数时,必须写上!

  • 有时候根据业务的需求,可以考虑使用map传递参数!

  • 为了规范操作,在SQL的配置文件中,我们尽量将Parameter参数和resultType都写上!

相关文章:

Mybatis从入门到入土

一、什么是Mybatis 1&#xff09;MyBatis 是一款优秀的持久层&#xff08;DAO层&#xff09;框架 2&#xff09;MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程 3&#xff09;MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c;将…...

修为 - 人生感悟

人不为己&#xff0c;天诛地灭。 说明一下&#xff0c;上面说的为己&#xff0c;指的是人的修为。 一个人&#xff0c;在成年之后&#xff0c;需要不断的对自己进行修为的提高。在经历了世事之后&#xff0c;对人生的感悟要不断地进行总结&#xff0c;提高自己的修为。 老祖宗给…...

UnityWebSocket | 双端通信支持Text/Binary

跳转官方仓库地址 有多个项目使用该库&#xff0c;平台有PC、WebGL。 一、说明 1&#xff09;原理 WebSocket是H5提供的一种浏览器与服务器进行全双工通讯的网络技术&#xff0c;属于应用层协议。数据通常在两个站&#xff08;点对点&#xff09;之间进行传输&#xff0c;按照…...

lazada详情

{“api”: “”, “data”: {“module”: “{“seller”:{“chatResponsiveRate”:{“labelText”:“Chat Response”,“value”:“100%”},“chatUrl”:“https://pages.lazada.com.my/wow/i/my/im/chat?brandId30768”,“hideAllMetrics”:false,“imEnable”:true,“imUser…...

企业为什么要数字化转型?

数字化转型是使用数字技术从根本上改变企业运营方式并为客户创造价值的过程。企业进行数字化转型&#xff0c;常见因素包括&#xff1a; 提高效率&#xff1a;数字化转型可以简化流程并自动执行重复性任务&#xff0c;从而减少执行这些任务所需的时间和精力。可以节省成本并提高…...

Excel 设置只能输入指定的字符

目录 1. 创建你要用的表格 2. 确定你要限定输入的行/ 列 3. 创建另一个sheet&#xff0c;用来保存限制输入的配置信息 4. 选中【是否外包】列&#xff0c;并选择数据验证 5. 设置数据限制 6. 确认结果 7. 不想设置配置sheet怎么办&#xff1f; 在工作中&#xff0c;你们…...

Web开发介绍

Web开发介绍 1 什么是web开发 Web&#xff1a;全球广域网&#xff0c;也称为万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 所以Web开发说白了&#xff0c;就是开发网站的&#xff0c;例如下图所示的网站&#xff1a;淘宝&#xff0c;京东等等 那么我们…...

多语言APP的外包开发流程及注意事项

近些年国内越来越多的公司走向海外&#xff0c;有些互联网项目即可以为国内用户使用&#xff0c;也可以为国外用户使用&#xff0c;尤其是一些智力类小游戏&#xff0c;这些小游戏不需要特别的运营&#xff0c;只要在设计和玩法上把握好&#xff0c;那就可以推广到全球用户。今…...

CMAKE介绍和使用(Windows平台)

CMake是一个跨平台的安装&#xff08;编译&#xff09;工具&#xff0c;可以用简单的语句来描述所有平台的安装(编译过程)。 Windows平台 cmake工具的下载 cmake工具下载官网&#xff1a; Download | CMake 下载压缩包后解压&#xff0c;解压后的bin文件路径加到电脑系统环境…...

宝塔面板webhook 使用教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 背景1、介绍一下Webhook2、使用步骤1.安装git2.安装WebHook3.添加WebHook4.配置git 钩子 &#xff08;码云示例&#xff09;5.私有项目还需要做以下操作 背景 最近…...

大模型时代入场级技能:提示词工程!中文教程来啦

写出优质的提示词&#xff0c;让 AI 生成惊艳的图文作品。——这就是如今年薪百万仍一人难求的提示词工程师们在解决的问题。大语言模型时代下&#xff0c;不断涌现出众多让人瞳孔地震的绘画、拍案叫绝的文案&#xff0c;它们的创作者并非传统定义的画家、作家&#xff0c;而是…...

template和component自定义组件之间的区别

在小程序中自定义组件 component 方式和组件模板 template 2种方式实现页面组件化。 一、component自定义组件 1.概念 自定义组件是指可以被多个页面使用的组件&#xff0c;可以在小程序中多次复用。在开发中可以将一个页面中的代码和样式抽象出来&#xff0c;然后创建一个自定…...

如何提高读取Excel的效率,NPOI多线程读取详解

如何提高读取Excel的效率 当Excel中的数据量大,达到几十万条,使用Excel文件可能会变得很慢. 以下是一些建议来提高读取Excel的效率: 1. 选择合适的Excel库 在读取Excel文件时, 选择合适的Excel库可以显著提高效率. 一些常用的Excel库包括: EPPlus: 用于读写Excel文件的开源…...

【算法】【算法杂谈】从1到n的自然数组中,1出现的次数如何计算?

目录 前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本 思考感悟写在最后 前言 当前所有算法都使用测试用例运行过&#xff0c;但是不保证100%的测试用例&#xff0c;如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识&#xff01; 问题介…...

日常笔记-Flutter build命令参数

Flutter build命令参数 Flutter build命令参数 Flutter build命令参数 flutter build apk 命令支持以下参数&#xff1a; --debug&#xff1a;构建一个调试版本的 APK。--release&#xff1a;构建一个发布版本的 APK。--target-platform<value>&#xff1a;指定目标平台…...

【利用AI让知识体系化】入门Koa框架

思维导图 文章目录 思维导图一、介绍Koa什么是KoaKoa的历史Koa的特点 二、基本使用安装KoaHello World中间件路由错误处理 三、进阶使用静态资源管理Session管理文件上传表单处理HTTPS支持 四、Koa中间件中间件的概念Koa的洋葱模型常用中间件的介绍自定义中间件的编写 五、异步…...

边缘计算:数据采集、清洗与处理的新时代

近日&#xff0c;又一家边缘计算企业成功获得了融资。这家公司名为DeepWalk&#xff0c;致力于提供边缘计算技术&#xff0c;为企业提供安全、快速的数据采集、清洗和处理解决方案。其融资将用于产品研发和市场推广。 DeepWalk成立于2018年&#xff0c;总部位于美国硅谷&#x…...

分区计量管理项目应用

为充分发挥分区计量管理项目在漏损控制的效用&#xff0c;应构建科学完备的应用体系&#xff0c;如下图 分区计量应用体系 1. 基于水量平衡分析的漏损现状评估方法 分区计量管理项目通过监控分析DMA 分区内流量、压力、水质、大用户用水等情况&#xff0c;结合营业抄收系统的营…...

LayoutInflater中inflate()参数解析

1、关于LayoutInflater&#xff0c;它是如何通过 inflate 方法获取到具体View的&#xff1f; 获得LayoutInflater实例的方式有以下三种&#xff1a; LayoutInflater inflater getLayoutInflater();LayoutInflater inflater LayoutInflater.from(this);LayoutInflater infla…...

星河案例ㅣ中国电信 X 冲量在线:基于智算中心的隐私计算应用实践

▏摘要 中国电信是中国三大运营商之一&#xff0c;为响应国家“东数西算”工程的全新数据中心形态&#xff0c;中国电信引入隐私计算平台&#xff0c;对内实现数据确权跟踪、对外实现数据共享交易&#xff0c;盘活中国电信分布在全国不同区域的数据资源和算力资源&#xff0c;…...

Cartographer建图参数调优实战:从‘能用’到‘好用’,详解.lua文件里那些影响地图质量的配置项

Cartographer建图参数调优实战&#xff1a;从基础配置到高级优化 当你第一次成功运行Cartographer时&#xff0c;那种看到地图逐渐成形的兴奋感是难以言喻的。但很快你会发现&#xff0c;默认参数下的建图效果往往差强人意——走廊墙壁出现波浪形扭曲、开阔空间的地图错位、动态…...

为什么PUT和DELETE请求在大公司中逐渐被弃用?

为什么PUT和DELETE请求在大公司中逐渐被弃用&#xff1f; 一、引言&#xff1a;RESTful 的 “标准款”&#xff0c;为何大厂不买单&#xff1f; 1.1 PUT 与 DELETE 的设计初心&#xff1a;RESTful 的理想模型 在 HTTP 协议的大家族里&#xff0c;PUT 和 DELETE 请求方法就像一对…...

离线环境下OpenEuler开发板手动部署g++/gcc编译环境的完整指南

1. 为什么需要离线部署g/gcc&#xff1f; 在工业嵌入式开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;开发板运行的是OpenEuler这类开源操作系统&#xff0c;但由于安全限制或现场环境限制&#xff0c;设备完全无法连接外部网络。这时候如果需要使用g/gcc这样的基础编…...

MuJoCo两轮平衡小车复现:从GitHub克隆到成功运行的保姆级排错指南(附Linux依赖解决方案)

MuJoCo两轮平衡小车复现&#xff1a;从GitHub克隆到成功运行的保姆级排错指南&#xff08;附Linux依赖解决方案&#xff09; 在机器人仿真领域&#xff0c;MuJoCo凭借其高效的物理引擎和逼真的动力学模拟&#xff0c;成为众多研究者和开发者的首选工具。复现GitHub上的开源项目…...

内网多机连接fay使用

课程ID&#xff1a;fay-muli-computer作者&#xff1a;课程作者日期&#xff1a;2026-04-13T14:33版本&#xff1a;1.0.0章节数&#xff1a;7 封面 目录 下载cherry studio启动添加fay配置api选择模型配置默认模型开始对话 第1节 下载cherry studio 请到网站https://www.che…...

Qwen2.5-VL-7B-Instruct惊艳效果集:细粒度图像描述+跨模态逻辑推理作品

Qwen2.5-VL-7B-Instruct惊艳效果集&#xff1a;细粒度图像描述跨模态逻辑推理作品 1. 模型能力概览 Qwen2.5-VL-7B-Instruct是一款突破性的多模态视觉-语言模型&#xff0c;在图像理解和跨模态推理方面展现出令人惊艳的能力。这个16GB的BF16模型需要至少16GB显存的GPU支持&am…...

FunASR离线部署避坑指南:从Docker容器GPU驱动到模型热加载的实战经验

FunASR企业级离线部署实战&#xff1a;从GPU驱动配置到多模型协同方案 1. 离线环境下的技术挑战与应对策略 在企业内网、政务专网等隔离环境中部署语音识别系统时&#xff0c;工程师常面临三大核心挑战&#xff1a; 硬件适配问题&#xff1a;Docker容器内GPU驱动与CUDA环境的兼…...

开关电源噪声的成因分析与高效抑制策略

1. 开关电源噪声的物理成因 第一次拆解开关电源时&#xff0c;我被电路板上那些看似杂乱的波形吓到了。示波器上跳动的尖峰就像心电图失常的病人&#xff0c;这些就是让工程师们头疼的电源噪声。要解决它&#xff0c;我们得先搞明白这些"电子心电图异常"是怎么产生的…...

Cursor Pro免费升级终极指南:三步解锁无限AI编程体验

Cursor Pro免费升级终极指南&#xff1a;三步解锁无限AI编程体验 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your tria…...

uni-app中H5页面通过web-view跳转小程序的完整解决方案

1. 为什么H5页面跳转小程序会报错&#xff1f; 最近在做一个uni-app项目时&#xff0c;遇到了一个典型问题&#xff1a;在H5页面中通过web-view跳转小程序时&#xff0c;控制台报错"wx.miniProgram is undefined"或者"navigateTo is undefined"。这个问题困…...