01第一个Mybatis程序+引入Junit+引入日志文件logback

Mybatis

  • MyBatis本质上就是对JDBC的封装,通过MyBatis完成CRUD。
  • 而对于JDBC,SQL语句写死在Java程序中,不灵活。改SQL的话就要改Java代码。违背开闭原则OCP。
  • 对于事务机制,MyBatis支持 或managed模式,JDBC模式中MyBatis将事物委托给JDBC管理;managed模式中MyBatis不再管理事务,此时可以使用Spring框架等管理事务;否则,程序根本不支持事务,这是不推荐的。
  • MyBatis属于半自动化ORM框架,虽然不会全自动生成,但是可调行高,易于debug。
  • 在这里插入图片描述
  • 将接口和 Java 的 POJOs(Plain Ordinary Java Object,简单普通的Java对象)映射成数据库中的记录

1.新建Mybatis项目

●步骤1:pom.xml中声明打包方式:jar(不需要war,因为mybatis封装的是jdbc。)
●步骤2:引入依赖(mybatis依赖 + mysql驱动依赖)
●步骤3:在resources根目录下新建mybatis-config.xml配置文件(可以参考mybatis手册拷贝)
注意1:mybatis核心配置文件的文件名不一定是mybatis-config.xml,可以是其它名字。
注意2:mybatis核心配置文件存放的位置也可以随意。这里选择放在resources根下,相当于放到了类的根路径下。

●步骤4:在resources根目录下新建CarMapper.xml配置文件(可以参考mybatis手册拷贝)
注意1:sql语句最后结尾可以不写“;”
注意2:CarMapper.xml文件的名字不是固定的。可以使用其它名字。
注意3:CarMapper.xml文件的位置也是随意的。这里选择放在resources根下,相当于放到了类的根路径下。
注意4:将CarMapper.xml文件路径配置到mybatis-config.xml:

●步骤5:编写mybatis程序myBatisIntroductionTest代码
注意1:默认采用的事务管理器是:JDBC。JDBC事务默认是不提交的,需要手动提交。

注意2:在mybatis中,执行sql语句的对象叫做SqlSession,是Java程序和数据库之间的一次会话.

而要获取SqlSession对象–先获取SqlSessionFactory对象–通过SqlSessionFactoryBuilder对象的Build方法,获取一个SqlSessionFactory对象.

●步骤6:运行程序,查看运行结果,以及数据库表中的数据

结构为
在这里插入图片描述

新建一个空项目,然后新建一个空白模块

项目设置中更改默认Maven设置,setting.xml设置

pom.xml中添加打包方式,依赖(mybatis,mysql)

<packaging>jar</packaging>

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.10</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-java -->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.30</version>
    </dependency>

在Main根目录下resources文件夹新建 mybatis-config.xml 文件(mybatis核心配置文件,只有一个)

