MyBatis学习笔记之首次开发及文件配置

news2024/11/24 20:29:00

文章目录

  • MyBatis概述
    • 框架
    • 特点
  • 有关resources目录
  • 开发步骤
  • 从XML中构建SqlSessionFactory
  • MyBatis中有两个主要的配置文件
  • 编写MyBatis程序
  • 关于第一个程序的小细节
  • MyBatis的事务管理机制
    • JDBC
    • MANAGED
  • 编写一个较为完整的mybatis
  • junit测试
  • mybatis集成日志组件

MyBatis概述

框架

  • 在文献中看到的framework被翻译为框架
  • Java常用框架:
    • SSM三大框架:Spring + SpringMVC +MyBatis
    • SpringBoot
    • SpringCloud
    • 等。。
  • 枢架其实就是对通用代码的封装,提前写好子了一堆接口和类,我们可以在做项目的时候直接引入这些接口和类(引入框架),基于这些现有的接口和类进行开发,可以大大提高开发效率
  • 框架一般都法jar包的形式存在。(jar包中有class文件以及各种配置文件等。)
  • SSM三大框架的学习顺序:MyBatis、Spring.SpringMVC(仅仅是建议)

特点

  • 支持定制化SQL、存储过程、基本映射以及高级映射
  • 避免了几乎所有的JDBC代码中手动设置参数以及获取结果集
  • 支持XML开发,也支持注解式开发。【为了保证sql语句的灵活,所以mybatis大部分是采用XML方式开发。】
  • 将接口和Java的POJOs(Plain Ordinary Java Object,简单普通的Java对象)映射成数据库中的记录
  • 体积小好学:两个jar包,两个XML配置文件。
  • 完全做到sql解耦合。
  • 提供了基本映射标签。
  • 提供了高级映射标签。
  • 提供了XML标签,支持动态SQL的编写。

有关resources目录

放在这个目录当中的,一般都是资源文件,配置文件
直接访问在resources目录下的资源,等同于放到了类的根路径下。

开发步骤

  • 第一步:打包方式jar
<packaging>jar<packaging>
  • 第二部:引入依赖
<dependencies>
	<!--mybatis依赖-->
	<dependency>
		<groupId>org.mybatis</groupId>		
		<artifactId>mybatis</artifactId>
		<version>3.5.10</version>
	</dependency>
	
	<!--mysql驱动依赖-->
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>	
		<version>8.0.38</version>
	</dependency>
</dependencies>
  • 第三步:编写MyBatis核心配置文件:mybatis-config.xml

注意:
第一:这个文件名不是必须叫做mybatis-config.xml,可以用其他的名字。只是大家都采用这个名字。
第二:这个文件存放的位置也不是固定的,可以随意,但一般情况下,会放到类的根路径下。

mybatis-config.xml文件中的配置信息不理解没关系,先把数据库的信息修改以下即可。其他的别动

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<environments default=""development">
		<environment id="development">
			<transactionHanager type="JDBC/>
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.cj.jdbc.Drivercom.mysql.cj.jdbc.Driver"/>	
				<property name="url" value="jdbc:mysql://localhost:3306/demo"/>//这个是找到mysql并找到要操作的数据库
				<property name="username" value="root"/>//mysql的账号
				<property name="password" value="root"/>//mysql的密码		
			</dataSource>
		</environment>
	</environments>
	<mappers>
	<mapper resource="CarMapper.xml"/>//配置Mapper的地方
	</mappers>
</configuration>
  • 第四步:编写XxxxMapper.xml文件。

在这个配置文件当中编写SQL语句
这个文件名也不是固定的,放的位置也不是固定的,这里给它起个名字,叫做CarMapper.xml
把它暂时放到类的根路径下。

