个人笔记Mybatis2

4.配置解析

4.1核心配置文件

  • mybatis-config.xml

  • MyBatis配置包含对MyBatis行为方式有显著影响的设置和属性

  • 在 MyBatis 中有两种类型的事务管理器 (也就是 type="[JDBC|MANAGED]”

configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)

4.2environments(环境配置)

Mybatis可以配置成适应多种环境

虽然可以配置多个环境,但每个SqlSessionFactory实例只能选择一个环境。

Mybatis默认的事务管理器就是JDBC,连接池:POOLED

4.3 configuration(配置)

我们可以通过properties属性来实现引用配置文件

这些是可外化的、可替换的属性,可以在典型的Java属性文件实例中配置,也可以通过properties元素的子元素传入(db.properties)

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF8
username=root
password=123456

官网:引入外部配置文件,这里面的优先级没有外部配置文件高(db.properties)

<properties resource="org/mybatis/example/config.properties"><property name="username" value="dev_user"/><property name="password" value="F2Fa3!33TYyg"/>这里面的优先级没有外部配置文件高(db.properties)
</properties>
<!--引入外部配置文件-->
<properties resource="db.properties"><property name="username" value="root"/><property name="pwd" value="11111"/>
</properties>
  • 可以直接引入外部文件

  • 可以在其中增加一些属性配置

  • 如果两个文件有同一个字段,优先使用外部配置文件的

实际应用1.加入了<properties resource="db.properties"/>

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--&lt;!&ndash;    引入外部配置文件&ndash;&gt;-->
<!--    <properties resource="db.properties"/>--><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?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF8"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource>
​
<!--            <dataSource type="POOLED">-->
<!--                <property name="driver" value="${driver}"/>-->
<!--                <property name="url" value="${url}"/>-->
<!--                <property name="username" value="${username}"/>-->
<!--                <property name="password" value="${password}"/>-->
<!--            </dataSource>-->
​</environment></environments>
<!--    每一个Mapper.xml都需要再Mybatis核心配置文件中注册--><mappers><mapper resource="com/lyj/dao/UserMapper.xml"/></mappers>
</configuration>

4.4typeAliases(类型别名)

  • 类型别名是为Java类型设置一个短的名字

  • 存在的意义仅在与用来减少类完全限定名的冗余

1.第一种

<typeAliases><typeAlias alias="Author" type="domain.blog.Author"/><typeAlias alias="Blog" type="domain.blog.Blog"/><typeAlias alias="Comment" type="domain.blog.Comment"/><typeAlias alias="Post" type="domain.blog.Post"/><typeAlias alias="Section" type="domain.blog.Section"/><typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>

例子

<!--    可以给实体类起别名-->
<!--    <typeAliases>-->
<!--        <typeAlias type="com.lyj.pojo.User" alias="User"/>-->
<!--    </typeAliases>-->

2.第二种

也可以指定一个包名,Mybatis会在包名下面搜索需要的Java Bean,比如:扫描实体类的包,它的默认别名就是这个类的类名,首字母小写

<typeAliases><package name="domain.blog"/>
</typeAliases>

例子

<typeAliases><package name="com.lyj.pojo"/></typeAliases>

在实体类比较少的时候,使用第一种方法

如果实体类十分多,建议使用第二种

第一种可以DIY别名,第二种则不行

如果非要改,泽需要在实体类上增加注解

3.第三种

在第二种包之中,如果@Alias注释被发现其值将被用作别名

@Alias("author")
public class Author {...
}

import org.apache.ibatis.type.Alias;@Alias("hello")
public class User {......}

Alias(别名)Mapped Type(映射类型)
_bytebyte
_char (since 3.5.10)char
_character (since 3.5.10)char
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
char (since 3.5.10)Character
character (since 3.5.10)Character
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
bigintegerBigInteger
objectObject
date[]Date[]
decimal[]BigDecimal[]
bigdecimal[]BigDecimal[]
biginteger[]BigInteger[]
object[]Object[]
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection
iteratorIterator

4.5settings(设置)

设置描述有效值默认
logImpl指定MyBatis应使用的日志记录实现。如果不存在此设置,则将自动发现日志记录实现。SLF4J | LOG4J (自3.5.9起已弃用) | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING未设置

