MyBatis:使用注解让数据库操作更简单

目录

一、简介

二、配置

三、基于注解的基本使用

四、测试

总结


一、简介

在Java开发中,数据库操作是一个常见而重要的任务。为了方便地执行SQL语句,获取结果集,处理异常等,我们通常需要使用JDBC(Java Database Connectivity)API,这是一个标准的数据库访问接口。然而,使用JDBC也有一些缺点,例如:

  • 我们需要编写大量的重复代码,如加载驱动,创建连接,关闭资源等。
  • 我们需要手动设置参数和获取结果集,这可能导致类型不匹配或空指针等错误。
  • 我们需要硬编码SQL语句,这可能导致可读性和维护性的问题。

为了解决这些问题,许多持久层框架(Persistence Framework)应运而生,它们可以提供更高层次的抽象和封装,使得数据库操作更加简单和方便。其中一个著名的持久层框架就是MyBatis。

MyBatis是一个开源的持久层框架,它支持自定义SQL,存储过程和高级映射。MyBatis可以通过简单的XML或注解来配置和映射原始类型,接口和Java POJO(Plain Old Java Objects)为数据库中的记录。MyBatis的主要特点有:

  • 简单易用:MyBatis可以消除几乎所有的JDBC代码和手动设置参数和获取结果集的工作。
  • 灵活强大:MyBatis可以使用动态SQL来适应各种复杂的查询需求,并且可以使用插件机制来扩展其功能。
  • 轻量高效:MyBatis占用资源少,运行速度快,并且可以与各种流行的数据库和缓存框架集成。

二、配置

要使用MyBatis,我们首先需要添加它的依赖到我们的项目中。如果我们使用Maven来管理项目,我们可以在pom.xml文件中添加如下代码:

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version>
</dependency>

然后,我们需要创建一个MyBatis的配置文件,通常命名为mybatis-config.xml。这个文件用于定义一些全局的属性和设置,例如数据源(DataSource),事务管理器(TransactionManager),日志实现(LogImpl)等。一个简单的配置文件示例如下:

<?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 resource="jdbc.properties"/><settings><setting name="logImpl" value="STDOUT_LOGGING"/></settings><typeAliases><package name="com.example.domain"/></typeAliases><mappers><mapper class="com.example.mapper.UserMapper"/></mappers>
</configuration>

在上面的配置文件中,我们做了以下几件事:

  • 我们引入了一个外部的属性文件jdbc.properties,用于存储数据库连接相关的信息,如驱动类名(driverClassName),连接地址(url),用户名(username)和密码(password)等。
  • 我们设置了日志实现为STDOUT_LOGGING,表示将日志输出到标准输出流中。
  • 我们定义了一个类型别名(TypeAlias),表示将com.example.domain包下的所有类注册为别名,这样我们就可以在后面的映射文件中使用简短的类名,而不是完整的限定名。
  • 我们指定了一个映射器(Mapper),表示将com.example.mapper.UserMapper类作为一个映射器,用于定义SQL语句和结果映射等。

三、基于注解的基本使用

