Mybatis的介绍和基本使用

news/2024/4/29 23:18:03/文章来源:https://blog.csdn.net/jiayoubaobei2/article/details/129133887

目录

数据库操作框架的历程

JDBC

Hibernate

JDBCTemplate 

什么是Mybatis

快速搭建Mybatis项目

创建普通的maven项目

导入相关的依赖

创建对应的数据表

创建与表对应的实体类对象

创建对应的Mapper接口

编写配置文件

编写测试类

增删改查的基本操作


数据库操作框架的历程

JDBC

JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序

  • 优点:运行期:快捷、高效
  • 缺点:编辑期:代码量大、繁琐异常处理、不支持数据库跨平台,主要还是代码量太大,搞个驱动,在搞连接,写sql,业务和配置写在一起也很乱

jdbc核心api

  1. DriverManager 获取驱动
  2. Connection 连接数据库的抽象
  3. Statment 执行SQL
  4. ResultSet 数据结果集

Hibernate

  • ORM 对象关系映射
  • object java对象
  • relational 关系型数据
  • mapping 映射

Hibernate 是由 Gavin King 于 2001 年创建的开放源代码的对象关系框架。它强大且高效的构建具有关系对象持久性和查询服务的 Java 应用程序。

Hibernate 将 Java 类映射到数据库表中,从 Java 数据类型中映射到 SQL 数据类型中,并把开发人员从 95% 的公共数据持续性编程工作中解放出来。

Hibernate 是传统 Java 对象和数据库服务器之间的桥梁,用来处理基于 O/R 映射机制和模式的那些对象。

Hibernate 优势

  • Hibernate 使用 XML 文件来处理映射 Java 类别到数据库表格中,并且不用编写任何代码。
  • 为在数据库中直接储存和检索 Java 对象提供简单的 APIs。
  • 如果在数据库中或任何其它表格中出现变化,那么仅需要改变 XML 文件属性。
  • 抽象不熟悉的 SQL 类型,并为我们提供工作中所熟悉的 Java 对象。
  • Hibernate 不需要应用程序服务器来操作。
  • 操控你数据库中对象复杂的关联。
  • 最小化与访问数据库的智能提取策略。
  • 提供简单的数据询问。

Hibernate劣势

  • hibernate的完全封装导致无法使用数据的一些功能。
  • Hibernate的缓存问题。
  • Hibernate对于代码的耦合度太高。
  • Hibernate寻找bug困难。
  • Hibernate批量数据操作需要大量的内存空间而且执行过程中需要的对象太多

JDBCTemplate 

JdbcTemplate针对数据查询提供了多个重载的模板方法,你可以根据需要选用不同的模板方法.如果你的查询很简单,仅仅是传入相应SQL或者相关参数,然后取得一个单一的结果,那么你可以选择如下一组便利的模板方法。

  • 优点:运行期:高效、内嵌Spring框架中、支持基于AOP的声明式事务 ​
  • 缺点:必须于Spring框架结合在一起使用、不支持数据库跨平台、默认没有缓存

什么是Mybatis

MyBatis 是一款优秀的持久层框架/半自动的ORM,它支持自定义 SQL(我没用过hibernate,这个应该没办法自定义sql吧,hibernate那边不怕移植,不用重写sql)、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

优点:

  1. 与JDBC相比,减少了50%的代码量
  2. 最简单的持久化框架,简单易学
  3. QL代码从程序代码中彻底分离出来,可以重用
  4. 提供XML标签,支持编写动态SQL
  5. 提供映射标签,支持对象与数据库的ORM字段关系映射
  6. 支持缓存、连接池、数据库移植....

缺点:

  1. 数据库移植性比较差,如果需要切换数据库的话,SQL语句会有很大的差异

快速搭建Mybatis项目

创建普通的maven项目

导入相关的依赖

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

驱动请按照数据库版本进行对应

MySQL :: MySQL Connector/J 8.0 Release Notes

