MyBatis解析全局配置文件

MyBatis解析全局配置文件

MyBaits基础应用:

文档:MyBatis

链接:http://note.youdao.com/noteshare?id=5d41fd41d970f1af9185ea2ec0647b64

传统JDBC和Mybatis相比的弊病

传统JDBC

Connection conn = null;
PreparedStatement pstmt = null;
try {         // 1.加载驱动         Class.forName("com.mysql.jdbc.Driver");          // 2.创建连接         conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis_example", "root", "123456");           // SQL语句         String sql = "select id,user_name,create_time from t_user where id=?";          // 获得sql执行者         pstmt = conn.prepareStatement(sql);pstmt.setInt(1, 1);          // 执行查询         //ResultSet rs= pstmt.executeQuery();         pstmt.execute();ResultSet rs = pstmt.getResultSet();rs.next();User user = new User();user.setId(rs.getLong("id"));user.setUserName(rs.getString("user_name"));user.setCreateTime(rs.getDate("create_time"));System.out.println(user.toString());
}

传统JDBC的问题如下:

1.数据库连接创建,释放频繁造成西戎资源的浪费,从而影响系统性能,使用数据库连接池可以解决问题。

2.sql语句在代码中硬编码,造成代码的不已维护,实际应用中sql的变化可能较大,sql代码和java代码没有分离开来维护不方便。

3.使用preparedStatement向有占位符传递参数存在硬编码问题因为sql中的where子句的条件不确定,同样是修改不方便/

4.对结果集中解析存在硬编码问题,sql的变化导致解析代码的变化,系统维护不方便。

mybatis对传统的JDBC的解决方案

1、数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。

解决:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。

2、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

3、向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。

解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。

4、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。

解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。

Mybaits整体体系图

0

0

一个Mybatis最简单的使用列子如下:

String resource = "mybatis-config.xml";
Reader reader;
try {//将XML配置文件构建为Configuration配置类             reader = Resources.getResourceAsReader(resource);             // 通过加载配置文件流构建一个SqlSessionFactory  DefaultSqlSessionFactory SqlSessionFactorysqlMapper = new SqlSessionFactoryBuilder().build(reader);             // 数据源 执行器  DefaultSqlSession SqlSession session = sqlMapper.openSession();try {                 // 执行查询 底层执行jdbc                 // User user = (User)session.selectOne("com.tuling.mapper.selectById", 1);                  UserMapper mapper = session.getMapper(UserMapper.class);System.out.println(mapper.getClass());User user = mapper.selectById(1L);System.out.println(user.getUserName());} catch (Exception e) {e.printStackTrace();} finally {session.close();}
} catch (IOException e) {e.printStackTrace();
}

总结下就是分为下面四个步骤:

  • 从配置文件(通常是XML文件)得到SessionFactory;
  • 从SessionFactory得到SqlSession;
  • 通过SqlSession进行CRUD和事务的操作;
  • 执行完相关操作之后关闭Session。

启动流程分析

String resource = "mybatis-config.xml"; 
//将XML配置文件构建为Configuration配置类 
reader = Resources.getResourceAsReader(resource); 
// 通过加载配置文件流构建一个SqlSessionFactory  DefaultSqlSessionFactory

通过上面代码发现,创建SqlSessionFactory的代码在SqlSessionFactoryBuilder中,进去一探究竟:

//整个过程就是将配置文件解析成Configration对象,然后创建SqlSessionFactory的过程
//Configuration是SqlSessionFactory的一个内部属性
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {try {XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);return build(parser.parse());} catch (Exception e) {throw ExceptionFactory.wrapException("Error building SqlSession.", e);} finally {ErrorContext.instance().reset();try {inputStream.close();} catch (IOException e) {// Intentionally ignore. Prefer previous error.}}
}public SqlSessionFactory build(Configuration config) {return new DefaultSqlSessionFactory(config);
}

下面我们看下解析配置文件过程中的一些细节。

先给出一个配置文件的列子:

<?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><!--SqlSessionFactoryBuilder中配置的配置文件的优先级最高;config.properties配置文件的优先级次之;properties标签中的配置优先级最低 --><properties resource="org/mybatis/example/config.properties"><property name="username" value="dev_user"/><property name="password" value="F2Fa3!33TYyg"/></properties><!--一些重要的全局配置--><settings><setting name="cacheEnabled" value="true"/><!--<setting name="lazyLoadingEnabled" value="true"/>--><!--<setting name="multipleResultSetsEnabled" value="true"/>--><!--<setting name="useColumnLabel" value="true"/>--><!--<setting name="useGeneratedKeys" value="false"/>--><!--<setting name="autoMappingBehavior" value="PARTIAL"/>--><!--<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>--><!--<setting name="defaultExecutorType" value="SIMPLE"/>--><!--<setting name="defaultStatementTimeout" value="25"/>--><!--<setting name="defaultFetchSize" value="100"/>--><!--<setting name="safeRowBoundsEnabled" value="false"/>--><!--<setting name="mapUnderscoreToCamelCase" value="false"/>--><!--<setting name="localCacheScope" value="STATEMENT"/>--><!--<setting name="jdbcTypeForNull" value="OTHER"/>--><!--<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>--><!--<setting name="logImpl" value="STDOUT_LOGGING" />--></settings><typeAliases></typeAliases><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><!--默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果--><!--如果某些查询数据量非常大,不应该允许查出所有数据--><property name="pageSizeZero" value="true"/></plugin></plugins><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://10.59.97.10:3308/windty"/><property name="username" value="windty_opr"/><property name="password" value="windty!234"/></dataSource></environment></environments><databaseIdProvider type="DB_VENDOR"><property name="MySQL" value="mysql" /><property name="Oracle" value="oracle" /></databaseIdProvider><mappers><!--这边可以使用package和resource两种方式加载mapper--><!--<package name="包名"/>--><!--<mapper resource="./mappers/SysUserMapper.xml"/>--><mapper resource="./mappers/CbondissuerMapper.xml"/></mappers>

下面是解析配置文件的核心方法:

try {//issue #117 read properties first//解析properties标签,并set到Configration对象中//在properties配置属性后,在Mybatis的配置文件中就可以使用${key}的形式使用了。propertiesElement(root.evalNode("properties"));//解析setting标签的配置Properties settings = settingsAsProperties(root.evalNode("settings"));//添加vfs的自定义实现,这个功能不怎么用loadCustomVfs(settings);//配置类的别名,配置后就可以用别名来替代全限定名//mybatis默认设置了很多别名,参考附录部分typeAliasesElement(root.evalNode("typeAliases"));//解析拦截器和拦截器的属性,set到Configration的interceptorChain中//MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括://Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)//ParameterHandler (getParameterObject, setParameters)//ResultSetHandler (handleResultSets, handleOutputParameters)//StatementHandler (prepare, parameterize, batch, update, query)pluginElement(root.evalNode("plugins"));//Mybatis创建对象是会使用objectFactory来创建对象,一般情况下不会自己配置这个objectFactory,使用系统默认的objectFactory就好了objectFactoryElement(root.evalNode("objectFactory"));objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));reflectorFactoryElement(root.evalNode("reflectorFactory"));//设置在setting标签中配置的配置settingsElement(settings);//解析环境信息,包括事物管理器和数据源,SqlSessionFactoryBuilder在解析时需要指定环境id,如果不指定的话,会选择默认的环境;//最后将这些信息set到Configration的Environment属性里面environmentsElement(root.evalNode("environments"));//databaseIdProviderElement(root.evalNode("databaseIdProvider"));//无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。解析typeHandler。typeHandlerElement(root.evalNode("typeHandlers"));//解析MappermapperElement(root.evalNode("mappers"));
} catch (Exception e) {throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}

0

上面解析流程结束后会生成一个Configration对象,包含所有配置信息,然后会创建一个SqlSessionFactory对象,这个对象包含了Configration对象。

简单总结

对于MyBatis启动的流程(获取SqlSession的过程)这边简单总结下:

  • SqlSessionFactoryBuilder解析配置文件,包括属性配置、别名配置、拦截器配置、环境(数据源和事务管理器)、Mapper配置等;解析完这些配置后会生成一个Configration对象,这个对象中包含了MyBatis需要的所有配置,然后会用这个Configration对象创建一个SqlSessionFactory对象,这个对象中包含了Configration对象;

这里解析的东西比较多,大致概况:会把所有的信息都解析到Configration对象中,比较简单不多介绍。

文档:MyBatis的二级缓存原理分析(请暂时关注解析缓存内容)

链接:http://note.youdao.com/noteshare?id=b97d399a65e31008fef704164d24c784&sub=wcp1596698664968348

文档:Mybatis解析动态sql原理分析

链接:http://note.youdao.com/noteshare?id=8b076e28061434f6693d99401d3ed400&sub=D948A34AA06045AEB7A01733A98A4C06

文档:Mybatis-设计模式总结.note

链接:http://note.youdao.com/noteshare?id=4975cd9e83f1e73e14a369598a232abe&sub=5D52C27921074712B1AB91C9A72455C0

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

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

相关文章

负公差轧钢测径仪 多规格可定制 普通智能随意选择

负公差轧制的意义&#xff1a; 轧钢厂生产的螺纹钢是按理论重量销&#xff0c;因此稳定的高负差产品极具市场竞争力。负差率即实际重量与理论重量的差值&#xff0c;除以理论重量&#xff0c;乘100%。以螺纹12为例&#xff0c;不按负差生产&#xff0c;在坯重2450kg的情况下&am…

通过Workstation工具制作CentOS8虚拟机模板

通过Workstation工具制作CentOS8虚拟机模板 1. 需求说明2. 安装模板虚拟机3. 配置模板虚拟机 1. 需求说明 说明&#xff1a;在做集群实验过程中&#xff0c;需要创建多台虚拟机&#xff0c;如果逐台安装虚拟机&#xff0c;很消耗时间&#xff0c;所以最简洁的办法就是通过模板克…

【无标题】通用工作站设计方案:ORI-D3R600服务器-多路PCIe3.0的双CPU通用工作站

ORI-D3R600服务器-多路PCIe3.0的双CPU通用工作站 一、机箱功能和技术指标&#xff1a; 系统 系统型号 ORI-SR630 主板支持 EEB(12*13)/CEB(12*10.5)/ATX(12*9.6)/Micro ATX 前置硬盘 最大支持8个3.5寸(兼容25寸)SATA硬盘 2*2.5(后置) 电源类型 CRPS元余电源&#xff0…

Python开源项目CodeFormer——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践

无论是自己、家人或是朋友、客户的照片&#xff0c;免不了有些是黑白的、被污损的、模糊的&#xff0c;总想着修复一下。作为一个程序员 或者 程序员的家属&#xff0c;当然都有责任满足他们的需求、实现他们的想法。除了这个&#xff0c;学习了本文的成果&#xff0c;或许你还…

JAVA毕业设计110—基于Java+Springboot+Vue的房屋租赁系统小程序(源码+数据库)

基于JavaSpringbootVue的房屋租赁系统小程序(源码数据库)110 一、系统介绍 本系统前后端分离 本系统分为用户、房东、超级管理员三种角色 1、用户&#xff1a; 登录、注册、房屋搜索、房屋收藏、看房预约、租房申请、租房记录、看房记录、收藏记录、我的消息、个人信息修改…

Center Smoothing Certified Robustness for Networks with Structured Outputs

文章目录 Center Smoothing: Certified Robustness for Networks with Structured OutputsSummaryResearch ObjectiveProblem StatementMethodsEvaluationConclusionNotesGaussian Smoothing常用希腊字母霍夫丁不等式&#xff08;Hoeffdings inequality&#xff09;1.简述2.霍夫…

java入门, 记录检测网络

一、需求 在开发中&#xff0c;我们经常需要本地连接服务器&#xff0c;或者数据库这些机器或者组件&#xff0c;但是有时候网络不通&#xff0c;我们怎样检测&#xff0c;除了ping 和 telnet 还需要那些常用的技能。 二、检测网络 1、一般我们先ping一些需要连接的网络ip 或…

docker命令大全

1、查看Docker 容器占用的空间 docker ps -s2、查看所有容器 docker ps -a3、启动、关闭、重启一个已存在的容器 docker start <容器ID> docker stop <容器ID> docker restart <容器ID> 4、进入容器&#xff0c;退出终端的时候不会关闭container的ma…

uniapp项目笔记

1.生成二维码 import uqrCode from /static/erweima.js uqrCode.make({canvasId: qrcode,componentInstance: this,text: JSON.stringify(item.id),size: 150,margin: 0,backgroundColor: #ffffff,foregroundColor: #000000,fileType: jpg,errorCorrectLevel: uqrCode.errorCor…

力扣 225. 用队列实现栈(C语言实现)

目录 1.解题思路2.代码实现 1.解题思路 这道题如果使用C会好写的多&#xff0c;因为可以使用C提供的队列来实现&#xff0c;但如果使用C语言则必须手写一个队列来实现&#xff0c;在这里我用了我前面文章中实现好的队列来解答&#xff0c;首先因为队列是先进先出&#xff0c;而…

海康G5系列(armv7l) heop模式下交叉编译Qt qmqtt demo,出现moc缺少高版本GLibc问题之解决

1.编辑源 sudo vi /etc/apt/sources.list 2.添加高版本的源 deb http://th.archive.ubuntu.com/ubuntu jammy main #添加该行到文件 3.运行升级 sudo apt update sudo apt install libc6 4.strings /**/libc.so.6 |grep GLIBC_ 参考链接&#xff1a;version GLIBC_2.3…

医疗行业创新:低代码工具推动业务自动化和智能化

随着科技的不断发展&#xff0c;数字化已经成为各个领域的必然趋势。同样&#xff0c;在医疗领域&#xff0c;数字化转型也已经成为必要性。 早在新冠疫情之前很多国家和地区就已经开始尝试医疗数字化的转型。有很多人认为&#xff0c;医疗数字化在未来不是锦上添花&#xff0…

目标检测——Yolo系列(YOLOv1/2/v3/4/5/x/6/7/8)

目标检测概述 什么是目标检测&#xff1f; 滑动窗口&#xff08;Sliding Window&#xff09; 滑动窗口的效率问题和改进 滑动窗口的效率问题&#xff1a;计算成本很大 改进思路 1&#xff1a;使用启发式算法替换暴力遍历 例如 R-CNN&#xff0c;Fast R-CNN 中使用 Selectiv…

swagger精度丢失,postman调用正常,dameng数据库,long类型字段

问题出现 我们目前在迁移环境&#xff0c;然后往另带一个公司提供的框架里面迁移&#xff0c;然后就出现了很多问题&#xff0c;一个问题是我们返回的某个列表数据&#xff0c;在使用postman 的时候调用正常&#xff0c;但是当前端在制作页面的时候出现问题&#xff0c;并且sw…

mysql数据库可以执行定时任务

在一些业务需要中&#xff0c;经常需要一些定时任务。如Java的schedule&#xff0c;nodejs的node-schedule等。今天第一次接触了使用数据库的存储过程来执行定时任务。 本篇文章以MySQL数据库为例&#xff0c;介绍通过数据库设置定时任务的方法。本文中以介绍操作过程为主&…

蓝桥杯 冒泡排序

冒泡排序的思想 冒泡排序的思想是每次将最大的一下一下移动到最右边&#xff0c;然后将最右边这个确定下来。 再来确定第二大的&#xff0c;再确定第三大的… 对于数组a[n]&#xff0c;具体来说&#xff0c;每次确定操作就是从左往右扫描&#xff0c;如果a[i]>a[i1],我们将…

山西电力市场日前价格预测【2023-11-15】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-15&#xff09;山西电力市场全天平均日前电价为237.36元/MWh。其中&#xff0c;最高日前电价为360.45元/MWh&#xff0c;预计出现在00:15。最低日前电价为0.00元/MWh&#xff0c;预计出…

vColorPicker与vue3-colorPicker——基于 Vue 的颜色选择器插件

文章目录 前言样例特点 一、使用步骤&#xff1f;1. 安装2.引入3.在项目中使用 vcolorpicker 二、选项三、事件四、问题反馈问题所在安装引入例子效果图 前言 vColorPicker——官网 vColorPicker——GitHub 样例 vColorPicker是基于 Vue 的一款颜色选择器插件&#xff0c;仿照…

SAP:解决函数CONNE_IMPORT_WRONG_COMP_DECS CX_SY_IMPORT_MISMATCH_ERROR错误

用户反馈报表中取数异常&#xff0c;经检查发现SE37执行取数函数ZLY_R_CWFX03报以下错误。 Category ABAP Programming Error Runtime Errors CONNE_IMPORT_WRONG_COMP_DECS Except. CX_SY_IMPORT_MISMATCH_ERROR ABAP Program ZLY_R_CWFX03FT Application Component Not Assig…

【论文阅读】(VAE)Auto-Encoding Variational Bayes

论文地址&#xff1a;[1312.6114] Auto-Encoding Variational Bayes (arxiv.org) 【前言】&#xff1a;VAE模型是Kingma(也是Adam的作者)大神在2014年发表的文章&#xff0c;是一篇非常非常经典&#xff0c;且实现非常优雅的生成模型&#xff0c;同时它还为bayes概率图模型难以…