<?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">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="${jdbc:mysql://localhost:3306/carreseller}"/>
                <property name="username" value="${root}"/>
                <property name="password" value="${Mysql998168}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
<!--         说明欲执行的mapper文件的存放位置-->
<!--        从根目录下开始查找,因此如果mapper文件就放在根目录下,则不用写出具体路径-->
        <mapper resource="CarMapper.xml"/>
    </mappers>
</configuration>

编写xxxMapper.xml(mybatis配置文件,多个,每个mapper文件对应一个表)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="TBD">
    <insert id="">
        insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
        values(null,'1003','toyota',30.00,'2000-10-11','燃油车')
    </insert>
</mapper>
package com.sunsplanter.mybatis.test;

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.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class MyBatisIntroductionTest {
    public static void main(String[] args) throws IOException {
        SqlSession sqlSession = null;
        try {
            // 获取对象的顺序为:SqlSessionFactoryBuilder-》SqlSessionFactory-》SqlSession
            //每个数据库中,这三者的关系是:1:1:n
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            //MyBatis包含了一个Resources类,用Resources类调方法,默认从类的根目录下开始找,因此如果mybatis-config.xml就放在Resources目录下,直接写名字就可以
            InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");//mybatis核心配置文件的路径

            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);

            sqlSession = sqlSessionFactory.openSession();

            //执行SQL语句,执行的语句在xxxMapper.xml中,并且并非一次执行完一个Mapper的全部代码
            // 因此通过id为参数,定位要执行的具体SQL代码块
            //insert可选返回值,返回值代表影响数据库中表项的个数.
            int count = sqlSession.insert("insertCar");
            System.out.println(count);

            //当mybatis-config.xml中<transactionManager type="JDBC"/>时,即将事务机制交给JDBC管理
            //而JDBC的autoCommit是false的,因此必须要sqlSession.commit手动提交,因此说此时sqlSession对象不支持自动提交。
            sqlSession.commit();
        } catch (Exception e) {
            // 回滚
            if (sqlSession != null) {
                sqlSession.rollback();
            }
            e.printStackTrace();
        } finally {
            // 6.关闭
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
}

引入Junit

引入Junit是为了替代main方法,可以单独测试各个单元。

● 使用JUnit步骤:
○ 第一步:引入依赖

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

○ 第二步:编写单元测试类【测试用例】,测试用例中每一个测试方法上使用@Test注解进行标注。
■ 测试用例的名字以及每个测试方法的定义都是有规范的:
● 测试用例(类)的名字:XxxTest
● 测试方法声明格式:public void test业务方法名(){}
// 测试用例
public class CarMapperTest{

// 测试方法
@Test
public void testInsert(){}

@Test
public void testUpdate(){}

}
○ 第三步:可以在类上执行,也可以在方法上执行
■ 在类上执行时,该类中所有的测试方法都会执行。
■ 在方法上执行时,只执行当前的测试方法。

引入日志文件

在mybatis-config.xml中的environments 标签前,可添加settings标签(若有,则相对位置必须要settings在前),是否开启日志,开启何种日志,就是其中一种setting。
在这里插入图片描述
logback作为一个框架,实现了SLF4J标准,因此,尽管setting中选择的日志是SLF4J,等会导入依赖还是导入logback。

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

使用logback,先添加依赖

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.11</version>
            <scope>test</scope>
        </dependency>

logback实现(包含了SLF4J),从依赖的关系中就可以看出来:
在这里插入图片描述

第二步:引入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>

此时再次执行代码,控制台会输出更详细的反馈,包括执行了哪条SQL语句。

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

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

相关文章

Spring见解 1.2

2.3.Spring的IOC解决程序耦合 2.3.1.创建工程 2.3.1.1.pom.xml <?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:sc…

vue3 插槽 slot 使用

vue3 插槽 slot 使用 在 Vue3 中&#xff0c;插槽&#xff08;slot&#xff09;是一种重要的组件复用和内容分发机制。通过使用插槽&#xff0c;可以让组件更加灵活和具有可复用性&#xff0c;在不同的地方渲染不同的内容&#xff0c;同时保证相同的样式。 插槽资料 官网介绍&…

分布式(10)

目录 46.什么是Session Replication? 47.什么是Session数据集中存储&#xff1f; 48.什么是Cookie Based Session? 49.什么是JWT&#xff1f;使用JWT的流程&#xff1f;对比传统的会话有啥区别&#xff1f; 50.如何设计一个秒杀系统&#xff1f; 51.接口设计要考虑哪…

地址变量与函数进阶

指针与函数的高级用法 1.数组2.函数的重载3.函数的指针类型参数4.可变参数函数链表5.函数指针6.指针函数7.内联函数8.总结 在上节中我们简单谈论了指针变量&#xff0c;这节我们就来讨论指针变量的实际应用。 1.数组 相信有一定C语言基础的小伙伴一定很熟悉这个类型。数组可以…

Node.js(四)-express

1. 初识express 1.1 express简介 1.1.1 什么是express 官方&#xff1a;Express是基于Node.js平台&#xff0c;快速、开放、极简的web开发框架。 通俗&#xff1a;Express的作用和Node.js内置的http模块类似&#xff0c;是专门用来创建web服务器的。 express的本质&#xff1…

KNN 分类(选择最佳的 K 值,并可视化模型精度与 n_neighbors 的关系)

import matplotlib.pyplot as plt from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier# 导入乳腺癌数据集 cancer load_breast_cancer()# 划分训练集和测试集 X_tra…

函数作用域和块级作用域

(1)Es5之前的作用域 在Es5之前只有全局作用域和函数作用域。 (1)全局作用域 范围:在winodw全局里面都生效 例子: for(var i0;i<5;i){}console.log(window.ii); 返回的结果是:True (2)函数作用域 范围:在这个函数里面生效 例子: function fn(b) {console.log(b);}con…

如何配置Zabbix告警邮件通知并基于GPT提供解决方案?

一、概述 时间来到2023年末&#xff0c;距离Open AI发布GPT-3.5&#xff0c;首次向公众推出ChatGPT已经整整过去了一年。如今&#xff0c;以ChatGPT为代表的人工智能模型已然被应用众多领域&#xff0c;当然也包括IT运维。在IT运维中&#xff0c;通过对接运维监控平台&#xff…

类和对象之拜访对象村

类和对象 1.面向对象的初步认知 ————&#xff08;进入对象村&#xff09;1.1为什么称为对象村1.2面向对象和面向过程 2.类的定义和使用————&#xff08;这个陌生人是谁&#xff1f;&#xff09;2.1简单认识类2.2类的定义格式2.3定义一个狗类 3.类的实例化之new一个“对…

Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found

IDEA创建spring boot项目的时候&#xff0c;pom.xml 文件中spring-boot-maven-plugin报红。 解决方法&#xff1a; 给spring-boot-maven-plugin指定版本 原因&#xff1a; idea自动找的插件版本是其他版本的&#xff0c;和自己设置的不同&#xff0c;导致idea在本地maven仓库…

深入解析JMeter响应断言功能

JMeter 是一个功能强大的性能测试工具&#xff0c;它可以模拟大量用户并发访问网站或应用程序&#xff0c;以测试其性能和稳定性。在进行性能测试时&#xff0c;我们需要对响应结果进行断言&#xff0c;以确保应用程序或网站的功能和性能符合预期。 在 JMeter 中&#xff0c;响…

Spring之强大的DefaultListableBeanFactory

系列文章目录 如何查看类继承结构参考这里 文章目录 系列文章目录一、DefaultListableBeanFactory的类继承实现结构二、实现接口 一、DefaultListableBeanFactory的类继承实现结构 二、实现接口 AliasRegistry&#xff1a;支持别名功能&#xff0c;一个名字可以对应多个别名B…

SpringBoot整合sentinel

1、引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> 2、 配置文件添加 spring:cloud:sentinel:transport:dashboard: ip:8858 项目重启&#x…

[PyTorch][chapter 9][李宏毅深度学习][CNN]

前言&#xff1a; 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;是一种深度学习模型或类似于人工神经网络的多层感知器&#xff0c;常用来分析视觉图像。卷积神经网络的创始人是着名的计算机科学家Yann LeCun&#xff0c;目前在Facebook工作&#xff0c;…

Time-series forecasting with deep learning: a survey

人们开发了许多深度学习架构来适应不同领域的时间序列数据集的多样性。在本文中&#xff0c;我们调查了一步前进和多水平时间序列预测中使用的常见编码器和解码器设计&#xff0c;描述了如何将时间信息纳入每个模型的预测中。接下来&#xff0c;我们重点介绍混合深度学习模型的…

数据结构【排序篇】

数据结构【排序篇】 文章目录 数据结构【排序篇】前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f; 目录一、插入排序二、交换排序三、 选择排序四、归并排序和基数排序 结语 前言 为什么突然想学算法了&#xff1f; > 用较为“官方”的语言讲…

SpringIOC之support模块DefaultMessageSourceResolvable

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

【ITK库学习】使用itk库进行图像配准:变换Transform(三)

目录 1、itkAffineTransform 仿射变换2、itkBSplineDeformableTransform B样条可变形变换 1、itkAffineTransform 仿射变换 该类实现向量空间的仿射变换&#xff08;例如空间坐标&#xff09; 此类允许定义和操作n维仿射空间&#xff08;及其关联的向量空间&#xff09;对其自…

QT C++调用python传递RGB图像和三维数组,并接受python返回值(图像)

目的&#xff1a; 用QT调用python代码&#xff0c;将QT读取的图像(Qimage)作为参数传入python中&#xff0c;将QT的三维数组作为参数传递给python&#xff0c;python接收QT传入的图像进行计算&#xff0c;将结果返回给QT并显示。 一 .pro 头文件的配置&#xff0c;和lib库的…

在 Mac 上轻松安装和配置 JMeter

Apache JMeter 是一个开源的负载测试工具&#xff0c;可以用于测试静态和动态资源&#xff0c;确定服务器的性能和稳定性。在本文中&#xff0c;我们将讨论如何下载和安装 JMeter。 安装 Java&#xff08;已安装 Java 的此步骤可跳过&#xff09; 要安装 Java&#xff0c;请按…