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

mybatis 入门

 MyBatis是一款持久层框架,免除了几乎所有的JDBC代码、参数及获取结果集工作。可以通过简单的XML或注解来配置和映射原始类型、接口和Java POJO为数据库中的记录。

1 无框架下的JDBC操作

1)加载驱动:Class.forName(“com.mysql.cj.jdbc.Driver”);

2)获取连接:DriverManager.getConnection(url,user,password);

3)创建Statement对象,用于想数据库发送SQL语句:connect.createStatement();

4)用Statement执行增删查改操作。

5)关闭Connection、Statement、ResultSet对象。

public class JdbcExample {private static final String URL = "jdbc:mysql://localhost:3306/study";private static final String USER = "root";private static final String PASSWORD = "密码";public static void main(String[] args) throws SQLException {Connection connection = null;Statement statement = null;try {Class.forName("com.mysql.cj.jdbc.Driver");connection = DriverManager.getConnection(URL, USER, PASSWORD);statement = connection.createStatement();doSelect(statement);doUpdate(statement);} catch (ClassNotFoundException | SQLException e) {throw new RuntimeException(e);} finally {if (connection != null) connection.close();if (statement != null) statement.close();}}private static void doSelect(Statement statement) throws SQLException {ResultSet resultSet = null;try {resultSet = statement.executeQuery("SELECT  * FROM e_teacher");while (resultSet.next()) {String name = resultSet.getString("name");System.out.println(name);}} catch (SQLException e) {throw new RuntimeException(e);} finally {if (resultSet != null) resultSet.close();}}private static void doUpdate(Statement statement) throws SQLException {int update = statement.executeUpdate("UPDATE e_teacher SET name = 'Java测试' WHERE id = 55");System.out.println("更新数量:" + update);}}

2 MyBatis

MyBatis 相比于Hibernate,更轻量级。且对于SQL优化和细节控制可操作性更高(Hibernate 使用HQL 或原生SQL进行数据库查询,但主要关注的是对象的属性和方法,通过ORM映射自动生成SQL语句)。

2.1 SqlSession — MyBatis执行SQL语句的主要入口

SqlSession的实例用于执行数据库操作,它是由SqlSessionFactory(被视为单个数据库映射关系经过编译后的内存镜像)创建的。具体创建步骤如下:

1)定义MyBatis配置文件(定义数据库连接信息、mapper、设置等信息)。

2)定义相关mapper。

3)获取MyBatis配置文件等输入流,并根据输入流获取sessionFactory:

new SqlSessionFactoryBuilder().build(inputStram)。

4)获取sqlSession: sessionFactory.openSession()。

5)用sqlSession去执行数据库操作。

6)关闭sqlSession。

<!--mybatis.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><properties><property name="url" value="jdbc:mysql://localhost:3306/study"/><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="username" value="root"/><property name="password" value="密码"/></properties><typeHandlers><typeHandler handler="com.huangmingfu.mybatis.handler.DescObjectTypeHandler" /></typeHandlers><environments default="dev"><environment id="dev"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="url" value="${url}"/><property name="driver" value="${driver}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="mapper/course.xml"/><mapper resource="mapper/teacher.xml"/></mappers>
</configuration>
public class SqlSessionInstance {public static SqlSession getSqlSession() {return InnerClass.sqlSession;}private SqlSessionInstance() {}private static class InnerClass {private static SqlSession sqlSession = createSqlSession();private static SqlSession createSqlSession() {try {InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);return sessionFactory.openSession();} catch (IOException e) {throw new RuntimeException(e);}}}
}

2.2 类型处理器

MyBatis 在设置预处理语句(PreparedStatement)中的参数或结果集中取出一个值时,会用类型处理器将获取到的值以合适的方式转换成Java类型。在插入或更新数据时同样也会用类型处理器进行转换。

MyBatis 定义了一些默认的处理器,用户也可以自定义处理器。

2.2.1 处理枚举类型

MyBatis 定义了两种枚举处理器,EnumTypeHandler(默认方式,把Enum值转换成对应的名字) 和 EnumOrdinalTypeHandler(把枚举的序数值来映射成对应的整形数值)。

如果需要把Enum 值映射成对应的整形值,全局设置不太方便,可以在resultMap中指定typeHandler。(推荐采用默认形式,这样在数据库中会更直观)

<?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.huangmingfu.mybatis.mapper.TeacherMapper"><resultMap id="teacherMap" type="com.huangmingfu.mybatis.entity.Teacher"><result column="grade" property="grade" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/></resultMap><select id="getByName" resultMap="teacherMap">select * from e_teacher where name LIKE CONCAT('%',#{name},'%') LIMIT 0,1</select><insert id="insert" parameterType="com.huangmingfu.mybatis.entity.Teacher">INSERT INTO e_teacher(`name`,grade,`desc`,`age`)VALUES (#{name},#{grade,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler},#{desc},#{age})</insert>
</mapper>

2.2.2 自定义处理器

自定义处理器可以通过继承BaseTypeHandler来实现,在配置文件中注册这个处理器。