有了配置文件后,我们就可以开始使用MyBatis来操作数据库了。MyBatis的核心接口是SqlSession,它表示和数据库的一次会话,可以用来执行SQL语句,提交或回滚事务,获取映射器等。我们可以通过SqlSessionFactory来创建SqlSession,而SqlSessionFactory可以通过SqlSessionFactoryBuilder来构建,传入配置文件的输入流即可。以下是一个创建SqlSession的示例:

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.InputStream;public class MyBatisUtil {private static SqlSessionFactory sqlSessionFactory;static {try {// 读取配置文件InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");// 构建SqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (Exception e) {e.printStackTrace();}}// 获取SqlSessionpublic static SqlSession getSqlSession() {return sqlSessionFactory.openSession();}
}

有了SqlSession后,我们就可以通过它来执行SQL语句了。MyBatis提供了两种方式来执行SQL语句:一种是通过XML映射文件来定义SQL语句和结果映射;另一种是通过注解来定义SQL语句和结果映射。我们以第二种方式为例,介绍如何使用MyBatis进行增删改查操作。

首先,我们需要定义一个实体类(Entity Class),用于表示数据库中的一张表。例如,我们有一张用户表(user),其结构如下:

idnameageemail
1Tom18tom@gmail.com
2Bob20bob@qq.com
3Alice19alice@163.com

我们可以定义一个User类来对应这张表,代码如下:

package com.example.domain;import java.io.Serializable;public class User implements Serializable {private Integer id;private String name;private Integer age;private String email;// 省略构造方法,getter和setter方法,toString方法
}

然后,我们需要定义一个持久层接口(DAO Interface),用于声明对User表的操作方法。在这个接口中,我们可以使用MyBatis提供的注解来编写SQL语句,并指定参数和返回值类型。例如,我们可以定义一个UserMapper接口,代码如下:

package com.example.mapper;import com.example.domain.User;
import org.apache.ibatis.annotations.*;import java.util.List;public interface UserMapper {// 查询所有用户@Select("select * from user")List<User> findAll();// 根据id查询用户@Select("select * from user where id = #{id}")User findById(Integer id);// 添加用户@Insert("insert into user (name, age, email) values (#{name}, #{age}, #{email})")void insert(User user);// 修改用户@Update("update user set name = #{name}, age = #{age}, email = #{email} where id = #{id}")void update(User user);// 删除用户@Delete("delete from user where id = #{id}")void delete(Integer id);}

在上面的代码中,我们使用了@Select, @Insert, @Update, @Delete四个注解来分别表示查询,插入,更新和删除操作。在注解中,我们可以直接写SQL语句,并且可以使用#{参数名}来表示占位符。MyBatis会自动将参数对象的属性值替换到占位符中,并且会根据返回值类型进行结果集的映射。

四、测试

最后,我们需要编写测试类(Test Class),用于调用UserMapper接口中的方法,并验证其功能。我们可以使用JUnit来编写测试类,代码如下:

package com.example.test;import com.example.domain.User;
import com.example.mapper.UserMapper;
import com.example.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.util.List;public class UserMapperTest {private SqlSession sqlSession;private UserMapper userMapper;@Beforepublic void init() {// 获取SqlSessionsqlSession = MyBatisUtil.getSqlSession();// 获取UserMapper接口的代理对象userMapper = sqlSession.getMapper(UserMapper.class);}@Afterpublic void destroy() {// 提交事务sqlSession.commit();// 关闭资源sqlSession.close();}// 测试查询所有用户@Testpublic void testFindAll() {// 调用findAll方法List<User> users = userMapper.findAll();// 遍历打印结果for (User user : users) {System.out.println(user);}}// 测试根据id查询用户@Testpublic void testFindById() {// 调用findById方法,传入id为1User user = userMapper.findById(1);// 打印结果System.out.println(user);}// 测试添加用户@Testpublic void testInsert() {// 创建一个User对象,设置其属性值User user = new User();user.setName("Jack");user.setAge(22);user.setEmail("jack@outlook.com");// 调用insert方法,传入user对象userMapper.insert(user);// 打印结果,可以看到id已经自动赋值System.out.println(user);}// 测试修改用户@Testpublic void testUpdate() {// 先根据id查询一个用户,得到一个User对象User user = userMapper.findById(2);// 修改该对象的属性值user.setName("Bobo");user.setAge(21);user.setEmail("bobo@qq.com");// 调用update方法,传入user对象userMapper.update(user);// 打印结果,可以看到属性值已经更新System.out.println(user);}// 测试删除用户@Testpublic void testDelete() {// 调用delete方法,传入id为3userMapper.delete(3);// 查询所有用户,可以看到id为3的用户已经删除testFindAll();}
}

在上面的代码中,我们使用了@Before和@After两个注解来分别在每个测试方法执行前后进行一些初始化和销毁的操作,例如获取SqlSession,提交事务,关闭资源等。然后,我们使用@Test注解来标记每个测试方法,并在方法体中调用UserMapper接口中的相应方法,并打印结果。运行测试类,我们可以看到控制台输出了正确的结果,说明我们的数据库操作成功了。

总结

本文介绍了MyBatis这个持久层框架的简介,配置和基于注解的基本使用。通过MyBatis,我们可以方便地执行SQL语句,并将结果集映射为Java对象。MyBatis还提供了许多高级特性,如动态SQL,缓存,插件等,使得数据库操作更加灵活和高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/53308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SA8295P 源码分析】25 - QNX Ethernet MAC 驱动 之 emac_isr_thread_handler 中断处理函数源码分析

【SA8295P 源码分析】25 - QNX Ethernet MAC 驱动 之 emac_isr_thread_handler 中断处理函数源码分析 一、emac 中断上半部:emac_isr()二、emac 中断下半部:emac_isr_thread_handler()2.1 emac 中断下半部:emac_isr_sw()系列文章汇总见:《【SA8295P 源码分析】00 - 系列文章…

POSTGRESQL 如何用系统函数来诊断权限问题

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

酷炫JavaScript 技巧

1.检查元素是否在屏幕可见区域内 我们如何获得元素的点击率&#xff1f; 主要取决于用户点击元素的次数和元素在页面上显示的次数。 我们可以很容易地获取到用户的点击次数&#xff0c;但是如何获取一个元素的显示次数呢&#xff1f; 我们可以通过IntersectionObserver轻松…

2023MySQL+MyBatis知识点整理

文章目录 主键 外键 的区别&#xff1f;什么是范式&#xff1f;什么是反范式&#xff1f;什么是事务&#xff1f;MySQL事务隔离级别&#xff1f;MySQL事务默认提交模式&#xff1f;MySQL中int(1)和int(10)的区别MySQL 浮点数会丢失精度吗&#xff1f;MySQL支持哪几种时间类型&a…

docker 命令

一、docker命令 1、镜像保存 docker save imageid -o modelzoozl.tar #把镜像保存到本地 docker load -i dockername #把tar包load下来&#xff0c;load成镜像 docker export CONTAINERID/CONTAINERNAME -o modelzoozl.tar #把启动着的镜像导出 docker import modelzo…

excel处理公式获得最终值--------------gxl

/*** 读取单元格内容 包括计算公式的结果&#xff0c;引用公式的结果* param cell* return*/public static String getCellValue(Cell cell){System.out.println(cell);String value null;if(cell ! null){System.out.println(cell.getCellType());switch (cell.getCellType()…

【JavaWeb】会话管理

HTTP的基本性质 HTTP是简单的HTTP是可扩展的&#xff1a;HTTP headers让协议的扩展变得容易HTTP是无状态的&#xff0c;有会话的&#xff1a;这意味着服务器不能记住之前的请求或连接状态。每个HTTP请求都是独立的&#xff0c;服务器无法识别该请求是否来自同一个客户端或与之前…

springcloud3 GateWay章节-Nacos+gateway动态路由负载均衡4

一 工程结构 1.1 工程 1.2 搭建gatewayapi工程 1.pom文件 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope></dependency><!--gateway--&g…

java中写入excel类HSSFWorkbook和XSSFWorkbook和SXSSFWorkbook的区别?

在Java中&#xff0c;HSSFWorkbook、XSSFWorkbook和SXSSFWorkbook都是Apache POI库中用于处理Excel文件的类。它们之间的主要区别如下&#xff1a; HSSFWorkbook&#xff1a;它是POI库中处理旧版Excel&#xff08;.xls&#xff09;文件的类。HSSFWorkbook基于OLE2 Compound Doc…

复习之web服务器--apache

PS&#xff1a;Vim复制小技巧 一、实验环境 两台虚拟机 (nodea,nodeb)配置ip搭建软件仓库关闭selinux [rootftp Desktop]# hostnamectl set-hostname nodea.westos.org [rootftp Desktop]# hostname nodea.westos.org [rootftp Desktop]# ifconfig enp1s0: flags4163<UP,B…

大数据开发要学习什么?学完又能做什么

学习大数据需要掌握什么语言基础&#xff1f; 1、Java基础 大数据框架90%以上都是使用Java开发语言&#xff0c;所以如果要学习大数据技术&#xff0c;首先要掌握Java基础语法以及JavaEE方向的相关知识。 2、MySQL数据库 这是学习大数据必须掌握的知识之一。数据的操作语言是…

Vue2向Vue3过度核心技术组件通信

目录 1 组件基础知识scoped解决样式冲突1.1 默认情况&#xff1a;1.2 代码演示1.3 scoped原理1.4 总结 2 组件基础知识data必须是一个函数2.1 data为什么要写成函数2.2 代码演示2.3 总结 3 组件通信3.1 什么是组件通信&#xff1f;3.2 组件之间如何通信3.3 组件关系分类3.4 通信…

为什么使用Nacos而不是Eureka(Nacos和Eureka的区别)

文章目录 前言一、Eureka是什么&#xff1f;二、Nacos是什么&#xff1f;三、Nacos和Eureka的区别3.1 支持的CAP3.2连接方式3.3 服务异常剔除3.4 操作实例方式 总结 前言 为什么如今微服务注册中心用Nacos相对比用Eureka的多了&#xff1f;本文章将介绍他们之间的区别和优缺点…

【element-ui】el-dialog改变宽度

dialog默认宽度为父元素的50%&#xff0c;这就导致在移动端会非常的窄&#xff0c;如图1&#xff0c;需要限定宽度。 解决方法&#xff1a;添加custom-class属性&#xff0c;然后在style中编写样式&#xff0c;注意&#xff0c;如果有scoped限定&#xff0c;需要加::v-deep &l…

浅谈Spark的RDD、部署模式

一、RDD Spark RDD&#xff08;弹性分布式数据集&#xff09;&#xff0c;弹性是指Spark可以通过重新计算来自动重建丢失的分区。 从本质上讲&#xff0c;RDD 是数据元素的不可变分布式集合&#xff0c;跨集群中的节点进行分区&#xff0c;可以与提供转换和操作的低级 API 并行…

到目前为止,所有的关于安卓14的详细介绍

安卓14现在可能已经不远了,谷歌已经进行了五次测试,通常10月份的发布窗口时间很快就会到来。但除了在谷歌I/O 2023上进行简短讨论外,谷歌对正在发生的变化相对沉默。 可以肯定地说,Android 14不会是操作系统有史以来最大的一系列变化,但有很多改进和变化可以让Android保持…

【计算机网络】HTTPs 传输流程

HTTPS和HTTP的区别 1、HTTP协议传输的数据都是未加密的&#xff0c;是明文的&#xff0c;使用HTTP协议传输隐私信息非常不安 HTTPS协议是由SSLHTTP协议构建的可进行加密传输、身份认证的网络协议&#xff0c;要比http协议安全。 2、HTTPS协议需要到CA申请证书&#xff0c;一般…

qt 的基础学习计划列表

1 第一天 &#xff08;qt 的基础&#xff09; 什么是qt hello程序&#xff0c;空窗口 添加按钮&#xff08;对象树、父子关系&#xff09; 按钮的功能&#xff08;信号和槽&#xff09; 信号和槽的拓展2 第二天 各个控件 最简单的记事本界面&#xff08;菜单栏、状态栏、工具…

apache的ab工具测试网页优化效果速度以及服务器承载

今天为大家介绍一款apache自带的一种的测试网页优化效果速度以及服务器承载的工具——ab.exe。 大家在工作中或者开发中可以使用apache的ab工具来测试自己的网站并发量大小&#xff0c;和某个页面的访问时间。 一、基本用法 如果你是用的是apache的话&#xff0c;那么只要进…

科技资讯|三星再申请智能戒指商标,智能穿戴进入更小型化发展

三星正在积极扩展可穿戴设备生态&#xff0c;近日向英国知识产权局提交了名为“Samsung Curio”的新商标&#xff0c;其分类为“Class 9”&#xff0c;可能会用于未来的智能戒指。 智能戒指&#xff1a; 可穿戴计算机本质上的智能手环、智能项链、智能眼镜和智能戒指&#xff1…