创建对应的数据表

创建与表对应的实体类对象

Emp.java

public class Emp {private Integer id;private String username;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}@Overridepublic String toString() {return "Emp{" +"id=" + id +", username='" + username + '\'' +'}';}
}

创建对应的Mapper接口

EmpMapper.java

public interface EmpMapper {// 根据id查询Emp实体//@Select("select * from emp where id=#{id}")Emp selectEmp(Integer id);// 插入Integer insertEmp(Emp emp);// 更新Integer updateEmp(Emp emp);// 删除Integer deleteEmp(Integer id);
}

编写配置文件

mybatis-config.xml

<?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"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><!--<mapper resource="EmpMapper.xml"/>--><mapper class="cn.tulingxueyuan.mapper.EmpMapper"></mapper></mappers>
</configuration>

EmpMapper.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="cn.tulingxueyuan.mapper.EmpMapper"><!--根据id查询Emp实体--><select id="selectEmp" resultType="cn.tulingxueyuan.pojo.Emp">select * from Emp where id = #{id}</select><insert id="insertEmp">INSERT INTO`mybatis`.`emp` ( `username`)VALUES (#{username});</insert><update id="updateEmp">UPDATE EMPSET username=#{username}WHERE id=#{id}</update><delete id="deleteEmp">DELETE FROM empWHERE id=#{id}</delete></mapper>

编写测试类

MyTest.java