public class DescObjectTypeHandler extends BaseTypeHandler<DescObject> {@Overridepublic void setNonNullParameter(PreparedStatement preparedStatement, int i, DescObject descObject, JdbcType jdbcType) throws SQLException {preparedStatement.setString(i,JSON.toJSONString(descObject));}@Overridepublic DescObject getNullableResult(ResultSet resultSet, String s) throws SQLException {return getFromString(resultSet.getString(s));}@Overridepublic DescObject getNullableResult(ResultSet resultSet, int i) throws SQLException {return getFromString(resultSet.getString(i));}@Overridepublic DescObject getNullableResult(CallableStatement callableStatement, int i) throws SQLException {return getFromString(callableStatement.getString(i));}private DescObject getFromString(String string) {JSONObject jsonObject = JSON.parseObject(string);DescObject descObject = new DescObject();descObject.setMessage(jsonObject.getString("message"));descObject.setTitle(jsonObject.getString("title"));return descObject;}
}

2.3 映射器实例

映射器是一个接口(Mapper接口),定义了与数据库交互的SQL语法和方法,MyBatist通过动态代理来为这些接口创建实例。

在Spring框架中,映射器通常会被声明为Spring Bean。

2.3.1 与SqlSession的关系

映射器实例通常(注意,不是一定)是通过sqlSession实例来获取。当通过映射器实例调用某个方法时,实际上是委托给sqlSession去执行相应的Sql语句。sqlSession负责根据映射器的方法名、参数等信息,找到对应的SQL语句,并通过执行器(Executor)执行这个SQL语句,最后将结果放回给映射器实例。

2.4 缓存策略

MyBatis 主要采用了两种缓存策略。

2.4.1 一级缓存(SqlSession级别缓存)

是默认的缓存机制。是局部的。作用域是sqlSession的生命周期(当sqlSession关闭或清空时,一级缓存也会被清空)。

原理:同一个sqlSession中执行的相同SQL语句和参数,只会执行一次数据库查询,然后将结果缓存起来,下次遇到相同的查询时,直接从缓存中获取结果,而不是再次访问数据库。

2.4.2 二级缓存(Mapper级别缓存)

多个SqlSession之间可共享这个缓存,需要手动开启。

原理:不同的SqlSession 在执行相同的Mapper和相同的SQL语句时,可共享二级缓存中的数据,当数据在二级缓存中未找到时,会执行数据库查询,并将结果放入二级缓存中,供后续使用。

注意:1)对同一个数据执行了增删改操作时,需要更新或清空缓存,以确保缓存中的数据与数据库中保持一致。

2)二级缓存是跨SqlSession的,需要注意并发和线程安全问题。

相关文章:

mybatis 入门

MyBatis是一款持久层框架&#xff0c;免除了几乎所有的JDBC代码、参数及获取结果集工作。可以通过简单的XML或注解来配置和映射原始类型、接口和Java POJO为数据库中的记录。 1 无框架下的JDBC操作 1&#xff09;加载驱动&#xff1a;Class.forName(“com.mysql.cj.jdbc.Driv…...

Spring-AI-上下文记忆

引入依赖 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/P…...

内存函数memcpy、mommove、memset、memcmp

目录 1、memcpy函数 memcpy函数的模拟实现 2、memmove函数 memmove函数的模拟实现 3、memset函数 4、memcmp函数 1、memcpy函数 描述&#xff1a; C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。 声明&…...

symfony框架介绍

Symfony是一个功能强大的PHP框架,它提供了丰富的组件和工具来简化Web开发过程。以下是一些关于Symfony的主要特点: 可重用性: Symfony提供了一系列可重用的PHP组件,这些组件可以用于任何PHP应用程序中。灵活性: Symfony允许开发者根据项目需求灵活选择使用哪些组件,而不是强…...

【计算机毕业设计】游戏售卖网站——后附源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…...

LabVIEW电信号傅里叶分解合成实验

LabVIEW电信号傅里叶分解合成实验 电信号的分析与处理在科研和工业领域中起着越来越重要的作用。系统以LabVIEW软件为基础&#xff0c;开发了一个集电信号的傅里叶分解、合成、频率响应及频谱分析功能于一体的虚拟仿真实验系统。系统不仅能够模拟实际电路实验箱的全部功能&…...

Docker 学习笔记(六):挑战容器数据卷技术一文通,实战多个 MySQL 数据同步,能懂会用,初学必备

一、前言 记录时间 [2024-4-11] 系列文章简摘&#xff1a; Docker学习笔记&#xff08;二&#xff09;&#xff1a;在Linux中部署Docker&#xff08;Centos7下安装docker、环境配置&#xff0c;以及镜像简单使用&#xff09; Docker 学习笔记&#xff08;三&#xff09;&#x…...

csdn怎么变得这么恶心,自动把一些好的文章分享改成了vip可见

