MyBatis——MyBatis入门程序

一、数据准备

二、开发步骤 

1、引入依赖 

<dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.15</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.2.0</version></dependency>
</dependencies>

2、编写核心配置文件: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><!--允许设置多个环境,但是每个 SqlSessionFactory 实例只能选择一种环境设置默认的环境:development--><environments default="development"><!-- 环境配置,名称为:development --><environment id="development"><!-- 配置事物管理器为 JDBC --><transactionManager type="JDBC"/><!-- 配置数据源 --><dataSource type="POOLED"><!-- 配置数据库连接信息 --><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatisdb"/><property name="username" value="root"/><property name="password" value="mysql"/></dataSource></environment></environments><mappers><!-- 指定 XxxMapper.xml 文件 --><mapper resource="CarMapper.xml"/></mappers>
</configuration>

3、编写 XxxMapper.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="qiuXuan"><!--id就代表了下面的这条sql语句--><insert id="insertCar">insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)values(null,'1003','五菱宏光',30.0,'2020-09-18','燃油车');</insert>
</mapper>

4、在 mybatis-config.xml 文件中指定 XxxMapper.xml 文件的路径

 5、编写 MyBatis 程序

  • 在 MyBatis 当中 SqlSession 负责 SQL 语句的执行,是 Java 程序与数据库之间的会话

  • 要获取 SqlSession 对象,需要先获取 SqlSessionFactory 对象,通过 SqlSessionFactory 工厂来生产 SqlSession 对象

如何获取 SqlSessionFactory 对象?

通过 SqlSessionFactoryBuilder 对象的 build 方法获取一个 SqlSessionFactory 对象

SqlSessionFactoryBuilder ---> SqlSessionFactory ---> SqlSession  

