秒鲨后端之MyBatis【1】环境的搭建和核心配置文件详解

别忘了请点个赞+收藏+关注支持一下博主喵!!!! ! !

Mybatis简介

MyBatis历史

  • MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github
  • iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)

MyBatis特性

  1. MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
  2. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
  3. MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
  4. MyBatis 是一个 半自动的ORM(Object Relation Mapping)框架

MyBatis下载

  • MyBatis下载地址
  • 在这里插入图片描述

和其它持久化层技术对比

  • JDBC
  • SQL 夹杂在Java代码中耦合度高,导致硬编码内伤
    • 维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见
    • 代码冗长,开发效率低
  • Hibernate 和 JPA
  • 操作简便,开发效率高
    • 程序中的长难复杂 SQL 需要绕过框架
    • 内部自动生产的 SQL,不容易做特殊优化
    • 基于全映射的全自动框架,大量字段的 POJO 进行部分映射时比较困难。
    • 反射操作太多,导致数据库性能下降
  • MyBatis
  • 轻量级,性能出色
    • SQL 和 Java 编码分开,功能边界清晰。Java代码专注业务、SQL语句专注数据
    • 开发效率稍逊于HIbernate,但是完全能够接受

搭建MyBatis

开发环境

  • IDE:idea 2019.2
  • 构建工具:maven 3.5.4
  • MySQL版本:MySQL 5.7
  • MyBatis版本:MyBatis 3.5.7

创建maven工程

  • 打包方式:jar

  • 引入依赖

    <dependencies><!-- Mybatis核心 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><!-- junit测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- MySQL驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.3</version></dependency>
    </dependencies>
    

创建MyBatis的核心配置文件

习惯上命名为mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合Spring之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。
核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息
核心配置文件存放的位置是src/main/resources目录下

<?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>  <!--设置连接数据库的环境, localhost后填表名-->  <environments default="development">  <environment id="development">  <transactionManager type="JDBC"/>  <dataSource type="POOLED">  <property name="driver" value="org.postgresql.Driver"/><property name="url" value="jdbc:postgresql://localhost:5432/postgres"/><property name="username" value="postgres"/><property name="password" value="aaa53557860"/></dataSource>  </environment>  </environments>  <!--引入映射文件-->  <mappers>  <!--java是以包的形式,故全类名为.而resources是目录的形式,故全类名为路径/--><mapper resource="mappers/UserMapper.xml"/>  </mappers>  
</configuration>

创建mapper接口

MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要提供实现类

package com.atguigu.mybatis.mapper;  public interface UserMapper {  /*MyBatis面向接口编程的两个一致:1. 映射文件的namespace要和mapper接口的全类名保持一致2. 映射文件中SQL语句的id要和mapper接口中的方法名一致即:表--实体类--mapper接口--映射文件*//*在这里声明各类sql功能函数,再到UserMapper.xml文件写sql语句*//*添加用户信息*/ int insertUser();  
}

创建MyBatis的映射文件

  • 相关概念:ORM(Object Relationship Mapping)对象关系映射。
  • 对象:Java的实体类对象
    • 关系:关系型数据库
    • 映射:二者之间的对应关系
Java概念数据库概念
属性字段/列
对象记录/行
  • 映射文件的命名规则
  • 表所对应的实体类的类名+Mapper.xml
    • 例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml
    • 因此一个映射文件对应一个实体类,对应一张表的操作
    • MyBatis映射文件用于编写SQL,访问以及操作表中的数据
    • MyBatis映射文件存放的位置是src/main/resources/mappers目录下
  • MyBatis中可以面向接口操作数据,要保证两个一致
  • mapper接口的全类名和映射文件的命名空间(namespace)保持一致
    • mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致
<?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">
<!--namespace:名称空间,指定为接口的全类名-->
<mapper namespace="com.atguigu.mybatis.mapper.UserMapper"> <!--SQL语句写在xml映射文件中--><!--int insertUser()--><!--这样调用mapper接口中的方法就可以根据mapper接口的全类名去匹配到这个xml映射文件,然后再根据我们调用的方法名来匹配到咱们的SQL语句--><!--输入<可以看到sql的各种关键字如select,insert等等-->
<!--int insertUser() 
!注意标签为要执行的关键字操作,如下是insert快捷方式为输入<insert后enter,写上函数方法名后,再在末尾加上>后自动补全标签,同时光标自动置于中间位置,供输入sql语句
-->  <insert id="insertUser"><!--这里要遵循不同的SQL语法--> insert into t_user (username,password,email) values ('admin','123456','admin@atguigu.com')</insert>  
</mapper>

通过junit测试功能

  • SqlSession:代表Java程序和数据库之间的会话。(HttpSession是Java程序和浏览器之间的会话)
  • SqlSessionFactory:是“生产”SqlSession的“工厂”
  • 工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象