/**** MyBatis 搭建步骤:* 1.添加pom依赖 (mybatis的核心jar包和数据库版本对应版本的驱动jar包)* 2.新建数据库和表* 3.添加mybatis全局配置文件 (可以从官网中复制)* 4.修改mybatis全局配置文件中的 数据源配置信息* 5.添加数据库表对应的POJO对象(相当于我们以前的实体类)* 6.添加对应的PojoMapper.xml (里面就维护所有的sql)*      修改namespace:  如果是StatementId没有特殊的要求*                      如果是接口绑定的方式必须等于接口的完整限定名*      修改对应的id(唯一)、resultType 对应返回的类型如果是POJO需要制定完整限定名* 7.修改mybatis全局配置文件:修改Mapper*/
public class MybatisTest {SqlSessionFactory sqlSessionFactory;@Beforepublic void before(){// 从 XML 中构建 SqlSessionFactoryString resource = "mybatis.xml";InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream(resource);} catch (IOException e) {e.printStackTrace();}sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}/*** 基于StatementId的方式去执行SQL*      <mapper resource="EmpMapper.xml"/>* @throws IOException*/@Testpublic void test01() {try (SqlSession session = sqlSessionFactory.openSession()) {Emp emp = (Emp) session.selectOne("cn.tulingxueyuan.pojo.EmpMapper.selectEmp", 1);System.out.println(emp);}}/*** 基于接口绑定的方式*  1.新建数据访问层的接口:  POJOMapper*  2.添加mapper中对应的操作的方法*      1.方法名要和mapper中对应的操作的节点的id要一致*      2.返回类型要和mapper中对应的操作的节点的resultType要一致*      3.mapper中对应的操作的节点的参数必须要在方法的参数中声明*  3.Mapper.xml 中的namespace必须要和接口的完整限定名要一致*  4.修改mybatis全局配置文件中的mappers,采用接口绑定的方式:*        <mapper class="cn.tulingxueyuan.mapper.EmpMapper"></mapper>*  5.一定要将mapper.xml和接口放在同一级目录中,只需要在resources新建和接口同样结构的文件夹就行了,生成就会合并在一起** @throws IOException*/@Testpublic void test02(){try (SqlSession session = sqlSessionFactory.openSession()) {EmpMapper mapper = session.getMapper(EmpMapper.class);Emp emp = mapper.selectEmp(1);System.out.println(emp);}}/*** 基于注解的方式* 1.在接口方法上面写上对应的注解*@Select("select * from emp where id=#{id}")* 注意:*      注解可以和xml共用, 但是不能同时存在方法对应的xml的id**/@Testpublic void test03(){try (SqlSession session = sqlSessionFactory.openSession()) {EmpMapper mapper = session.getMapper(EmpMapper.class);Emp emp = mapper.selectEmp(1);System.out.println(emp);}}}

增删改查的基本操作

EmpDao.java

public interface EmpDao {public Emp findEmpByEmpno(Integer empno);public int updateEmp(Emp emp);public int deleteEmp(Integer empno);public int insertEmp(Emp emp);
}

EmpDao.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">
<!--namespace:编写接口的全类名,就是告诉要实现该配置文件是哪个接口的具体实现-->
<mapper namespace="cn.tulingxueyuan.dao.EmpDao"><!--select:表示这个操作是一个查询操作id表示的是要匹配的方法的名称resultType:表示返回值的类型,查询操作必须要包含返回值的类型#{属性名}:表示要传递的参数的名称--><select id="findEmpByEmpno" resultType="cn.tulingxueyuan.bean.Emp">select * from emp where empno = #{empno}</select><!--增删改查操作不需要返回值,增删改返回的是影响的行数,mybatis会自动做判断--><insert id="insertEmp">insert into emp(empno,ename) values(#{empno},#{ename})</insert><update id="updateEmp">update emp set ename=#{ename} where empno = #{empno}</update><delete id="deleteEmp">delete from emp where empno = #{empno}</delete>
</mapper>

MyTest.java

public class MyTest {SqlSessionFactory sqlSessionFactory = null;@Beforepublic void init(){// 根据全局配置文件创建出SqlSessionFactory// SqlSessionFactory:负责创建SqlSession对象的工厂// SqlSession:表示跟数据库建议的一次会话String resource = "mybatis-config.xml";InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}@Testpublic void test01() {// 获取数据库的会话SqlSession sqlSession = sqlSessionFactory.openSession();Emp empByEmpno = null;try {// 获取要调用的接口类EmpDao mapper = sqlSession.getMapper(EmpDao.class);// 调用方法开始执行empByEmpno = mapper.findEmpByEmpno(7369);} catch (Exception e) {e.printStackTrace();} finally {sqlSession.close();}System.out.println(empByEmpno);}@Testpublic void test02(){SqlSession sqlSession = sqlSessionFactory.openSession();EmpDao mapper = sqlSession.getMapper(EmpDao.class);int zhangsan = mapper.insertEmp(new Emp(1111, "zhangsan"));System.out.println(zhangsan);sqlSession.commit();sqlSession.close();}@Testpublic void test03(){SqlSession sqlSession = sqlSessionFactory.openSession();EmpDao mapper = sqlSession.getMapper(EmpDao.class);int zhangsan = mapper.updateEmp(new Emp(1111, "lisi"));System.out.println(zhangsan);sqlSession.commit();sqlSession.close();}@Testpublic void test04(){SqlSession sqlSession = sqlSessionFactory.openSession();EmpDao mapper = sqlSession.getMapper(EmpDao.class);int zhangsan = mapper.deleteEmp(1111);System.out.println(zhangsan);sqlSession.commit();sqlSession.close();}
}

EmpDaoAnnotation.java

public interface EmpDaoAnnotation {@Select("select * from emp where id= #{id}")public Emp findEmpByEmpno(Integer empno);@Update("update emp set ename=#{ename} where id= #{id}")public int updateEmp(Emp emp);@Delete("delete from emp where id= #{id}")public int deleteEmp(Integer empno);@Insert("insert into emp(id,user_name) values(#{id},#{username})")public int insertEmp(Emp emp);}

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

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

相关文章

Java线程的6 种状态

Java 线程的状态 Java线程有六种状态&#xff1a; 初始&#xff08;NEW&#xff09;、运行&#xff08;RUNNABLE&#xff09;、阻塞&#xff08;BLOCKED&#xff09;、 等待&#xff08;WAITING&#xff09;、超时等待&#xff08;TIMED_WAITING&#xff09;、终止&#xff08…

vue-router 的基本用法

vue-router 的基本用法 1.什么是 vue-router vue-router 是 vue.js 官方给出的路由解决方案。它只能结合 vue 项目进行使用&#xff0c;能够轻松的管理 SPA 项目中组件的切换。 vue-router 的官方文档地址&#xff1a;https://router.vuejs.org/zh/ 2.vue-router 安装和配置的…

MacBook IDEA 顶部菜单栏不显示问题

文章目录背景&#xff1a;当前显示方式一1. 快捷键&#xff1a;双击shift 搜索 idea.vmoptions3. 在idea.vmoptions文件末尾添加 -Dapple.laf.useScreenMenuBarfalse方式二1. 访达 > 应用程序 > idea 右键 显示包内容2. 进入到bin包位置的命令终端3. 编辑文件 vi idea.pr…

EasyExcel 低内存导出大数据量的Excel方案探索 50万行 50列 (附:实现代码)

文章目录1.前言2.准备工作3.导出测试3.1.单次查询、全量导出3.2. 多次查询&#xff0c;多个文件&#xff0c;单次写入3.3.多次查询&#xff0c;多个文件&#xff0c;多次写入3.4.多线程导出探索3.5.文件打包成ZIP3.6.响应给客户4.实现代码5.结语1.前言 最近接到一个需求&#…

多元化增长引擎业务占比超四成,联想开启混动模式?

一句话概括联想集团的业绩&#xff1a;预料之内的整体下滑&#xff0c;超出预期的第二曲线。 上周五&#xff08;2月17日&#xff09;&#xff0c;联想集团发布了2022到2023财年第三季度业绩。根据财报&#xff0c;联想集团实现营收152.67亿美元&#xff0c;同比下降24%&#…

【机器学习】决策树-Gini指数

1. CART树 分类回归树(CART,Classification And Regression Tree)算法是一种决策树分类方法。CART每一个节点上都采用二分法&#xff0c;采用一种二分递归分割的技术&#xff0c;CART生成的树必须是二叉树&#xff0c;也就是无论回归还是分类&#xff0c;无论特征离散还是连续&…

15-基础加强3-单元测试日志

文章目录1.单元测试1.1概述【理解】1.2特点【理解】1.3使用步骤【应用】1.4相关注解【应用】2.日志2.1概述【理解】2.2日志体系结构和Log4J【理解】2.3入门案例【应用】1.单元测试 1.1概述【理解】 JUnit是一个 Java 编程语言的单元测试工具。JUnit 是一个非常重要的测试工具…

Profinet转ModbusTCP网关连接昆仑通态触摸屏配置案例

本案例是模拟将Modbus TCP 设备数据接入到西门子PROFINET 网络中。 使用设备为西门子 S7-1500 型 PLC, Profinet转ModbusTCP网关。MODBUS 从站昆仑通态触摸屏。 配置方法&#xff1a; 打开博图&#xff0c;新建项目并添加站点。 添加1513PLC。 设置好IP并处于联网状态 导入Pr…

VTK学习笔记(四十)vtk提取单层数据

VTK学习笔记&#xff08;四十&#xff09;vtk提取单层数据1. VTK学习笔记&#xff08;四十&#xff09;vtk提取单层数据1.1 vtkImageReslice提取单层图像1.2 vtkExtractVOI提取单层图像1. VTK学习笔记&#xff08;四十&#xff09;vtk提取单层数据 VTK实现单层图片的提取方法有…

力扣mysql刷题记录

mysql刷题记录 刷题链接https://leetcode.cn/study-plan/sql/?progressjkih0qc mysql冲&#xff01;mysql刷题记录一. 1699. 两人之间的通话次数题解二、1251. 平均售价题解三. 1571. 仓库经理题解四.1445. 苹果和桔子解五.1193. 每月交易 I题解六.1633. 各赛事的用户注册率题…

Android Spider XX兔 Wechat Cookie 校验 注册案例(二)

声明 此次案例只为学习交流使用&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;切勿用于其他非法用途&#xff1b; 文章目录声明前言一、资源推荐二、任务说明三、App抓包分析四、还原JS加密1、Date类2、MD5类3、组合调用还原 api_token 参数4、execjs模…

Android 基础知识4-2.10 GridLayout(网格布局)详解

一、GridLayout&#xff08;网格布局&#xff09;概述 GridLayout 布局是 Android 4.0 以后引入的新布局&#xff0c;和 TableLayout(表格布局) 有点类似&#xff0c;不过它功能更多&#xff0c;也更加好用&#xff0c;最大的特点是放置的组件自动占据网格的整个区域,每个组件的…

《FPGA学习》->呼吸灯

&#x1f34e;与其担心未来&#xff0c;不如现在好好努力。在这条路上&#xff0c;只有奋斗才能给你安全感。你若努力&#xff0c;全世界都会为你让路。呼吸灯&#xff0c;简而言之就像人类呼吸一样&#xff0c;有节奏的让LED灯从&#xff1a;灭->微微亮->微亮->亮-&g…

K_A12_014 基于STM32等单片机驱动S12SD紫外线传感器模块 串口与OLED0.96双显示

K_A12_014 基于STM32等单片机驱动S12SD紫外线传感器模块 串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明IIC地址/采集通道选择/时序对应程序:数据对比&#xff1a;四、部分代码说明1、接线引脚定义1.1、STC89C52RCS12SD紫外线传感器模块1.2、STM32F103…

Leetcode.2257 统计网格图中没有被保卫的格子数

题目链接 Leetcode.2257 统计网格图中没有被保卫的格子数 Rating &#xff1a; 1709 题目描述 给你两个整数 m和 n表示一个下标从 0开始的 m x n网格图。同时给你两个二维整数数组 guards和 walls&#xff0c;其中 guards[i] [rowi, coli]且 walls[j] [rowj, colj]&#xff…

Jmeter常用断言之BeanShell断言详解

BeanShell断言可以使用beanshell脚本来执行断言检查&#xff0c;可以用于更复杂的个性化需求&#xff0c;使用更灵活&#xff0c;功能更强大&#xff0c;但是要能够熟练使用beanshell脚本 在这里除了可以使用beanshell的内置变量外&#xff0c;主要通过 Failure 和 FailureMess…

Dart中的混入类mixin

介绍 Mixin 是一种在多重继承中复用某个类中代码的方法模式。 Mixin 是面向对象程序设计语言中的类&#xff0c;提供了方法的实现。其他类可以访问mixin类的方法、变量而不必成为其子类。 简单来说就是官方设计了一个种可以方便复用的类&#xff0c;不必去实现很多接口。 应…

C++011-C++循环+枚举

文章目录C011-C循环枚举枚举枚举思想枚举举例题目描述 统计因数题目描述 质数判定错误方法一&#xff1a;优化方法1&#xff1a; 用break实现优化优化方法2&#xff1a; sqrt(n)题目描述 水仙花数题目描述 7744问题实现方法1优化方法2题目描述 余数相同问题题目描述 特殊自然数…

视频投票和图文投票之间的差异投票链接制作平台微擎投票

“我的舞台我的梦”网络评选投票_线上小程序的投票方式_视频投票的功能_在线投票程序用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投票服…

嵌入物理(PINN)还是基于物理(AD)?

文章目录1. 传统"反演问题"1.1 反演问题是什么1.2 常见反演问题1.3 传统反演问题的困境2. 深度学习优势3. AD inversion 例子3.1 ADsurf3.2 ADseismic关于PINN的内容大家可以直接google PINN (Physical-informed neural network),其主要的目的是用一个神经网络拟合物…