package com.qiuxuan;public class MyBatisIntroductionTest {public static void main(String[] args) throws IOException {// 获取 SqlSessionFactoryBuilderSqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();/*** 获取 SqlSessionFactory** build 方法的参数为一个 InputStream* 指向 mybatis-config.xml 核心配置文件** 可以通过 MyBatis 的 Resources 工具类获取* 其 getResourceAsStream 方法返回的就是一个 InputStream* 参数为核心配置文件路径(默认从类根路径[resources]查找资源)*/InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory factory = builder.build(is);// 获取 SqlSessionSqlSession sqlSession = factory.openSession();// 执行 SQL 语句(参数为 SQL 语句的 id)int count = sqlSession.insert("insertCar");System.out.println(count);// mybatis 默认是不会自动提交的,需要手动提交sqlSession.commit();}
}

三、MyBatis 中有两个主要的配置文件

  • mybatis-config.xml(一个)

    • 核心配置文件,主要配置连接数据库的信息等

  • XxxMapper.xml(一个表一个)

    • 用于编写 SQL 语句的配置文件

四、Tips 

mybatis 中 sql 语句的结尾 “;” 可以省略

使用 Resources.getResourceAsStream 获取资源文件的方式符合 OCP 原则,有利于程序的移植性、健壮性

若使用 FileInputStream 方式获取资源文件,当程序需要在其他系统运行时,原来的路径将会失效,需要修改 Java 代码中的资源路径,违背了 OCP 原则

也可使用类加载器获取资源:

ClassLoader.getSystemClassLoader().getResourceAsStream("资源路径");

Resources.getResourceAsStream 一致,都是从根路径获取资源,即 resources 目录下

ClassLoader.getSystemClassLoader() 获取的是系统类加载器,而 Resources.getResourceAsStream 底层使用的就是 ClassLoader.getSystemClassLoader()

五、MyBatis 的事务管理机制 

在 mybatis-config.xml 文件中,可以通过以下的配置进行 mybatis 的事务管理  

<transactionManager type="JDBC"/>

type 属性包括两个值:JDBC、 MANAGED,对应两种事务管理机制

  • JDBC 事务管理器

    • MyBatis 框架自己采用管理事务,自己采用原生的 JDBC 代码去管理事务

    • 使用 JDBC 事务管理器底层创建事务管理对象的是 JdbcTransation 对象

conn.setAutoCommit(false); 开启事务

若使用 JDBC 事务管理器,在 factory.openSession() 底层会执行此语句

若使用 factory.openSession() 时传入参数 true,则底层不会执行 conn.AutoCommit(false),也就不会开启事务,此时执行任意 DML 语句都会自动提交

业务处理...

conn.commit(); 提交事务

  • MANAGED 事务管理器

    • mybatis 不再负责事务的管理了,事务管理交给其他容器负责,例如:Spring

六、较完整的 MyBatis 程序 

package com.qiuxuan;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class MyBatisCompleteCodeTest {public static void main(String[] args) {SqlSession sqlSession = null;try {// 1.创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();// 2.创建SqlSessionFactory对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));// 3.创建SqlSession对象sqlSession = sqlSessionFactory.openSession();// 4.执行SQLint count = sqlSession.insert("insertCar");System.out.println("更新了几条记录:" + count);// 5.提交sqlSession.commit();} catch (Exception e) {// 回滚if (sqlSession != null) {sqlSession.rollback();}e.printStackTrace();} finally {// 6.关闭if (sqlSession != null) {sqlSession.close();}}}
}

七、Junit 单元测试 

JUnit 是专门做单元测试的组件。

  • 在实际开发中,单元测试一般是由我们 Java 程序员来完成的。

    • 要对自己写的每一个业务方法负责任,要保证每个业务方法在进行测试的时候都能通过。

  • 测试的过程中涉及到两个概念:

    • 期望值

    • 实际值

  • 期望值和实际值相同表示测试通过,期望值和实际值不同则单元测试执行时会报错。

1、引入依赖 

<!-- junit依赖 -->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope>
</dependency>

 2、编写单元测试类【测试用例】

测试用例中每一个测试方法上使用 @Test 注解进行标注。

测试用例的名字以及每个测试方法的定义都是有规范的:

  1. 测试用例的名字:XxxTest

  2. 测试方法声明格式:public void test业务方法名(){}

// 测试用例
public class CarMapperTest{// 测试方法@Testpublic void testInsert(){}@Testpublic void testUpdate(){}}

可以在类上执行,也可以在方法上执行

  • 在类上执行时,该类中所有的测试方法都会执行。

  • 在方法上执行时,只执行当前的测试方法。

  • 编写一个测试用例,来测试 insertCar 业务

public class CarMapperTest {@Testpublic void testInsertCar(){SqlSession sqlSession = null;try {// 1.创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();// 2.创建SqlSessionFactory对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));// 3.创建SqlSession对象sqlSession = sqlSessionFactory.openSession();// 4.执行SQLint count = sqlSession.insert("insertCar");System.out.println("更新了几条记录:" + count);// 5.提交sqlSession.commit();} catch (Exception e) {// 回滚if (sqlSession != null) {sqlSession.rollback();}e.printStackTrace();} finally {// 6.关闭if (sqlSession != null) {sqlSession.close();}}}
}

八、logback 日志框架 

  • 引入日志框架的目的是为了看清楚 mybatis 执行的具体 sql。

  • 启用标准日志组件,只需要在 mybatis-config.xml 文件中添加以下配置:【可参考 mybatis 手册】

mybatis-config.xml

<settings><setting name="logImpl" value="STDOUT_LOGGING" />
</settings>

注意:<configuration> 里配置的位置是有顺序要求的,否则会报错

Error creating document instance. Cause: org.xml.sax.SAXParseException;

<configuration><properties>...</properties><settings>...</settings><typeAliases>...</typeAliases><typeHandlers>...</typeHandlers><objectFactory>...</objectFactory><objectWrapperFactory>...</objectWrapperFactory><reflectorFactory>...</reflectorFactory><plugins>...</plugins><environments>...</environments><databaseIdProvider>...</databaseIdProvider><mappers>...</mappers>
</configuration>

标准日志也可以用,但是配置不够灵活,可以集成其他的日志组件,例如:log4j,logback等。

  • logback 是目前日志框架中性能较好的,较流行的,所以选它。

  • 引入 logback 相关依赖

<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.11</version><scope>test</scope>
</dependency>
  • 引入 logback 相关配置文件(文件名叫做 logback.xml 或 logback-test.xml,放到类路径当中)

<?xml version="1.0" encoding="UTF-8"?><configuration debug="false"><!-- 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!-- 按照每天生成日志文件 --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--日志文件输出的文件名--><FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern><!--日志文件保留天数--><MaxHistory>30</MaxHistory></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder><!--日志文件最大的大小--><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>100MB</MaxFileSize></triggeringPolicy></appender><!--mybatis log configure--><logger name="com.apache.ibatis" level="TRACE"/><logger name="java.sql.Connection" level="DEBUG"/><logger name="java.sql.Statement" level="DEBUG"/><logger name="java.sql.PreparedStatement" level="DEBUG"/><!-- 日志输出级别,logback日志级别包括五个:TRACE < DEBUG < INFO < WARN < ERROR --><root level="DEBUG"><appender-ref ref="STDOUT"/><appender-ref ref="FILE"/></root></configuration>

九、MyBatis 工具类 SqlSessionUtil 的封装

 每一次获取 SqlSession 对象代码太繁琐,封装一个工具类

/*** MyBatis工具类** @author 秋玄* @version 1.0.0* @since 1.0.0*/
public class SqlSessionUtil {private static final SqlSessionFactory sqlSessionFactory;/*** 类加载时初始化sqlSessionFactory对象*/static {try {SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));} catch (Exception e) {e.printStackTrace();}}/*** 每调用一次openSession()可获取一个新的会话,该会话支持自动提交。** @return 新的会话对象*/public static SqlSession openSession() {return sqlSessionFactory.openSession(true);}
}

一  叶  知  秋,奥  妙  玄  心

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

netty配置SSL、netty配置https(开发)

netty配置SSL、netty配置https&#xff08;开发&#xff09; 我们在开发下使用ssl&#xff0c;所用的证书将不被客户端信任。 转自&#xff1a;https://lingkang.top/archives/netty-pei-zhi-ssl 方案一 快速。使用netty提供的临时签发证书 private static SslContext sslC…

python实现背单词程序

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.分析 一.前言 背单词是学习英语的一个重要环节,它有很多好处,以下是其中一些主要的好处: 提高词汇量

未授权访问:Memcached 未授权访问漏洞

目录 1、漏洞原理 2、环境搭建 3、未授权访问 防御手段 今天继续学习各种未授权访问的知识和相关的实操实验&#xff0c;一共有好多篇&#xff0c;内容主要是参考先知社区的一位大佬的关于未授权访问的好文章&#xff0c;还有其他大佬总结好的文章&#xff1a; 这里附上大…

如何访问远程MySQL数据库服务器?

访问远程MySQL数据库服务器是一项常见的任务&#xff0c;它允许我们在不同的地点通过网络连接到MySQL服务器&#xff0c;并进行数据库管理和数据处理操作。我们将重点介绍一种名为【天联】的组网技术&#xff0c;该技术提供了一系列优势&#xff0c;使远程访问MySQL数据库服务器…

【AI+换脸换装】从OpenAI 探索色情露骨内容领域浅聊AI换脸换装

5月9日消息&#xff0c;据外电报道&#xff0c;OpenAI 周三发布了文档草案&#xff0c;阐述了它希望 ChatGPT 及其其他人工智能技术如何运作。冗长的Model Spec 文件的一部分透露&#xff0c;该公司正在探索进军色情和其他露骨内容领域。 看完这个&#xff0c;心里有点惊讶&am…

HarmonyOS NEXT星河版之美团外卖点餐功能实战(下)

文章目录 一、购物车逻辑1.1 购物车及加减菜1.2 菜品的加减---方案一1.3 菜品的加减---方案二1.4 购物车View完善1.5 清空购物车1.5 购物车数量和价格 二、小结 一、购物车逻辑 1.1 购物车及加减菜 在utils目录下新建CartStore.ets文件&#xff0c;如下&#xff1a; import …

华为与达梦数据签署全面合作协议

4月26日&#xff0c;武汉达梦数据库股份有限公司&#xff08;简称“达梦数据”&#xff09;与华为技术有限公司&#xff08;简称“华为”&#xff09;在达梦数据武汉总部签署全面合作协议。 达梦数据总经理皮宇、华为湖北政企业务总经理吕晓龙出席并见证签约&#xff1b;华为湖…

Istio中的全局限流方案

Istio中的全局限流方案 在k8s网格&#xff08;istio&#xff09;环境中&#xff0c; 可以通过创建Envfoyfilter的方式来配置限流。 在istio官方文档中&#xff0c;提供了两种限流方式&#xff1a; 本地限流全局限流 本地限流的细节这里不再赘述, 主要讲解全局限流的配置方式…

解双曲型非线性方程的Harden-Yee算法(TVD格式)

解双曲型非线性方程的Harden-Yee算法 先贴代码&#xff0c;教程后面有空再写 import matplotlib import math matplotlib.use(TkAgg) import numpy as np import matplotlib.pyplot as plt def Phiy(yy,epsi):#phi(y)if abs(yy) > epsi:phiyy abs(yy)else:phiyy (yy*yy…

VTK 数据类型:规则网格

VTK 数据类型&#xff1a;规则网格 VTK 数据类型&#xff1a;规则网格分类三种规则网格需要的设置实例 VTK 数据类型&#xff1a;规则网格 分类 VTK 有 3 种规则网格&#xff1a; vtkImageData&#xff1a;几何结构和拓扑结构都是规则的。vtkRectilinearGrid&#xff1a;几何…

AI大模型探索之路-训练篇20:大语言模型预训练-常见微调技术对比

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

MATLAB 基于格网的点云最低点采样 (69)

MATLAB 基于格网的点云最低点采样 (69) 一、算法原理二、算法实现1.代码2.效果三、数据链接一、算法原理 最低点格网采样是一种基于点云数据的简化技术。它通过将点云数据划分为网格,并在每个网格单元中保留最低的点来实现简化。以下是该方法的步骤: 1 定义格网尺度: 选…

AI绘画的基本原理是什么?

目录 一、AI绘画的基本原理是什么&#xff1f; 二、Python中有几个库可以用于AI绘画&#xff1f; 三、OpenCV画一个人形 四、AI画的红苹果 一、AI绘画的基本原理是什么&#xff1f; AI绘画的原理基于机器学习和人工智能技术&#xff0c;通过这些技术模型能够理解文本描述并…

【python】将json内解码失败的中文修改为英文(‘utf-8‘ codec can‘t decode,labelme标注时文件名未中文)

出现问题的场景&#xff1a; 语义分割数据集&#xff0c;使用labelme工具进行标注&#xff0c;然后标注图片存在中文名&#xff0c;导致json标签文件写入中文图片名&#xff0c;从而解析失败。 代码解析json文件时&#xff0c;出现报错&#xff1a; python脚本需求&#x…

汽车EDI:安通林Antolin EDI 项目案例

安通林&#xff08;Antolin&#xff09;是一家全球性的汽车零部件制造商&#xff0c;专注于汽车内饰系统和零部件的生产&#xff0c;致力于创新和采用先进的技术。近年来 安通林Antolin 推动其供应商部署EDI系统&#xff0c;使得双方能够通过EDI传输业务单据&#xff0c;极大提…

【oj题】环形链表

目录 一. OJ链接&#xff1a; 环形链表 【思路】 快慢指针 ​编辑【扩展问题】 为什么快指针每次走两步&#xff0c;慢指针走一步可以解决问题&#xff1f; ​编辑【扩展问题】快指针一次走3步&#xff0c;走4步&#xff0c;...n步行吗&#xff1f; 二. OJ链接&#xff1a…

带有-i选项的sed命令在Linux上执行成功,但在MacOS上失败了

问题&#xff1a; 我已经成功地使用以下 sed 命令在Linux中搜索/替换文本&#xff1a; sed -i s/old_string/new_string/g /path/to/file然而&#xff0c;当我在Mac OS X上尝试时&#xff0c;我得到&#xff1a; command i expects \ followed by text我以为我的Mac运行的是…

Liunx_DNS域名解析服务

目录 DNS术语 域名分层 顶级域名&#xff08;Top-Level Domain, TLD&#xff09; 二级域名&#xff08;Second-Level Domain, SLD&#xff09; 子域名&#xff08;Subdomain&#xff09; FQDN&#xff08;Fully Qualified Domain Name&#xff09; 域名分层的意义 域名…

【研发日记】Matlab/Simulink避坑指南(十二)——Initialize Function执行Bug

文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结归纳 前言 见《研发日记&#xff0c;Matlab/Simulink避坑指南(七)——数据溢出钳位Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑指南(八)——else if分支结构Bug》 见《研发日记&#xff0c;Matlab/Simuli…

如何在 Mac 上恢复已删除的文件

点击“删除”后立即后悔&#xff1f;不用担心。我们的教程介绍了如何恢复已删除的 Mac 文件、电子邮件、iTunes 音乐等&#xff0c;即使您没有 Time Machine 备份并且无需支付软件费用。 在 macOS 中丢失文件可能会非常痛苦&#xff0c;如果您是点击删除的人&#xff0c;情况会…