刚刚发现以前发的一些文章未经过我同意&#xff0c;被csdn自动改成了VIP可见&#xff0c;这也太恶心了&#xff0c;第一你没分钱给我&#xff0c;第二我记录下一些问题也不是为了赚钱&#xff0c;而是为了提升自己和帮助别人&#xff0c;这样搞是想逼更多人走是吗&#xff1f;...

自然语言处理NLP:文本预处理Text Pre-Processing

大家好&#xff0c;自然语言处理(NLP)是计算机科学领域与人工智能领域中的一个重要方向&#xff0c;其研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。本文将介绍文本预处理的本质、原理、应用等内容&#xff0c;助力自然语言处理和模型的生成使用。 1.文本…...

家庭网络防御系统搭建-虚拟机安装siem/securityonion网络连接问题汇总

由于我是在虚拟机中安装的security onion&#xff0c;在此过程中&#xff0c;遇到很多的网络访问不通的问题&#xff0c;通过该文章把网络连接问题做一下梳理。如果直接把securityonion 安装在物理机上&#xff0c;网络问题则会少很多。 NAT无法访问虚拟机 security onion虚拟…...

2024年外贸行业营销神器推荐

2024年外贸行业营销神器推荐&#xff1a;外贸人每天面对的不是国内客户&#xff0c;而是全球客户&#xff0c;相对于国内来说&#xff0c;会更加麻烦和繁琐&#xff0c;今天就码一篇2024年外贸行业营销神器的推荐文章&#xff0c;希望可以减轻各位外贸人的负担&#xff01; 1、…...

k8s高可用集群部署介绍 -- 理论

部署官网参考文档 负载均衡参考 官网两种部署模式拓扑图和介绍 介绍两种高可用模式 堆叠 拓扑图如下&#xff08;图片来自k8s官网&#xff09;&#xff1a; 特点&#xff1a;将etcd数据库作为控制平台的一员&#xff0c;由于etcd的共识算法&#xff0c;所以集群最少为3个&…...

【GDAL-Python】1-在Python中使用GDAL读写栅格文件

文章目录 1-概要2.代码实现 1-概要 提示&#xff1a;本教程介绍如何使用 Python 中的 GDAL 库将栅格数据读取为数组并将数组另存为GeoTiff 文件 视频地址&#xff1a;B站对应教程 目标&#xff1a; &#xff08;1&#xff09;读写GeoTiff影像&#xff1b; &#xff08;2&…...

【C++】explicit关键字详解(explicit关键字是什么? 为什么需要explicit关键字? 如何使用explicit 关键字)

目录 一、前言 二、explicit关键字是什么&#xff1f; 三、构造函数还具有类型转换的作用 &#x1f34e;单参构造函数 ✨引出 explicit 关键字 &#x1f34d;多参构造函数 ✨为什么需要explicit关键字&#xff1f; ✨怎么使用explicit关键字&#xff1f; 四、总结 五…...

maven引入外部jar包

将jar包放入文件夹lib包中 pom文件 <dependency><groupId>com.jyx</groupId><artifactId>Spring-xxl</artifactId><version>1.0-SNAPSHOT</version><scope>system</scope><systemPath>${project.basedir}/lib/Spr…...

李沐37_微调——自学笔记

标注数据集很贵 网络架构 1.一般神经网络分为两块&#xff0c;一是特征抽取原始像素变成容易线性分割的特征&#xff0c;二是线性分类器来做分类 微调 1.原数据集不能直接使用&#xff0c;因为标号发生改变&#xff0c;通过微调可以仍然对我数据集做特征提取 2.pre-train源…...

【小程序】生成短信中可点击的链接

文章目录 前言一、如何生成链接二、仔细拜读小程序开发文档文档说明1文档说明2 总结 前言 由于线上运营需求&#xff0c;需要给用户发送炮轰短信&#xff0c;用户通过短信点击链接直接跳转进入小程序 一、如何生成链接 先是找了一些三方的&#xff0c;生成的倒是快速&#xf…...

欧拉函数(模板题)

给定 n 个正整数 ai&#xff0c;请你求出每个数的欧拉函数。 欧拉函数的定义 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含一个正整数 ai。 输出格式 输出共 n 行&#xff0c;每行输出一个正整数 ai 的欧拉函数。 数据范围 1≤n≤100, 1≤ai≤2109 输…...

Thingsboard PE 白标的使用

只有专业版支持白标功能。 使用 ThingsBoard Cloud 或安装您自己的平台实例。 一、介绍 ThingsBoard Web 界面提供了简便的操作,让您能够轻松配置您的公司或产品标识和配色方案,无需进行编码工作或重新启动服务。 系统管理员、租户和客户管理员可以根据需要自定义配色方案、…...

智能物联网远传冷水表管理系统

智能物联网远传冷水表管理系统是一种基于物联网技术的先进系统&#xff0c;旨在实现对冷水表的远程监测、数据传输和智能化管理。本文将从系统特点、构成以及带来的效益三个方面展开介绍。 系统特点 1.远程监测&#xff1a;系统可以实现对冷水表数据的远程监测&#xff0c;无…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...