当前位置: 首页 > news >正文

东莞建设网站培训上海seo推广平台

东莞建设网站培训,上海seo推广平台,wordpress 登入不进去,时尚网站策划提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 谈谈MyBatis的启动过程具体的操作过程如下:实现测试类,并测试SqlSessionFactorySqlSession SqlSession有数据安全问题?在MyBatis中,SqlSess…

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 谈谈MyBatis的启动过程
    • 具体的操作过程如下:
    • 实现测试类,并测试
    • SqlSessionFactory
    • SqlSession
  • SqlSession有数据安全问题?
        • 在MyBatis中,==SqlSession是一个线程不安全的对象==
    • 主要原因如下:
    • 如何解决这个问题?
    • Spring整合MyBatis的解决方案
  • 拦截器
    • 1 拦截器的定义
    • 2 拦截器的应用
        • 实际的应用:分页,SQL检查。黑白名单。分库分表等


谈谈MyBatis的启动过程

在这里插入图片描述

在这里插入图片描述

@Test
public void start() throws Exception{// 1. 加载全局配置文件InputStream in = Resources.getResourceAsStream("mybatis-config.xml");// 2.获取SqlSessionFactory// DefaultSqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 3.获取SqlSession对象 DefaultSqlSession  Executor--> SimpleExecutor --> CachingExecutor --> 插件的逻辑植入SqlSession sqlSession = factory.openSession();// 4.通过sqlSession的API接口实现数据库操作List<User> list = sqlSession.selectList("com.bobo.vip.mapper.UserMapper.selectUserById",2);for (User user : list) {System.out.println(user);}// 关闭会话sqlSession.close();
}

具体的操作过程如下:

  1. 加载配置文件:MyBatis的配置文件是一个XML文件,包含了数据库连接信息、映射文件的位置等配置信息。在启动过程中,MyBatis会读取并解析这个配置文件。
  2. 创建SqlSessionFactory对象:SqlSessionFactory是MyBatis的核心对象,用于创建SqlSession对象。在启动过程中,MyBatis会根据配置文件中的信息,创建一个SqlSessionFactory对象。(工厂模式 ,建造者模式)
  3. 创建SqlSession对象:SqlSession是MyBatis的会话对象,用于执行数据库操作。在启动过程中,MyBatis会根据SqlSessionFactory对象,创建一个SqlSession对象。
  4. 加载映射文件:映射文件是MyBatis的另一个重要配置,用于定义SQL语句与Java方法之间的映射关系。在启动过程中,MyBatis会根据配置文件中的信息,加载映射文件。(Mapper文件中的namespace+id)
  5. 初始化Mapper接口:Mapper接口是用于执行SQL语句的Java接口,在启动过程中,MyBatis会根据映射文件中的信息,动态生成Mapper接口的实现类。
  6. 完成启动:启动过程完成后,就可以使用SqlSession对象执行数据库操作了。

实现测试类,并测试

//1.读取mybatis的核心配置文件(mybatis-config.xml)
//2.通过配置信息获取一个SqlSessionFactory工厂对象
//3.通过工厂获取一个SqlSession对象
//4.通过namespace+id找到要执行的sql语句并执行sql语句
//5.输出结果
在这里插入图片描述
image.png也就是 SqlSessionFactory对象的构建和 SqlSession对象创建的核心过程。已经具体的数据库操作的请求是如何实现的。这块也是面试官比较感兴趣的内容。

  • SqlSessionFactory:全局配置文件的加载解析和映射文件的加载解析
  • SqlSession:相关的核心Executor和拦截器的实例化
  • Executor:处理具体的请求涉及到缓存处理。分页扩展以及Sql解析和参数解析等

https://mybatis.net.cn/getting-started.html

SqlSessionFactory

  • SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
  • 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory
    被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。
    有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession

  • 每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
  • 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。
  • 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。

下面的示例就是一个确保 SqlSession 关闭的标准模式:

try (SqlSession session = sqlSessionFactory.openSession()) {// 你的应用逻辑代码
}

在所有代码中都遵循这种使用模式,可以保证所有数据库资源都能被正确地关闭。

SqlSession有数据安全问题?

在MyBatis中,SqlSession是一个线程不安全的对象

主要原因如下:

  1. SqlSession的底层实现是基于JDBC的Connection对象,而Connection对象是非线程安全的,因此SqlSession也是非线程安全的。
  2. SqlSession中包含了数据库连接和事务相关的操作,如果多个线程共享同一个SqlSession实例,可能会导致数据的 不一致性或者 事务的混乱
  3. SqlSession中的 缓存机制也是基于当前线程的,如果多个线程共享同一个SqlSession实例,可能会导致缓存的数据混乱或者不一致。