public class UserMapperTest {@Testpublic void testInsertUser() throws IOException {//读取MyBatis的核心配置文件InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//获取SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();//通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);//获取sqlSession,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务//SqlSession sqlSession = sqlSessionFactory.openSession();//创建SqlSession对象,设置参数为true,此时通过SqlSession对象所操作的sql都会自动提交  SqlSession sqlSession = sqlSessionFactory.openSession(true);//通过代理模式创建UserMapper接口的代理实现类对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配映射文件中的SQL标签,并执行标签中的SQL语句int result = userMapper.insertUser();//提交事务,没设置true的话要如下手动提交事务//sqlSession.commit();System.out.println("result:" + result);}
}
  • 此时需要手动提交事务,如果要自动提交事务,则在获取sqlSession对象时,使用SqlSession sqlSession = sqlSessionFactory.openSession(true);,传入一个Boolean类型的参数,值为true,这样就可以自动提交
  • 注意,以上是insert方法的测试函数testInsertUser(),如果要写(测试)其他的方法,要照着上面重新写一遍,注意一些函数名改一下即可。

加入log4j日志功能

  1. 加入依赖

    <!-- log4j日志 -->
    <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
    </dependency>
    
  2. 加入log4j的配置文件

    • log4j的配置文件名(固定的,大多数日志的配置文件名字都是固定的)为log4j.xml,存放的位置是src/main/resources目录下
    • 日志的级别:FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试) 从左到右打印的内容越来越详细,当为日志配置级别如时,及设置打印等级大于等于debug级别的日志即DEBUG,INFO,WARN,ERROR,FATAL。
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"><param name="Encoding" value="UTF-8" /><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" /></layout></appender><logger name="java.sql"><level value="debug" /></logger><logger name="org.apache.ibatis"><level value="info" /></logger><root><level value="debug" /><appender-ref ref="STDOUT" /></root>
    </log4j:configuration>
    

运行之前的juint-test测试java文件:打印了我们设置的三个日志

在这里插入图片描述

核心配置文件详解

MyBatis核心配置文件中的标签必须按照固定的顺序(有的标签可以不写,但顺序一定不能乱):
properties、settings、typeAliases、typeHandlers、objectFactory、objectWrapperFactory、reflectorFactory、plugins、environments、databaseIdProvider、mappers

自己创建的(resources下)properties文件长这样:(为了区分当引入多个properties的键的重名问题,可以加上jdbc-properties方法.driver如jdbc.driver这样来区分)可以通过下面的方式直接引入,而无需按照之前的方式填driver,url,username,password,只需要按照接下来的如${jdbc.driver}一样填即可

在这里插入图片描述