<mapper namespace="fdsafdsa">//这个namespace暂时可以随便取
	<!--insert语句,id是这条SQL语句的唯一标识。这个id就代表了这条SQL语句。-->
	<insert id="insertCar">
		insert into t_car(id, car_num, brand, guide_price, produce_time ,car_type)
		values(null, '1083','丰田霸道',30.0," 2088-10-11','燃油车')
	</insert>
</mapper>
  • 第五步:在mybatis-config.xml文件中指定XxxxMapper.xml文件的路径:
<mapper resource="CarMapper.xml"/>

注意:resource属性会自动从类的路径下开始查找资源


  • 第六步:开始编写MyBatis程序(使用mybatis的类库,编写mybatis程序,连接数据库,做增删改查就行了。)

从XML中构建SqlSessionFactory

从官方的这句话中,能想到什么

  • 第一:在MyBatis中一定是有一个很重要的对象,这个对象是:SqlSessionFactory对象。
  • 第二:SalSessionFactory对象的创建需要XML

XML是什么?

  • 他一定是一个配置文件

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

其中一个是:mybatis-config.xml,这是核心配置文件,主要配置连接数据库的信息等。(一个)
另一个是:XxxMapper.xml,这个文件是专门用来编写SQL语句的配置文件。(一个表一个)

  • t_user表,一般会对应一个UserMapper.xml
  • t_student表,一般会对应一个StudentMapper.xml

编写MyBatis程序

zaiMyBatis中,负责执行SQL语句的那个对象叫做什么?

  • SqlSession

SqlSession是专门用来执行SQL语句的,是一个Java程序和数据库之间的一次会话

要想获取SqlSession对象,需要先获取SqlSessionFactory对象,通过SqlSessionFactory工厂来实现SqlSession对象。

那如何获取SqlSessionFactory对象?
通过SqlSessionFactoryBuilder对象的build方法,来获取一个SqlSessionFactory对象。

mybatis的核心对象包括:

  • SqlSessionFactoryBuilder
  • SqlSessionFactory
  • SqlSession
    SqlSessionFacotryBuilder --> SqlSessionFactory -->SqlSession
public class MyBatisIntroductionTest {
	public static void main(string[] args) {
	//获取SqlSessionFactoryBuilder对象
	sqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
	//获取SqlSessionFactory对象
	//Inputstream is = new FileInputStream( name: "mybatis-config.xml文件的路径");
	InputStream is = Resources.getResourceAsStream( "mybatis-config.xml");
	//Resources.getResourceAsStream默认就是从类的根路径下开始查找资源
	SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
	//获取SqlSession对象
	SqlSession sqlSession = sqlSessionFactory.openSession():
	
	//执行SQL语句
	int count = sqlSession.insert( s: "insertCar"");//返回值是影响数据库表当中的记录条数。
	
	System.out.println("插入了几条记录:" + count);
	
	//手动提交
	sqlSession.commit();
	}
}

关于第一个程序的小细节

  • mybatis中sql语句的结尾";"可以省略。
  • Resources.getResourceAsStream

小技巧:以后凡是遇到resource这个单词,大部分情况下,这种加载资源的方式就是从类的根路径下开始加载。(开始查找)
优点:采用这种方式,从类路径当中加载资源,项目的移植性很强。项目从windows移植到linux,代码不需要修改,因为这个资源文件一直都在类路径当中。

  • InputStream is = new FileInputstream(“d:\lmybatis-config.xml”);

采用这种方式也可以。
缺点:可移植性太差,程序不够健壮。可能会移植到其他的操作系统当中。导致以上路径无效,还需要修改java代码中的路径。这样违背了OCP原则。

  • 己经验证了:

mybatis核心配置文件的名字,不一定是: mybatis-config.xml。可以是其它名字。
mybatis核心配置文件存放的路径,也不一定是在类的根路径下。可以放到其它位置。但为了项目的移植性,他壮性,最好将这个配置文件放到类路径下面。

  • InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream(“mybatis-config .xml”);

classLoader.getSystemclassLoader()获取系统的类加载器。
系统类加载器有一个方法叫做:getResourceAsStream
它就是从类路径当中加载资源的。
通过源代码分析发现:
Inputstream is = Resources.getResourceAsStream("mybatis-config.xml");底层的源代码其实就是:
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xm1");

  • CarMapper.xml文件的名字是固定的吗? CarMapper.xml文件的路径是固定的吗?

都不是固定的。
resource属性:这种方式是从类路径当中加载资源
url属性:这种方式是从绝对路径当中加载资源。

MyBatis的事务管理机制

  • 在mybatis-config.xml文件中,可以通过以下的配置进行mybatis的事务管理
<transactionMapper type="JDBC"/>
  • type属性的值就包括两个:JDBC和MANAGED(大小写无所谓)
  • 在mybatis中提供了两种事务管理机制:JDBC事务管理器,MANAGED事务管理器

只要autoCommit是true,就表示没有开启事务。
只有autoCommit是false的时候,就表示开启了事务。

JDBC

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

conn.setAutoCommit(false);//开启事务
//...业务处理...
conn.commit();//手动提交事务

如果编写的是下面的代码

SqlSession sqlSession = sqlSessionFactory.openSession(true);

表示的是没有开启事务,因为这种方式压根不会执行:conn.setAutoCommit(false);
在JDBC事务中,没有执行conn.setAutoCommit(false);那么autoCommit就是true。
如果autoCommit是true,就表示没有开启事务。只要执行任意一条DML语句就要提交一次。

如果你没有在JDBC代码中执行:conn.setAutoCommit(false);的话,默认的autoCommit是false

MANAGED

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

我不管事务了,你来负责把

对于我们当前的单纯的只有mybatis的情况下,如果配置为:MANAGED
那么事务这块是没人管的。没有人管理事务表示事务压根没开启

编写一个较为完整的mybatis

package org.example;

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 MyBatisCompleteText {
    public static void main(String[] args) {
        SqlSession sqlsession = null;
        try {
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
            sqlsession = sqlSessionFactory.openSession();//执行SQL语句,处理相关业务
            int count = sqlsession.insert("insertCar");
            System.out.println(count);
            //执行到这里,没有发生任何异常,提交事务。终止事务。sqlsession.commit();
        }catch (Exception e) {
            //最好回滚事务
            if (sqlsession != null) {
                sqlsession.rollback();
            }
            e.printStackTrace();
        }
		finally {
            //关团会话(释放资源>
            if (sqlsession != null) {
                sqlsession.close();
            }
        }
    }
}

junit测试

为了保证自己写的模块方法没问题,需要对其进行测试

单元测试方法写多少个
一般是一个业务方法对应一个测试方法
测试方法的规范:public void testXxxx(){}
测试方法的方法名:以test开始,假设测试的方法是sum,这个测试方法名:testSum
@Test注释非常重要,被这个注解标注的方法就是一个单元测试方法


单元测试中有两个重要的概念
一个是实际值(被测试的业务方法的真正执行结果)
一个是期望值(执行了这个业务方法之后,你期望的执行结果是多少)

//写的模块
package org.example;

public class MathServer {
    public int sum(int a,int b){
        return a+b;
    }
    public int sub(int a, int b){
        return a-b;
    }
}
//测试
package service;

import org.example.MathServer;
import org.junit.Assert;
import org.junit.Test;

public class MathServerTest {
    @Test
    public void testSum(){
        MathServer mathServer = new MathServer();
        //获取实际值
        int actual = mathServer.sum(1,2);
        //获取期望值
        int expected = 3;
        //加断言进行测试
        Assert.assertEquals(expected,actual);
    }

    @Test
    public void testSub(){
        MathServer mathServer = new MathServer();
        //实际值
        int actual = mathServer.sub(10,5);
        //期望值
        int expected = 5;
        Assert.assertEquals(expected,actual);
    }
}

在这里插入图片描述
绿色测试通过

mybatis集成日志组件

这玩意能让我们调试起来更加方便

在核心配置文件里面(mybatis-config.xml)中配置settings
这是MyBatis中极为重要的调整设置,它们会改变MyBatis的运行时行为。
链接:https://mybatis.net.cn/configuration.html#settings

↑可以查看settings中可以设置什么,以及它的作用

    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!--开启mybatis自己对日志的实现-->
    </settings>

常见的mybatis集成日志组件有哪些呢?(在上面代码value中设置的还有啥)

  • SLF4J(沙拉风),是一个日志标准,其中有一个框架叫做logback,它实现了沙拉风规范
  • LOG4J
  • LOG4J2
  • STDOUT_LOGGING

其中STDOUT_LOGGING是标准日志,mybatis已经实现了这种标准日志,mybatis框架本身已经实现了这种标准
what is more标签是有它的顺序的在configuration标签中得按照它的标签顺序进行排序,不然会报错


集成logback日志框架。logback日志框架实现了slf4j标准

  • 第一步:引入logback的依赖
<!--第一次引入也挺快的-->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.11</version>
</dependency>
  • 第二步:引入logback所必须的xml配置文件
    这个配置文件的名字必须叫做:logback.xml或logback_test.xml,不能是其他的名字
    这配置文件必须放到类的根路径下,不能是其他的位置。

注意注意,不要用1.4开头的那个版本,会出现输出不了日志的情况

<!--logback配置文件的内容-->
<?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} - %msg8n</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{yYvy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度Xmsg:日志消息,%n是换行符--><pattern>%d{yyyy-MMN-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>

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

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

相关文章

win11 系统暂无可用音频设备导致播放失败/音频服务未响应

win11 系统暂无可用音频设备导致播放失败/音频服务未响应 win11再一次更新后音频突然用不了了&#xff0c;驱动和输出设备都显示正常&#xff0c;但每次播放就会出现下面的问题&#xff0c;重启和更新驱动也没用。最后百度了好久终于解决了。 最后发现可能是新的驱动和电脑不兼…

【C++11】function包装器的简单使用

function 1 function包装器使用场景2 包装器3 包装成员函数4 一道例题5 包装器的意义 1 function包装器使用场景 现在有代码如下&#xff1a; 要求声明出这两个函数的类型 int f(int a,int b) {return a b; } struct Functor {int operator(int a,int b){return a b;} }可以…

(atan2)+(最小回文字符统计)

C - Nearest vectors long double eps1e-18 atan2:x正轴旋转的弧度角&#xff0c;y>0为正&#xff0c;y<0为负const long double PIacos(-1.0); const long double eps1e-18; struct node {ll id;long double x,y,z; }t[NN]; bool cmp1(node l,node r) {return l.zep…

布隆过滤器在海量数据去重验证中应用

布隆过滤器在海量数据去重验证中应用 文章目录 布隆过滤器在海量数据去重验证中应用引子面试结束级方案——从数据库中取新手级方案——利用redis的set数据结构专业级方案——利用布隆过滤器 布隆过滤器基本概念优点缺点布隆过滤器的数据结构布隆过滤器的工作流程布隆过滤器的优…

位1的个数:一种高效且优雅的解法

本篇博客会讲解力扣“191. 位1的个数”的解题思路&#xff0c;这是题目链接。 要想求解二进制位中1的个数&#xff0c;首先要了解一个神奇的表达式&#xff1a;n & n - 1。这个表达式的含义是&#xff1a;把n的二进制中最低位的1变成0&#xff0c;也就是消除n的二进制中最低…

day5-环形链表II

142.环形链表II 力扣题目链接 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&am…

Prometheus实现钉钉报警

1、Prometheus实现钉钉报警 1.1 Prometheus环境 # my global config global:scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute…

位运算专题

异或:相同为0&#xff0c;相异为1&#xff0c;无进位相加 约定:给定的所有数从左到右依次是从低位到高位&#xff0c;下标从0开始 一)给定一个数&#xff0c;判断它的二进制位表示中的第X位是0还是1 1)(N>>X)&1&#xff0c;先将x位右移动到最低位&#xff0c;然后再将…

warp框架教程5-Filter系统中各个模块

any 模块 any 模块只有一个方法&#xff0c;就是 any 方法&#xff0c;它可以匹配任何路由的过滤器。我们可以使用 any 方法将一些可克隆的资源转换成一个过滤器&#xff0c;从而允许轻松地将它与其他 Filter 结合在一起。当然也可以使用 any 方法创建适用于多个 Filter 的末尾…

Android Hook技术实战详解

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 前言&#xff1a; 什么是Android Hook技术&#xff1f; Android Hook技术是指在Android…

Sentinel流量规则模块(新增)

系统并发能力有限&#xff0c;比如系统A的QPS支持1个请求&#xff0c;如果太多请求过来&#xff0c;那么系统A就应该进行流量控制了&#xff0c;比如其他请求直接拒绝 新增流控规则介绍:新增流控规则窗口 1.资源名&#xff1a;默认请求路径。 2.针对来源&#xff1a;Se…

WebRTC基础

有用的网址&#xff1a; https://webrtc.org/ WebRTC API - Web API 接口参考 | MDN Browser APIs and Protocols: WebRTC - High Performance Browser Networking(OReilly) 浏览器中查看webrtc运行的实时信息&#xff1a; Chrome浏览器&#xff1a;chrome://webrtc-inter…

Linux(Ubuntu2004)实现kitti数据集的点云投影记录

1、新建终端打开roscore roscore 2、在“下载”路径里面播放example_new的bag rosbag play example_new.bag -l 3、在catkin_ws里面运行下列命令 rosrun ros_detection_tracking projector 如果不能运行&#xff0c;可以采用tab的方式查看是否错误 4、新建一个终端运行r…

Kafka 入门到起飞 - 生产者发送消息流程解析

生产者通过send&#xff08;&#xff09;方法发送消息消息会经过拦截器->序列化器->分区器 进行加工然后将消息存在缓冲区当缓冲区中消息达到条件会按批次发送到broker对应分区上broker将接收到的消息进行刷盘持久化消息处理broker会返回给producer响应落盘成功返回元数据…

孟德尔随机化推断暴露因素与健康结局的因果关系

学习视频&#xff1a; 应用孟德尔随机化方法推断暴露因素与健康结局的因果关系 王友信教授 梅斯医学_哔哩哔哩_bilibili http://chinaepi.icdc.cn/zhlxbx/ch/reader/create_pdf.aspx?file_no20170427&flag1&journal_idzhlxbx&year_id2017 1. 孟德尔随机化方法 传…

详细介绍matlab使用支持向量机(SVM)预测股票市场趋势的实例

简介: 股票市场的趋势预测一直是投资者和交易员关注的重要问题之一。支持向量机(SVM)作为一种强大的机器学习算法,被广泛应用于股票市场趋势预测。本实例将介绍如何使用SVM来预测股票市场的涨跌趋势,并提供一个MATLAB代码示例。 数据准备: 首先,我们需要获取股票市场的历…

《面试1v1》Kafka优缺点别用错

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

常用在线AI人工智能效率工具站点导航

详情请前往&#xff1a;常用在线AI人工智能工具站点导航

stm32(HAL库)使用printf函数打印到串口

目录 1、简介 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 串口外设配置 2.3 项目生成 3、KEIL端程序整合 4、效果测试 1、简介 在HAL库中&#xff0c;常用的printf函数是无法使用的。本文通过重映射实现在HAL库中进行printf函数。 2.1 基础配置 2.1.1 SYS配置 2.1.2 …

quartus工具篇——modelsim的使用

文章目录 quartus工具篇——modelsim的使用1、modelsim简介二、使用教程1、新建工程添加文件 2、生成编写仿真文件3、设置仿真4、开启功能仿真5、开启时序仿真6、总结参考视频&#xff1a; quartus工具篇——modelsim的使用 1、modelsim简介 Quartus Prime是一款由英特尔开发…