4.6其他配置

typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件)

  • mybatis-generator

  • mybatis-plus

  • 通用mapper

4.7mappers(映射器)

可以使用类路径相对资源引用,完全限定的url引用 (包括file:///Url) 、类名或包名

1.使用类路径相对资源引用

<!-- Using classpath relative resources -->
<mappers><mapper resource="org/mybatis/builder/AuthorMapper.xml"/><mapper resource="org/mybatis/builder/BlogMapper.xml"/><mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

例子

<mappers><mapper resource="com/lyj/dao/UserMapper.xml"/></mappers>

2.使用class文件绑定注册

<!-- Using mapper interface classes -->
<mappers><mapper class="org.mybatis.builder.AuthorMapper"/><mapper class="org.mybatis.builder.BlogMapper"/><mapper class="org.mybatis.builder.PostMapper"/>
</mappers>

注意点:

  • 接口和它的Mapper配置文件必须同名

  • 接口和它的Mapper配置文件必须在同一个包下

3.使用URL

<!-- Using url fully qualified paths -->
<mappers><mapper url="file:///var/mappers/AuthorMapper.xml"/><mapper url="file:///var/mappers/BlogMapper.xml"/><mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>

4.8生命周期和作用域

生命周期类和作用域是非常重要的。不正确地使用它们会导致严重的并发问题

MyBatis 核心对象作用域说明

SqlSessionFactoryBuilder

  • 一旦创建了 SqlSessionFactory,就不再需要它了

  • 通常作为局部变量使用,仅用于构建 SqlSessionFactory 实例

SqlSessionFactory

  • 可类比为数据库连接池,负责创建 SqlSession 实例

  • 一旦创建,应在应用运行期间全程存在,无需(也不应)丢弃或重建实例

  • 最佳作用域:应用作用域(与应用同生命周期)

  • 实现方式:常用单例模式静态单例模式保证全局唯一

SqlSession

  • 可理解为连接池的一次请求 / 会话,用于执行 SQL 操作

  • 实例非线程安全,不能跨线程共享

  • 最佳作用域:请求 / 方法作用域(随请求或方法结束销毁)

  • 注意:使用后需主动关闭,避免资源泄漏

每一个Mapper就代表一个具体的业务

5.解决属性名和字段名不一致的问题

5.1

public class User {private int id;private String name;private String password;
}

类型处理器

select * from mybatis.user where id = #{id}select id,name,pwd from mybatis.user where id = #{id}

解决方法

起别名

<selece id="getUserById" resultType = "com.lyj.pojo.User">select id,name,pwd as password from mybatis.user where id = #{id}
</selece>

5.2resultMap

resultmap 元素是 MyBatis 中最重要最强大的元素

ResultMap 的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语句只需要描述它们的关系就行了。

结果集映射

<?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="com.lyj.dao.UserMapper">
​<!-- 结果集映射 --><resultMap id="UserMap" type="User"><!-- column 数据库中的字段,property 实体类中的属性 --><result column="id" property="id"/><result column="name" property="name"/><result column="pwd" property="password"/></resultMap>
​<select id="getUserById" resultMap="UserMap">select * from mybatis.user where id = #{id}</select>
​
</mapper>

6.日志

6.1日志工厂

如果一个数据库操作,出现了异常,我们需要排错,就需要用到日志

  • SLF4J

  • LOG4J (自3.5.9起已弃用) ???

  • LOG4J2

  • JDK_LOGGING

  • COMMONS_LOGGING

  • STDOUT_LOGGING (需要掌握)

  • NO_LOGGING

STDOUT_LOGGING (需要掌握)

<settings>
<!--        标准的日志工厂实现--><setting name="logImpl" value="STDOUT_LOGGING"/></settings>

LOG4J (自3.5.9起已弃用)

LOG4J (自3.5.9起已弃用)是Apache的一个开源项目,通过使用Log4j,

我们可以控制日志信息输送的目的地是控制台、文件GUI组件

我们也可以控制每一条日志的输出格式;

通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

使用:

1.在要使用Log4j的类中,导入包import org.apache.log4j.Logger;

2.日志对象,参数为当前类的class

static Logger logger = Logger.getLogger(UserDaoTest.class);
​

3.日志级别

logger.info("info:进入了testLog4j");logger.debug("debug:进入了testLog4j");logger.error("error:进入了testLog4j");

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

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

相关文章

使用 Maxwell 和 RabbitMQ 监控 Mysql Flowable 表变更

为什么需要监控数据库变化&#xff1f;当 Flowable 表中的数据发生变化&#xff08;例如插入新任务、更新状态或删除记录&#xff09;&#xff0c;我们可能需要触发其他操作&#xff0c;比如通知用户、更新仪表盘或启动新流程。Maxwell 可以读取 MySQL 的二进制日志&#xff08…

MySQL面试题及详细答案 155道(041-060)

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

mysql_mcp_server_pro源码部署及启动报错新手指南:让智能体长出手来直接获取到最底层的数据

文章目录 源码部署 1.克隆项目地址 2.创建虚拟环境 3.激活环境 4.进入项目目录下 5.安装依赖 6.进入到src目录 7.在当前目录下,新建一个.env文件 8.配置数据库信息 9.启动项目 10.启动权限管理启动项目 启动报错了: 问题现象与直接原因 解决方案与操作步骤 方案1:允许忽略未定…

jupyter服务器创建账户加映射对外账户地址

文章目录一、创建test1-test10用户&#xff08;跳过已存在的test3&#xff09;二、检查必要组件是否安装解决方法&#xff1a;用紧凑格式避免换行解析错误核心修复说明&#xff1a;使用方法&#xff1a;以下是根据需求生成的命令、检查脚本及启动脚本&#xff0c;按步骤执行即可…

DDR中的POD与ODT

一、POD&#xff08;Pseudo Open Drain&#xff09;技术1. 定义与工作原理POD&#xff08;伪开漏&#xff09; 是DDR4/LPDDR4引入的电压标准与驱动架构&#xff0c;替代传统的SSTL&#xff08;Stub Series Terminated Logic&#xff09;。其核心特征是将上拉电源从VDDQ改为VTT&…

企业架构之导论(1)

一、企业架构是什么 企业架构是对企业业务、数据、应用、技术四大核心领域及其相互关系的系统化描述与设计框架。它像一张“城市蓝图”,确保业务战略能精准映射到IT落地: 本质:是连接业务战略(做什么)与技术执行(怎么做)的结构化方法论。 核心组件: 业务架构:定义业…

实战:在已有K8S集群如何新增和删除Node节点

本篇文章将分享一下如何在已有集群添加新节点和删除现有节点1 新增节点到K8S集群新增节点可以分为准备节点、配置节点和将其加入集群三步。1.1 准备新节点准备一个相同操作系统的主机作为新节点。参考以前部署的文章&#xff1a;实战部署k8s 1.28版本集群&#xff0c;跟着操作到…

C++ 黑马 内存分配模型

一, 内存分配模型内存总共有四个分区1 代码区 主要用来存储二进制代码&#xff0c;由操作系统进行管理2 栈区 由编译器自己进行释放和分配&#xff0c;例如函数的传递的参数&#xff0c;局部变量&#xff0c;const修饰的局部常量等等....3 堆区 由程序员自己分配和释放&am…

【华为仓颉编程语言】运行第一个仓颉程序

欢迎来到仓颉编程语言的第一个实战课程。 上节课我们成功安装了仓颉工具链&#xff0c;今天让我们一起编写并运行第一个仓颉程序。相信很多同学都还记得学习第一门编程语言时写的"Hello World"程序&#xff0c;那种看到程序成功运行的激动心情。今天&#xff0c;我们…

利用DeepSeek改写并增强测试Duckdb和sqlite的不同插入方法性能

在前文基础上&#xff0c;好奇作为事务型数据库的SQLite表现怎么样&#xff0c;让DeepSeek来帮忙。 提示词 请仿照附件编写用python插入sqlite数据的测试函数&#xff0c;如果sqlite3没有对应方法就省略 import sqlite3 import pandas as pd import timemethods [字符串拼接, …

进程管理块(PCB):操作系统进程管理的核心数据结构

进程管理块&#xff08;PCB&#xff09;&#xff1a;操作系统进程管理的核心数据结构在现代操作系统中&#xff0c;进程管理块&#xff08;Process Control Block, PCB&#xff09; 是内核用来描述、管理和控制进程生命周期的最核心、最关键的数据结构。它就像是一个进程的“身…

线程的sleep、wait、join、yield如何使用?

sleep:让线程睡眠&#xff0c;期间会出让cpu&#xff0c;在同步代码块中&#xff0c;不会释放锁 wait(必须先获得对应的锁才能调用):让线程进 入等待状态,释放当前线程持有的锁资源线程只有在notify 或者notifyAll方法调用后才会被唤醒,然后去争夺锁. join: 线程之间协同方式,使…

2025年服装智能跟单系统TOP3推荐榜单

TOP1领军者首选推荐&#xff1a;金蝶服装系统【★★★★★】 在服装智能跟单系统的领域&#xff0c;金蝶服装系统凭借其强大的功能和卓越的性能脱颖而出&#xff0c;成为众多企业的首选。尽管本文标题提及的是另一份榜单&#xff0c;但值得一提的是&#xff0c;金蝶系统若参与评…

基于FFmpeg的B站视频下载处理

起因是这样的一天&#xff0c;本人在B站客户端缓存了一个视频&#xff0c;用于学习参考等学术交流&#xff0c;但是视频和音频却是分开且通过Win Hex查看发现文件头含有9个“30”&#xff0c;想到一个个手动删字节不如让程序取代&#xff0c;便有了本文章这一篇文章发布之前&am…

【Vue Router】路由模式、懒加载、守卫、权限、缓存

前言 Vue Router 是 Vue 生态中处理页面跳转的核心工具&#xff0c;它解决了单页应用中 URL 管理、组件切换、状态维护等关键问题&#xff0c;同时提供了丰富的功能&#xff08;如动态路由、嵌套路由、路由守卫&#xff09;。除了经常用到的路由配置以外&#xff0c;我们还需了…

Linux epoll 实现详解 (fs/eventpoll.c)

核心数据结构分析 1. struct eventpoll (epoll 实例核心结构) c struct eventpoll {struct mutex mtx; // 保护 epoll 结构的互斥锁wait_queue_head_t wq; // epoll_wait() 使用的等待队列wait_queue_head_t poll_wait; // 文件 poll() 使用的等待队列struc…

【牛客刷题】小红的项链(字节跳动面试题)

文章目录 一、题目介绍 1.1 输入描述 1.2 输出描述 1.3 示例 二、算法设计思路 三、流程图 四、题解实现 五、复杂度分析 六、关键算法知识点 一、题目介绍 原题链接:https://www.nowcoder.com/practice/3da065cab096478eb603bbfca5af8b02 小红将 n n n个珠子排成一排,然后…

【Html网页模板】HTML炫酷星空(一闪一闪亮晶晶)

文章目录专栏导读功能预览快速开始核心实现拆解1. 背景与基础布局2. 背景层静态星空&#xff08;轻微闪烁&#xff09;3. 前景层“亮晶晶”的闪烁小星星4. 交互与动效5. 行星装饰可配置项与个性化建议初始化顺序&#xff08;入口&#xff09;源码结语专栏导读 &#x1f525;&am…

第一天-CAN Signal信号的Multiplexor多路复用在DBC中实现

&#x1f680; CAN总线的“变形金刚术”&#xff1a;Multiplexor多路复用信号深度揭秘在汽车电子江湖中&#xff0c;当数百个ECU争相发送数据时&#xff0c;如何让一条CAN报文像"变形金刚"一样自由切换形态&#xff1f;Multiplexor&#xff08;多路复用&#xff09;技…

Code Exercising Day 10 of “Code Ideas Record“:StackQueue part02

文章目录【150. Evaluate Reverse Polish Notation】【239. Sliding Window Maximum】【347. Top K Frequent Elements】【150. Evaluate Reverse Polish Notation】 Problem Link Approach: Use a stack. Push numbers onto the stack; when encountering an operator, pop t…