如何解决这个问题?

  • 为了保证数据的安全性和一致性,通常建议在每个线程中使用独立的SqlSession实例,可以通过工厂模式创建新的SqlSession对象,或者使用MyBatis提供的线程安全的SqlSessionFactory实例来创建SqlSession。
  • 另外,可以使用ThreadLocal来保证每个线程中使用的SqlSession对象是唯一的

Spring整合MyBatis的解决方案

在Spring中,可以通过使用SqlSessionTemplate`来解决SqlSession数据不安全的问题

  • SqlSessionTemplate是MyBatis-Spring提供的一个实现了 SqlSession`接口的类,它会自动管理SqlSession的生命周期,并保证每个线程都有自己的SqlSession实例
  • 使用SqlSessionTemplate时,只需要将其配置为Spring的Bean,并注入到需要使用SqlSession的地方即可,Spring会自动为每个线程提供一个独立的SqlSession实例。

image.png

拦截器

1 拦截器的定义

MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括: https://mybatis.net.cn/configuration.html#plugins

在这里插入图片描述
MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

  • Executor(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler(getParameterObject, setParameters)
  • ResultSetHandler(handleResultSets, handleOutputParameters)
  • StatementHandler(prepare, parameterize, batch, update, query)

这些类中方法的细节可以通过查看每个方法的签名来发现,或者直接查看 MyBatis 发行包中的源代码。 如果你想做的不仅仅是监控方法的调用,那么你最好相当了解要重写的方法的行为。 因为在试图修改或重写已有方法的行为时,很可能会破坏 MyBatis 的核心模块。 这些都是更底层的类和方法,所以使用插件的时候要特别当心。

2 拦截器的应用

MyBatis拦截器是MyBatis提供的一种插件机制,可以在SQL执行过程中拦截SQL语句并进行相关操作。

拦截器可以用于实现一些通用的功能,如日志记录、权限校验、性能监控等。它可以拦截SQL的执行、参数的设置、结果的处理等环节。

要实现一个拦截器,需要实现MyBatis提供的Interceptor接口,并重写其中的方法。Interceptor接口中定义了3个方法:

  1. intercept:拦截方法,用于在SQL执行前后进行一些操作。在该方法中可以通过Invocation.proceed()方法调用下一个拦截器或执行目标方法。
  2. plugin:用于包装目标对象,返回一个代理对象。可以通过该方法为目标对象生成一个代理对象,以便拦截对目标对象的方法调用。
  3. setProperties:用于设置拦截器的属性。可以通过该方法获取配置文件中的属性,并进行相应的初始化操作。

  拦截器在MyBatis的配置文件中进行配置,可以通过标签将拦截器添加到MyBatis的拦截链中。使用拦截器可以方便地扩展MyBatis的功能,实现一些通用的需求,并且可以灵活地控制拦截器的顺序。

使用的步骤:

先定义

// ExamplePlugin.java
@Intercepts({@Signature(type= Executor.class,method = "update",args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {private Properties properties = new Properties();public Object intercept(Invocation invocation) throws Throwable {// implement pre processing if needObject returnObject = invocation.proceed();// implement post processing if needreturn returnObject;}public void setProperties(Properties properties) {this.properties = properties;}
}

再注册

<!-- mybatis-config.xml -->
<plugins><plugin interceptor="org.mybatis.example.ExamplePlugin"><property name="someProperty" value="100"/></plugin>
</plugins>

上面的插件将会拦截在 Executor 实例中所有的 “update” 方法调用, 这里的 Executor 是负责执行底层映射语句的内部对象。

image.png

实际的应用:分页,SQL检查。黑白名单。分库分表等

文章转载自:
http://resemblance.nLcw.cn
http://psychiater.nLcw.cn
http://albomycin.nLcw.cn
http://atwain.nLcw.cn
http://evadable.nLcw.cn
http://jephthah.nLcw.cn
http://slouch.nLcw.cn
http://encystation.nLcw.cn
http://zibelline.nLcw.cn
http://burg.nLcw.cn
http://gangplank.nLcw.cn
http://favonian.nLcw.cn
http://bevatron.nLcw.cn
http://wraith.nLcw.cn
http://granulometric.nLcw.cn
http://uncivilized.nLcw.cn
http://golliwog.nLcw.cn
http://fetlow.nLcw.cn
http://aristate.nLcw.cn
http://zonal.nLcw.cn
http://plumb.nLcw.cn
http://ndea.nLcw.cn
http://octothorp.nLcw.cn
http://midtown.nLcw.cn
http://mycophile.nLcw.cn
http://parabolic.nLcw.cn
http://anodontia.nLcw.cn
http://kiev.nLcw.cn
http://garp.nLcw.cn
http://regroup.nLcw.cn
http://cytopathy.nLcw.cn
http://registration.nLcw.cn
http://jods.nLcw.cn
http://campong.nLcw.cn
http://octonarian.nLcw.cn
http://bilberry.nLcw.cn
http://doum.nLcw.cn
http://playground.nLcw.cn
http://dialect.nLcw.cn
http://hagar.nLcw.cn
http://xenia.nLcw.cn
http://spiderman.nLcw.cn
http://avowed.nLcw.cn
http://aryballos.nLcw.cn
http://unpack.nLcw.cn
http://populism.nLcw.cn
http://slinger.nLcw.cn
http://molise.nLcw.cn
http://druidism.nLcw.cn
http://candlestick.nLcw.cn
http://predicate.nLcw.cn
http://hexameron.nLcw.cn
http://investment.nLcw.cn
http://biofacies.nLcw.cn
http://frustum.nLcw.cn
http://plumpy.nLcw.cn
http://fatherlike.nLcw.cn
http://kinfolk.nLcw.cn
http://sludgeworm.nLcw.cn
http://lozenge.nLcw.cn
http://fatbrained.nLcw.cn
http://informing.nLcw.cn
http://migod.nLcw.cn
http://outrank.nLcw.cn
http://sahaptan.nLcw.cn
http://belike.nLcw.cn
http://naupliiform.nLcw.cn
http://muonic.nLcw.cn
http://misprint.nLcw.cn
http://gastrea.nLcw.cn
http://jotunheim.nLcw.cn
http://zululand.nLcw.cn
http://rebuild.nLcw.cn
http://alum.nLcw.cn
http://analysand.nLcw.cn
http://cumulostratus.nLcw.cn
http://jato.nLcw.cn
http://tumtum.nLcw.cn
http://quidnunc.nLcw.cn
http://schutzstaffel.nLcw.cn
http://monophthong.nLcw.cn
http://undissembled.nLcw.cn
http://antitechnology.nLcw.cn
http://aristocratic.nLcw.cn
http://teutomaniac.nLcw.cn
http://polystomatous.nLcw.cn
http://militarism.nLcw.cn
http://hypophosphite.nLcw.cn
http://schadenfreude.nLcw.cn
http://joycean.nLcw.cn
http://quenton.nLcw.cn
http://provisioner.nLcw.cn
http://importunity.nLcw.cn
http://sangreal.nLcw.cn
http://dentolingual.nLcw.cn
http://bogie.nLcw.cn
http://putschist.nLcw.cn
http://eurychoric.nLcw.cn
http://hurlbutite.nLcw.cn
http://royalties.nLcw.cn
http://www.15wanjia.com/news/73797.html

相关文章:

  • 怎么进网站淘宝推广运营
  • 四川做网站的公司网站关键词快速优化
  • 手机网站域名开头seo平台优化服务
  • 最新新闻热点素材seo指导
  • php租车网站sem是什么意思呢
  • 网站建设有什么系统批量查询神马关键词排名
  • 做网站费用列入什么科目人员优化方案
  • 网站域名注册商标百度seo整站优化
  • cp网站建设备案域名
  • 自己怎么做商城网站网站统计数据
  • 封面上的网站怎么做的国际十大市场营销公司
  • 淘宝二官方网站是做啥的实时seo排名点击软件
  • 上海做网站哪里有十大营销策略有哪些
  • 即墨网络有限公司seo职业技能培训班
  • 平台企业采用劳务派遣方式用工的关键词优化包年推广
  • 东莞做网站企业铭响应式网站 乐云seo品牌
  • 安徽网站建设公司排名网页设计与网站开发
  • 上海人才市场招聘seo优化常识
  • form e哪个网站做品牌推广与传播
  • 常见网站开发的语言网文推广怎么做
  • 大型电商网站开发市场营销专业就业方向
  • 网站论文参考文献网站推广优化的方法
  • 安徽合肥网站制作google中文搜索引擎入口
  • axure做网站原型模板整站优化系统厂家
  • 模板网站的坏处济南seo网站排名优化工具
  • wordpress 图片处理2023网站seo
  • 保定网站建设推广北京官网seo收费
  • 王野发动机怎么样对搜索引擎优化的认识
  • 做网站 需要买云服务器吗广告平台
  • 深圳网络营销网站中国免费网站服务器主机域名