<?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文件,此时就可以${属性名}的方式访问属性值--><properties resource="jdbc.properties"></properties><settings><!--将表中字段的下划线自动转换为驼峰--><setting name="mapUnderscoreToCamelCase" value="true"/><!--开启延迟加载--><setting name="lazyLoadingEnabled" value="true"/></settings><typeAliases><!--typeAlias:设置某个具体的类型的别名属性:type:需要设置别名的类型的全类名alias:设置此类型的别名,且别名不区分大小写。若不设置此属性,该类型拥有默认的别名,即类名如下面就为User以下就是以com.atguigu.mybatis.pojo。User数据库类--><!--<typeAlias type="com.atguigu.mybatis.pojo.User"></typeAlias>--><!--这里就实现了以类名[称为类型别名]User代替冗长的全类名com.atguigu.mybatis.pojo.User(虽然可以不设置,默认就可以为User--><!--<typeAlias type="com.atguigu.mybatis.pojo.User" alias="User"></typeAlias>--><!--以包为单位,设置改包下所有的类型都拥有默认的别名(通常用这个),即类名且不区分大小写--><packagename="com.atguigu.mybatis.pojo"/></typeAliases><!--environments:设置多个连接数据库的环境,就是在这个标签内可以设置多个environment(标签),里面可以各不相同属性:default:设置默认使用的环境的id--><environments default="mysql_test"><!--environment:设置具体的连接数据库的环境信息属性:id:表示连接数据库的环境的唯一标识,不能重复,可通过environments标签中的default设置某一个环境的id,表示默认使用的环境--><environment id="mysql_test"><!--transactionManager:设置事务管理方式属性:type:设置事务管理方式,type="JDBC|MANAGED"type="JDBC":设置当前环境的事务管理都必须手动处理(执行SQL时)type="MANAGED":设置事务被管理,例如spring中的AOP(执行SQL时)--><transactionManager type="JDBC"/><!--dataSource:设置数据源属性:type:设置数据源的类型,type="POOLED|UNPOOLED|JNDI"type="POOLED":使用数据库连接池,即会将创建的连接进行缓存,下次使用可以从缓存中直接获取,不需要重新创建type="UNPOOLED":不使用数据库连接池,即每次使用连接都需要重新创建type="JNDI":调用上下文中的数据源--><dataSource type="POOLED"><!--设置连接数据库驱动类的全类名--><property name="driver" value="${jdbc.driver}"/><!--设置连接数据库的连接地址--><property name="url" value="${jdbc.url}"/><!--设置连接数据库的用户名--><property name="username" value="${jdbc.username}"/><!--设置连接数据库的密码--><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--引入映射文件--><mappers><!-- <mapper resource="UserMapper.xml"/> --><!--以包为单位,将包下所有的映射文件引入核心配置文件注意:1. 此方式必须保证mapper接口和mapper映射文件必须在相同的包下2. mapper接口要和mapper映射文件的名字一致--><package name="com.atguigu.mybatis.mapper"/></mappers>
</configuration>

package包:类似于一层一层的目录的形式。

例如在resources下创建package:

新建目录,1.如果是这样创建:com.atguigu.mybatis,生成的是一个com.atguigu.mybatis.xml的文件,看着像包,然而右键用资源管理器点开,发现长这样:

只有一个目录,并不是包

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

而2.如果是com/atguigu/mybatis/xml,生成的也是一个com.atguigu.mybatis.xml的文件,但是长这样:

这才是真正的package的样子
在这里插入图片描述
在这里插入图片描述

别忘了请点个赞+收藏+关注支持一下博主喵!!!! ! !

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

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

相关文章

虚幻引擎结构之ULevel

在虚幻引擎中&#xff0c;场景的组织和管理是通过子关卡&#xff08;Sublevel&#xff09;来实现的。这种设计不仅提高了资源管理的灵活性&#xff0c;还优化了游戏性能&#xff0c;特别是在处理大型复杂场景时。 1. 场景划分模式 虚幻引擎采用基于子关卡的场景划分模式。每个…

Linux文件目录 --- 移动和改名命令MV、强制移动、试探性移动过、按时间移动

二、MV移动改名命令 重命名文件&#xff1a;mv [选项] 旧文件名 新文件名 移动文件/文件夹&#xff1a;mv [选项] 源文件 目标目录 选项作用-b当覆盖文件时会对被覆盖文件进行先行备份。-i交互式操作&#xff0c;当目标文件已经存在时&#xff0c;会询问是否覆盖。-n试探性覆盖…

Linux服务器端自动挂载存储设备(U盘、移动硬盘)

前言 Linux服务器挂载存储设备需要使用mount&#xff0c;因为服务器的存储通常是固定的&#xff0c;很少存在频繁的插拔USB存储设备的现象 &#xff0c;使用Linux系统本身是没有较为简单的自动挂载存储设备的方法的。 涉及知识点 udev udev可以监测USB设备的插入、拔出事件&…

CentOS7下的vsftpd服务器和客户端

目录 1、安装vsftpd服务器和ftp客户端&#xff1b; 2、配置vsftpd服务器&#xff0c;允许普通用户登录、下载、上传文件&#xff1b; 3、配置vsftpd服务器&#xff0c;允许anonymous用户登录、下载、上传文件&#xff1b; 4、配置vsftpd服务器&#xff0c;允许root用户登录…

系统思考—全局思维

昨天接到一个企业需求&#xff0c;某互联网公司VP希望N-1的核心团队一起学习系统思考&#xff0c;特别是在新业务快速发展的阶段。公司增长势头不错&#xff0c;但如何解决跨部门的协作问题&#xff0c;成为了瓶颈。全局思维就是关键。产品、技术、市场、运营、客服……如何打破…

information_schema是什么?

前言 在现代数据驱动的应用开发中&#xff0c;理解和管理数据库结构变得尤为重要。几乎所有的SQL数据库管理系统&#xff08;DBMS&#xff09;都提供了一个名为 information_schema 的虚拟数据库。它不仅是一个了解数据库内部结构的强大工具&#xff0c;也是一个实现跨平台兼容…

MySQL中Seconds_Behind_Master是怎么计算的

目录 1.Seconds_Behind_Master计算方式2.Seconds_Behind_Master 计算方式会存在什么问题3.更好的方式3.1 实现方法3.2 优点在MySQL中,Seconds_Behind_Master是一个用于表示从库(Slave)落后于主库(Master)的时间(以秒为单位)的指标。 1.Seconds_Behind_Master计算方式 其…

Linux 中检查 Apache Web Server (httpd) 正常运行时间的 4 种方法

注&#xff1a;机翻&#xff0c;未校。 4 Ways To Check Uptime of Apache Web Server (httpd) on Linux November 28, 2019 by Magesh Maruthamuthu We all know about the purpose of uptime command in Linux. 我们都知道 Linux 中 uptime 命令的目的。 It is used to c…

活着就好20241225

亲爱的朋友们&#xff0c;大家早上好&#xff01;&#x1f31e; 今天是25号&#xff0c;星期三&#xff0c;2024年12月的第二十五天&#xff0c;同时也是第51周的第三天&#xff0c;农历甲辰[龙]年十一月初二十一日。在这晨光熹微的美好时刻&#xff0c;愿那和煦而明媚的阳光照…

《Swift 字面量》

《Swift 字面量》 介绍 在 Swift 编程语言中&#xff0c;字面量是一种表示源代码中固定值的表达方式。字面量可以直接表示数字、字符串、布尔值等基本数据类型&#xff0c;为编程提供了简洁和直观的方式。Swift 支持多种类型的字面量&#xff0c;包括整数字面量、浮点数字面量…

oracle使用imp命令导入dmp文件

需求&#xff1a; 增量导入 tbl_servicelegalclause 表数据&#xff08;dmp格式&#xff09;。 导入思路&#xff1a;使用 dba 创建一个 临时库&#xff0c;先将 tbl_servicelegalclause.dmp&#xff08;增量的数据&#xff09; 文件导入到 临时库&#xff0c;然后确认临时库数…

美国加州房价数据分析01

1.项目简介 本数据分析项目目的是分析美国加州房价数据&#xff0c;预测房价中值。 环境要求&#xff1a; ancondajupyter notebookpython3.10.10 虚拟环境&#xff1a; pandas 2.1.1 numpy 1.26.1 matplotlib 3.8.0 scikit-learn1.3.1 2. 导入并探索数据集 通用的数据分析…

LabVIEW软件开发的未来趋势

LabVIEW软件开发的未来趋势可以从以下几个方面来分析&#xff1a; ​ 1. 与AI和机器学习的深度结合 趋势&#xff1a;LabVIEW正在向集成AI和机器学习方向发展&#xff0c;尤其是在数据处理、预测性维护和自动化控制领域。 原因&#xff1a;AI技术的普及使得实验和工业场景中的…

使用Amazon Bedrock的无服务器的智能工作流

使用Amazon Bedrock的无服务器的智能工作流 智能工作流基于用户输入处理不可预见的任务&#xff0c;比如发起API调用。无服务器架构可以高效地管理这些任务和不同的工作负载&#xff0c;而无需维护服务器&#xff0c;从而加快部署速度。 你将学习如何通过使用带有保护措施的智能…

近实时”(NRT)搜索、倒排索引

近实时&#xff08;Near Real-Time, NRT&#xff09;搜索 近实时&#xff08;NRT&#xff09;搜索是 Elasticsearch 的核心特性之一&#xff0c;指的是数据在被写入到系统后&#xff0c;可以几乎立即被搜索和查询到。虽然它不像传统数据库那样完全实时&#xff0c;但它的延迟通…

【NACOS插件】使用官网插件更换NACOS数据库

说明 nacos 2.3.1默认支持mysql和derby数据库&#xff0c;如果想要支持其他数据库&#xff0c;可以通过使用插件方式实现。对于该插件的使用&#xff0c;官方说明文档较为粗略(不过也没问题&#xff0c;实际上整个过程就是很简单&#xff0c;只是使用者想复杂了)&#xff0c;网…

Java 深拷贝全面解析

1. 引言 在 Java 编程中&#xff0c;对象之间的复制是一个常见的需求。根据复制的深度不同&#xff0c;我们可以将复制分为浅拷贝和深拷贝。本文将深入探讨 深拷贝&#xff08;Deep Copy&#xff09; 的概念、应用场景、具体实现方法及其优缺点&#xff0c;并提供一些实用的建…

Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集FGSM介绍FGSM代码实现FGSM算法实现攻击效果 代码汇总fgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR10进行分类 Pytorch | 从零构建Vgg…

vue3入门教程:ref函数

基本用法 引入 ref 首先&#xff0c;你需要从 vue 包中引入 ref 函数&#xff1a; import { ref } from vue;创建一个响应式变量 使用 ref 函数来创建一个响应式变量&#xff1a; const count ref(0);这里&#xff0c;count 是一个响应式引用对象&#xff0c;其 .value 属性初…

【IC验证】verilog及systemverilog特殊特性的分析

verilog及systemverilog特殊特性的分析 1.概述2.赋值延迟&#xff08;0&#xff09;总结&#xff08;1&#xff09;情况一&#xff1a;initial中进行阻塞赋值和非阻塞赋值&#xff08;不延迟&#xff09;a代码b 电路图c 结果 &#xff08;2&#xff09;时钟a 代码b 电路图c 结果…